所以我有这个索引
{ "settings":{ "index":{ "number_of_replicas":0, "analysis":{ "analyzer":{ "default":{ "type":"custom", "tokenizer":"keyword", "filter":[ "lowercase", "my_ngram" ] } }, "filter":{ "my_ngram":{ "type":"nGram", "min_gram":2, "max_gram":20 } } } } } }
我正在通过轮胎宝石进行搜索
{ "query":{ "query_string":{ "query":"xyz", "default_operator":"AND" } }, "sort":[ { "count":"desc" } ], "filter":{ "term":{ "active":true, "_type":null } }, "highlight":{ "fields":{ "name":{ } }, "pre_tags":[ "<strong>" ], "post_tags":[ "</strong>" ] } }
并且我有两个应该匹配的帖子,分别名为“ xyz post”和“ xyz问题”。执行此搜索时,我正确地获得了突出显示的字段
<strong>xyz</strong> question <strong>xyz</strong> post
现在这就是事情……一旦我在索引和重新索引中将min_gram更改为1。突出显示的字段开始像这样返回
<strong>x</strong><strong>y</strong><strong>z</strong> pos<strong>xyz</strong>t <strong>x</strong><strong>y</strong><strong>z</strong> questio<strong>xyz</strong>n
我根本不明白为什么。
您需要检查 映射 并查看是否使用fast-vector-highlighter。但是,您仍然需要非常小心自己的查询。
fast-vector-highlighter
假设使用ES的新实例0.20.4上localhost。
0.20.4
localhost
以您的示例为基础,让我们添加显式映射。注意我为该code字段设置了两种不同的分析。唯一的区别是"term_vector":"with_positions_offsets"。
code
"term_vector":"with_positions_offsets"
curl -X PUT localhost:9200/myindex -d ' { "settings" : { "index":{ "number_of_replicas":0, "number_of_shards":1, "analysis":{ "analyzer":{ "default":{ "type":"custom", "tokenizer":"keyword", "filter":[ "lowercase", "my_ngram" ] } }, "filter":{ "my_ngram":{ "type":"nGram", "min_gram":1, "max_gram":20 } } } } }, "mappings" : { "product" : { "properties" : { "code" : { "type" : "multi_field", "fields" : { "code" : { "type" : "string", "analyzer" : "default", "store" : "yes" }, "code.ngram" : { "type" : "string", "analyzer" : "default", "store" : "yes", "term_vector":"with_positions_offsets" } } } } } } }'
索引一些数据。
curl -X POST 'localhost:9200/myindex/product' -d '{ "code" : "Samsung Galaxy i7500" }' curl -X POST 'localhost:9200/myindex/product' -d '{ "code" : "Samsung Galaxy 5 Europa" }' curl -X POST 'localhost:9200/myindex/product' -d '{ "code" : "Samsung Galaxy Mini" }'
现在我们可以运行查询了。
curl -X GET 'localhost:9200/myindex/product/_search?pretty' -d '{ "fields" : [ "code" ], "query" : { "term" : { "code" : "i" } }, "highlight" : { "number_of_fragments" : 0, "fields" : { "code":{}, "code.ngram":{} } } }'
这将产生两个搜索结果:
# 1 ... "fields" : { "code" : "Samsung Galaxy Mini" }, "highlight" : { "code.ngram" : [ "Samsung Galaxy M<em>i</em>n<em>i</em>" ], "code" : [ "Samsung Galaxy M<em>i</em>n<em>i</em>" ] } # 2 ... "fields" : { "code" : "Samsung Galaxy i7500" }, "highlight" : { "code.ngram" : [ "Samsung Galaxy <em>i</em>7500" ], "code" : [ "Samsung Galaxy <em>i</em>7500" ] }
这次code和code.ngem字段均正确突出显示。但是当使用更长的查询时,情况会迅速改变:
code.ngem
curl -X GET 'localhost:9200/myindex/product/_search?pretty' -d '{ "fields" : [ "code" ], "query" : { "term" : { "code" : "y m" } }, "highlight" : { "number_of_fragments" : 0, "fields" : { "code":{}, "code.ngram":{} } } }'
这样产生:
"fields" : { "code" : "Samsung Galaxy Mini" }, "highlight" : { "code.ngram" : [ "Samsung Galax<em>y M</em>ini" ], "code" : [ "Samsung Galaxy Min<em>y M</em>i" ] }
该code领域是不正确高亮(类似你的情况)。
重要的一点是, 使用查询 一词代替了 query_string 。