0

Rails: 3.2.11 Ruby: 1.8.7 データベース: Postgres

次のような 100 万件のエントリを検索するために ILIKE を使用するカスタムメイドの検索エンジンがあります。

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. 検索に「で始まる」と「で終わる」が含まれる場合は、2 つの「で始まる」検索 (1 つは逆の値) に変換し、逆の値にもインデックスを付けることができます。

  3. pg_trgm および GIN インデックスを使用することもできますが、これらはそれほど選択的ではなく、多数の誤検知を生成するため、他の方法を可能な限り使用した場合は、これを使用する必要があります。たとえば、「検索」は、トリグラム単位で「ウニ アーク」と重複します。

于 2013-05-24T14:21:37.990 に答える