所以我有这个索引
{
"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 question' 当我执行此搜索时,我会正确地恢复突出显示的字段
<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
我根本无法理解为什么。
答案 0 :(得分:11)
您需要检查映射,看看是否使用fast-vector-highlighter
。但是你仍然需要对你的疑问非常小心。
假设在0.20.4
上使用新的ES localhost
实例。
在您的示例的基础上,让我们添加显式映射。注意我为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
字段都已正确突出显示。但是当使用更长的查询时,事情会迅速改变:
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 。