そのため、nGram マッチングを ElasticSearch インデックスに追加しようとしましたが、次の問題が発生しています。
標準の文字列クエリを実行すると、完全一致のみが返されます。特定のテストフィールドで一致クエリを実行すると、期待どおりの nGram 一致が生成されます。
これら(1) の例(2)に基づいて、フィールドに nGram フィルターとアナライザーをセットアップします。マッピング コードは次のとおりです。
tire.settings :number_of_shards => 1,
:number_of_replicas => 1,
:analysis => {
:analyzer => {
"str_search_analyzer" => {
"tokenizer" => "keyword",
"filter" => "lowercase"
},
"str_index_analyzer" => {
"tokenizer" => "keyword",
"filter" => ["lowercase","substring"]
}
},
:filter => {
:substring => {
"type" => "nGram",
"min_gram" => 1,
"max_gram" => 10
}
}
} do
mapping do
indexes :test, :type=>'string',
:search_analyzer => :str_search_analyzer,
:index_analyzer=>:str_index_analyzer
end
end
def to_indexed_json
#adding known word plus random string for testing
{
:test => "pizza" + (0...10).map{ ('a'..'z').to_a[rand(26)] }.join
}.to_json
end
エラスティックサーチ クエリ
結果を生成するクエリ:
curl -X GET "http://localhost:9200/users/_search?pretty=true" -d '{"query":{"text":{"test":{"query":"piz"}}}}'
結果を生成しないクエリ:
curl -X GET "http://localhost:9200/users/_search?pretty=true" -d '{"query":{"query_string":{"query":"pizz"}}}'
特定の列でテキスト/一致検索を実行するのではなく、一般的な query_string 検索ですべてのインデックス付きフィールドを調べて ngram と一致させる方法はありますか?