0

Rails:3.2.11 Ruby:1.8.7 数据库:Postgres

我有一个定制的搜索引擎,它使用 ILIKE 在 100 万个条目中进行搜索,如下所示:

formatted_query_string = '%this%search%string'
like_variable = "ILIKE"

product_feed_query_line = [
  "name " + like_variable, formatted_query_string, " OR", 
  "description " + like_variable, formatted_query_string, " OR", 
  "category = ", formatted_query_string
    ].join(" ")

@product_feed_products = FeededProduct.where(product_feed_query_line).where(:is_available => true).paginate(:page => params[:page], :per_page => 18)  

该数据库具有以下索引schema.rb

  add_index "feeded_products", ["name", "description", "category"], :name => "name"

这在数据库中处理大约需要 4.5 秒,这显然很多。但是根据数据集(1M),它是否长得不合理

我知道完全更改为不同的搜索引擎对未来来说是个好主意,但在我花时间学习之前,我需要知道是否有什么我应该做的以加快速度,或者这种类型的请求就是这么慢。

4

1 回答 1

0

我知道您说您通过聘请顾问解决了这个问题,但对于后代,我认为可能值得在这里给出答案。

SELECT * FROM foo WHERE bar like '%search%' 

默认情况下将无法使用索引,因此您有多种选择。

  1. 重新评估您的搜索模式。您可以合理地将多少“包含”搜索转换为“开始于”?

  2. 如果您的搜索涉及开头和结尾,您可以转换为两个开头搜索(一个在反转值上),并索引反转值。

  3. 您也可以使用 pg_trgm 和 GIN 索引,但这些索引不是那么有选择性,并且会产生许多误报,所以当您尽可能地采用其他方法时,这就是您要去的地方。例如“搜索”重叠、trigram-wise、“海胆弧”

于 2013-05-24T14:21:37.990 回答