我有一个直截了当的问题,我已将ngram的部分匹配纳入其中.实施效果很好,但得分结果并不像我希望的那样有效.我希望我的得分结果看起来像这样:
柯:.1
凯夫:.2
凯维:.3
凯文:.4
相反,我得到以下结果,如果该字段匹配,则得分相同:
柯:.4
凯夫:.4
凯维:.4
凯文:.4
设置:
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" } } } }
Val.. 8
你可以使用edgeNGram
tokenizer而不是edgeNGram
filter 来解决这个问题:
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中,只对匹配的标记进行评分.
你可以使用edgeNGram
tokenizer而不是edgeNGram
filter 来解决这个问题:
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中,只对匹配的标记进行评分.