6

クエリ文字列検索でスノーボールアナライザーを使用しています...

   "query" : {
      "query_string" : {
        "query" : the-query-string-goes-here,
        "default_operator" : "AND",
        "analyzer" : "snowball"
      }
    }

これは実際には機能しますが、何か奇妙なことをします...「fighting」を検索すると「fight」の結果が返されますが、「fighting」の結果は無視されます。「乗組員」を検索すると「乗組員」の結果は返されますが、「乗組員」は返されません。また、「乗組員」を検索すると「乗組員」の結果も無視されます...

誰が何が起こっているのか知っていますか?

4

2 に答える 2

11

ステミングは、インデックス時とクエリ時の両方に適用すると意味があります。これをクエリ時に適用して、クエリの一部である単語の語幹を検索します。しかし、インデックス時にステミングを適用していないため、インデックスにはステムが含まれていないと思います。クエリでも、query_string でサポートされている(または) 属性_allを使用してもフィールド名を指定しなかったため、実際にはフィールドを検索しています。フィールドは、デフォルトで を使用して分析されます。default_fieldfields_allStandardAnalyzer

この問題を解決するにはさまざまな方法があります。クエリで検索する一連のフィールドを個人的に決定し、マッピングに由来するそれらに適用します。その後、検索対象のフィールド用に構成されたアナライザーが使用されるため、クエリでアナライザーを指定する必要はありません。

答えが十分に明確かどうか教えてください。

于 2012-09-07T09:39:19.860 に答える
2

正しい方向に向けてくれた@javannaに感謝します。_allフィールドのアナライザーを に設定することでこれを解決しましたsnowball。詳細については、このドキュメントを参照してください。

Ruby Tire gem を使用しており、モデルで次のようにマッピングを指定できました。

mapping(_all: { analyzer: 'snowball' }) do
  indexes :id, type: 'integer'
  indexes :description
  indexes :name, boost: 10
end

元の質問とまったく同じようにクエリをフォーマットしました。

于 2013-02-10T20:14:03.977 に答える