2017-01-09 7 views
1

ここでは、ユースケースの解決策を見つけるのが難しいです。 基本的には、それはかなりシンプルです:SQL like '%...%'のような "contains"クエリを実行する必要があります。Ngram Tokenizer on field、問い合わせではありません

正規表現のクエリがありましたが、実際には完全に動作するようになっていましたが、ひどく規模が拡大しているように見えますが、私はnGramを試しています。さて、私は前に彼らと一緒に遊んできたし、 "彼らはどのように動作するか"知っていますが、その動作は私が期待するものではありません。

基本的には、アナライザをmingram = 2、maxgram = 20に設定しました。「Christophe」というユーザのインデックスを作成するとします。クリスは5グラムのクリストフだから、実際には「クリス」というクエリを照合したい。問題は、それがNgramsに分解され、最終的に "is"が "Christophe"の2グラムなので、 "Risotto"も同様に一致するので、それも同様に一致します。

私が必要とするのは、アナライザが、インデックス時にnGramsのインデックスフィールドを実際に分解し、FULLテキストクエリと比較することです。 RisottoはRisotto、XXXRisottoXXXなどと一致する必要がありますが、RisoloやnGramが一致するものとは一致しません。

解決策はありますか?

+1

:http://stackoverflow.com/questions/41543223/elasticsearch-does-not-respect-max-ngram-length-while-using-ngram -tokenizer/41543664?noredirect = 1#comment70303094_41543664(検索時間に 'standard'アナライザを設定する必要があります) – Val

+0

ありがとうございました! –

答えて

2

別のインデックス時間と検索時間のアナライザーを使用するには、設定を使用する必要があります。ドキュメントから

サンプル:この答えは役立つかもしれない

"mappings": { 
    "my_type": { 
    "properties": { 
     "text": { 
     "type": "text", 
     "analyzer": "autocomplete", 
     "search_analyzer": "standard" 
     } 
    } 
    } 
} 
+0

私はこのソリューションを試してみました。 ChrisはChristopheのために、しかし私がChris Schをタイプするとき彼は記録Christophe Schutzを見つけない。私はlastnameとfirstnameの両方でmultimatchqueryを使用していますが、私は両方のフィールドでsearch_analyzerを追加しました。どんな手掛かり ? –

関連する問題