3

在我们的新网站(一个购物网站)上,我们将使用 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 搜索对此进行搜索。

我错过了任何其他选择吗?

4

1 回答 1

6

您的主要问题是 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
于 2013-02-19T15:21:05.820 回答