2012-09-07 11 views
6

の結果を返します。 「戦い」の結果を返しますが、「戦闘」の結果は無視します。 「乗組員」を検索すると「乗組員」の検索結果が返されますが、「乗組員」の検索結果は「乗組員」の検索結果も無視されます。Elasticsearchは...私は、クエリ文字列検索で雪だるまアナライザを使用しています茎の単語

何が起こっているのですか?

+0

解決しましたか?私の答えが役に立つかどうか分かりますか? – javanna

+0

私はデフォルトのアナライザーをスノーボールに設定しましたが、それは世話をしましたが、私は依然としてクエリ文字列に設定するだけでは機能しませんでした。 1つのケース(既定のアナライザーがスノーボールに設定されている)で戦う検索が実際に「戦い」ポストを引き上げるが、他のもの(クエリ文字列で指定する)はそうではないインデックス作成方法はどのように異なるのですか? – concept47

+0

私の答えに書いたように、クエリ時にのみステミングを適用すると、索引付け中に茎のない茎が検索されてしまいます。あなたが解決してうれしい! – javanna

答えて

11

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

この問題を解決する方法はいくつかあります。個人的には、クエリで検索したいフィールドのセットを決定し、マッピングにステミングを適用します。その後、検索対象のフィールドの設定済みアナライザが使用されるため、クエリにアナライザを指定する必要はありません。

答えが十分明確であるかどうかを教えてください。

+0

それはたくさんの意味があります。しかし、クエリと完全に一致するアイテムを無視するのはなぜですか? (つまり、「戦闘」の検索では「戦闘」というタイトルの記事は返されませんが、「戦い」というタイトルの記事が返されます) – concept47

+0

質問にステミングを適用すると戦闘になるためです。あなたは本当に戦う代わりに戦いを探しています。 ;) – javanna

+0

これは、私がインデックスにステマーを使用したとしても、私の問題が存在することを意味していますか?どのように私はそれが茎の単語と実際のクエリの両方で検索を行うようにするのですか?スフィンクスはこれを自動的に行います。ここでは実装に驚いています – concept47

2

@javannaが正しい方向に向いてくれてくれてありがとう。 _allフィールドのアナライザーをsnowballに設定して解決しました。詳細は、this docを参照してください。

私はRubyのタイヤ宝石を使用している、と私は次のように私のモデルにマッピングを指定することができました:

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

私は正確に元の質問のように私のクエリをフォーマットされました。

関連する問題