0

これは私のスタックです:

  • Rails 3.2.6
  • MongoID〜> 2.5
  • タイヤ0.4.2
  • ElasticSearchサーバー

ElasticSearchでインデックスを作成したい商品が数千あります。これは私のマッピングです:

mapping do
    indexes :name, analyzer: 'snowball', boost: 100
    indexes :description, analyzer: 'snowball'
end 

残念ながら、検索結果は信じられないほど悪いです。「club-mate」を検索すると、最初の結果は「club-mate-c」になります。そして2番目の結果は「クラブメイト」です。「クラブメイト」が「クラブメイト」に最適ではないのはなぜですか。検索結果は_score順に並べられています。他には何もありません。

どんなフィードバックにも感謝します。設定の問題だと思います。

4

1 に答える 1

2

インデックスを作成しているデータ、データの均一性、またはデータのクエリ方法に関する情報はほとんど提供されていません。

考えられる問題は、用語clubmateがデータセット内であまり一般的ではなく、シャード全体に不均一に分散していることです。

デフォルトでは、頻度という用語はシャードごとに個別に考慮されるため、1つのシャードclubmate3回、別のシャードに1回ある場合club、 2番目のシャードは最初のシャードよりも関連性が高いと見なす可能性があります。matecclubmate

通常、大量のデータを使用すると、用語の頻度自体が均等になるため、これは問題になりません。ただし、少量のデータでは、このような問題が発生する可能性があります。

ソリューション:

  • デフォルトの5の代わりに単一のシャードを使用します(常に少量のデータを使用する場合は、これがより適切なオプションです)
  • より多くのデータにインデックスを付ける
  • 検索パラメータに追加search_type=dfs_query_then_fetchします。これにより、クエリを実行する前に、すべてのシャードで用語の頻度がチェックされます。

注:search_typeデフォルトでは、query_then_fetchではなくになっています。これdfs_query_then_fetchは、通常、期間の頻度を均等にするのに十分なデータがあり、パフォーマンスが向上するためです。

検索パラメータに追加explain=1して、各ドキュメントのスコアがどのように計算されたかを確認できます。これにより、問題がより明確になります。

于 2012-09-21T08:44:48.587 に答える