所以我一直在尝试将 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"}}}}'
产生 NO 结果的查询:
curl -X GET "http://localhost:9200/users/_search?pretty=true" -d '{"query":{"query_string":{"query":"pizz"}}}'
有没有办法让一般的 query_string 搜索来查看所有索引字段并匹配 ngram,而不必对特定列进行文本/匹配搜索?