在ElasticSearch中,我尝试使用带有模糊性的edge_ngram获得正确的评分。我希望精确匹配具有最高的分数,而子匹配具有较低的分数。以下是我的设置和评分结果。
settings: { number_of_shards: 1, analysis: { filter: { ngram_filter: { type: 'edge_ngram', min_gram: 2, max_gram: 20 } }, analyzer: { ngram_analyzer: { type: 'custom', tokenizer: 'standard', filter: [ 'lowercase', 'ngram_filter' ] } } } }, mappings: [{ name: 'voter', _all: { 'type': 'string', 'index_analyzer': 'ngram_analyzer', 'search_analyzer': 'standard' }, properties: { last: { type: 'string', required : true, include_in_all: true, term_vector: 'yes', index_analyzer: 'ngram_analyzer', search_analyzer: 'standard' }, first: { type: 'string', required : true, include_in_all: true, term_vector: 'yes', index_analyzer: 'ngram_analyzer', search_analyzer: 'standard' }, } }]
在执行了名字为“ Michael”的POST之后,我进行了如下查询,并更改了“ Michael”,“ Michae”,“ Micha”,“ Mich”,“ Mic”和“ Mi”。
GET voter/voter/_search { "query": { "match": { "_all": { "query": "Michael", "fuzziness": 2, "prefix_length": 1 } } } }
我的成绩是:
-"Michael": 0.19535106 -"Michae": 0.2242768 -"Micha": 0.24513611 -"Mich": 0.22340237 -"Mic": 0.21408978 -"Mi": 0.15438235
如您所见,得分结果没有达到预期。我希望“ Michael”的得分最高,而“ Mi”的得分最低
任何帮助,将不胜感激!
解决此问题的一种方法是像这样在映射中添加文本的原始版本
last: { type: 'string', required : true, include_in_all: true, term_vector: 'yes', index_analyzer: 'ngram_analyzer', search_analyzer: 'standard', "fields": { "raw": { "type": "string" <--- index with standard analyzer } } }, first: { type: 'string', required : true, include_in_all: true, term_vector: 'yes', index_analyzer: 'ngram_analyzer', search_analyzer: 'standard', "fields": { "raw": { "type": "string" <--- index with standard analyzer } } },
你也可以把它 精确 与index : not_analyzed
index : not_analyzed
然后您可以像这样查询
{ "query": { "bool": { "should": [ { "match": { "_all": { "query": "Michael", "fuzziness": 2, "prefix_length": 1 } } }, { "match": { "last.raw": { "query": "Michael", "boost": 5 } } }, { "match": { "first.raw": { "query": "Michael", "boost": 5 } } } ] } } }
匹配更多条款的文档得分更高。您可以boost根据需要指定。
boost