【问题标题】:Most efficient way to combine Solr results with MySQL data将 Solr 结果与 MySQL 数据相结合的最有效方法
【发布时间】:2013-02-19 14:30:28
【问题描述】:

在我们的新网站(购物网站)上,我们将使用 Solr 作为我们网站的搜索引擎。在 Solr 索引中,我们保留了产品 ID 列表和每个产品的关键字列表。搜索查询是针对关键字进行的。

Solr 返回产品 ID 列表。然后将这些 id 插入到 MySQL 查询中以从数据库中选择所有产品数据。 MySQL 还处理结果的排序。例如,MySQL 查询可能如下所示:

SELECT * FROM product WHERE id IN (1,4,42,32,46,...,39482) ORDER BY price ASC

我们在网站上有大约 100,000 种产品。当有几千个结果时,此方法工作正常,但当有 - 例如 - 50,000 个结果时,此方法会变得很慢。

我的假设是瓶颈是“WHERE IN”子句。一个长期的解决方案是将所有产品数据移动到 Solr,以便它可以处理结果排序并将优化过滤器应用于搜索(例如,也许用户只想查看某个价格范围内的产品)。但是,我们对 Solr 缺乏经验,需要短期修复才能实施。

一种选择是在短期内放弃 Solr,将关键字存储在 MySQL 的表中,并使用 FULL-TEXT 搜索对此进行搜索。

我是否缺少其他选项?

【问题讨论】:

  • 你能创建一个VIEW吗?
  • 不是从 select 语句创建的 VIEW 吗?我不知道如何使用 Solr 查询的结果来创建视图。 Solr 返回一个产品 ID 数组。

标签: mysql solr


【解决方案1】:

您的主要问题是 Solr 将返回按匹配关键字数量排序的结果,但您希望结果按价格排序。正如您正确提到的,将所有数据移至 Solr 是最佳选择 - 您会非常高兴 Solr 满足您的搜索、排序、分面和分页需求。

然而,就短期而言,将price 字段添加到 Solr 将是非常值得的。当您收到类似tooth paste 的搜索查询时,您可以发出类似的 Solr 查询

q=keywords:(tooth AND paste)&rows=10&fl=id&sort=price%20asc

只获取前10个结果,然后通过指定start参数进行分页,如:

q=keywords:(tooth AND paste)&rows=10&start=10&fl=id&sort=price%20asc

【讨论】:

  • 您可以在 SOLR 中使用全文搜索,将 schema.xml 中的字段类型更改为 <field name="keywords" type="text_en_splitting" stored="true" indexed="true"/>
猜你喜欢
  • 2013-07-15
  • 1970-01-01
  • 1970-01-01
  • 2017-10-19
  • 1970-01-01
  • 1970-01-01
  • 2016-12-03
  • 2017-04-28
  • 2010-09-28
相关资源
最近更新 更多