我有一个直截了当的问题,我已将ngram用于部分匹配。实施效果很好,但得分结果并不像我希望的那样有效。我希望我的得分结果看起来像这样:
相反,我得到以下结果,如果该字段匹配,则得分相同:
设置:
settings: {
analysis: {
filter: {
ngram_filter: {
type: 'edge_ngram',
min_gram: 2,
max_gram: 15
}
},
analyzer: {
ngram_analyzer: {
type: 'custom',
tokenizer: 'standard',
filter: [
'lowercase',
'ngram_filter'
]
}
}
}
}
映射:
mappings: [{
name: 'voter',
_all: {
'type': 'string',
'analyzer': 'ngram_analyzer',
'search_analyzer': 'standard'
},
properties: {
last: {
type: 'string',
required : true,
include_in_all: true,
analyzer: 'ngram_analyzer',
search_analyzer: 'standard'
},
first: {
type: 'string',
required : true,
include_in_all: true,
analyzer: 'ngram_analyzer',
search_analyzer: 'standard'
},
}
}]
查询:
GET /user/_search
{
"query": {
"match": {
"_all": {
"query": "Ke",
"operator": "and"
}
}
}
}
答案 0 :(得分:8)
您可以使用edgeNGram
tokenizer代替edgeNGram
过滤器来解决此问题:
settings: {
analysis: {
tokenizer: {
ngram_tokenizer: {
type: 'edge_ngram',
min_gram: 2,
max_gram: 15
}
},
analyzer: {
ngram_analyzer: {
type: 'custom',
tokenizer: 'ngram_tokenizer',
filter: [
'lowercase'
]
}
}
}
}
原因是edgeNGram
过滤器会将给定标记的术语写在同一位置(非常类似于同义词),而edgeNGram
标记生成器会创建具有令牌的标记不同的位置,因此影响长度归一化,因此得分。
请注意,这仅适用于2.0之前的ES版本,因为复合得分是根据所有ngram标记得分计算的,而在ES 2.x中,只对匹配的标记进行评分。