の結果を返します。 「戦い」の結果を返しますが、「戦闘」の結果は無視します。 「乗組員」を検索すると「乗組員」の検索結果が返されますが、「乗組員」の検索結果は「乗組員」の検索結果も無視されます。Elasticsearchは...私は、クエリ文字列検索で雪だるまアナライザを使用しています茎の単語
何が起こっているのですか?
の結果を返します。 「戦い」の結果を返しますが、「戦闘」の結果は無視します。 「乗組員」を検索すると「乗組員」の検索結果が返されますが、「乗組員」の検索結果は「乗組員」の検索結果も無視されます。Elasticsearchは...私は、クエリ文字列検索で雪だるまアナライザを使用しています茎の単語
何が起こっているのですか?
ステミングは、インデックス時間とクエリ時間の両方に適用すると意味があります。これで、クエリ時にそれを適用するので、クエリの一部である単語のステムを検索できます。 しかし、インデックス時にステミングを適用していないので、インデックスにはステムが含まれていないと思います。クエリにフィールド名を指定していないか、query_stringでサポートされているdefault_field
(またはfields
)属性を使用していないため、_all
フィールドで実際に検索しています。 _all
フィールドは、デフォルトでStandardAnalyzer
を使用して解析されます。
この問題を解決する方法はいくつかあります。個人的には、クエリで検索したいフィールドのセットを決定し、マッピングにステミングを適用します。その後、検索対象のフィールドの設定済みアナライザが使用されるため、クエリにアナライザを指定する必要はありません。
答えが十分明確であるかどうかを教えてください。
それはたくさんの意味があります。しかし、クエリと完全に一致するアイテムを無視するのはなぜですか? (つまり、「戦闘」の検索では「戦闘」というタイトルの記事は返されませんが、「戦い」というタイトルの記事が返されます) – concept47
質問にステミングを適用すると戦闘になるためです。あなたは本当に戦う代わりに戦いを探しています。 ;) – javanna
これは、私がインデックスにステマーを使用したとしても、私の問題が存在することを意味していますか?どのように私はそれが茎の単語と実際のクエリの両方で検索を行うようにするのですか?スフィンクスはこれを自動的に行います。ここでは実装に驚いています – concept47
@javannaが正しい方向に向いてくれてくれてありがとう。 _all
フィールドのアナライザーをsnowball
に設定して解決しました。詳細は、this docを参照してください。
私はRubyのタイヤ宝石を使用している、と私は次のように私のモデルにマッピングを指定することができました:
mapping(_all: { analyzer: 'snowball' }) do
indexes :id, type: 'integer'
indexes :description
indexes :name, boost: 10
end
私は正確に元の質問のように私のクエリをフォーマットされました。
解決しましたか?私の答えが役に立つかどうか分かりますか? – javanna
私はデフォルトのアナライザーをスノーボールに設定しましたが、それは世話をしましたが、私は依然としてクエリ文字列に設定するだけでは機能しませんでした。 1つのケース(既定のアナライザーがスノーボールに設定されている)で戦う検索が実際に「戦い」ポストを引き上げるが、他のもの(クエリ文字列で指定する)はそうではないインデックス作成方法はどのように異なるのですか? – concept47
私の答えに書いたように、クエリ時にのみステミングを適用すると、索引付け中に茎のない茎が検索されてしまいます。あなたが解決してうれしい! – javanna