Elasticsearch:使用Ngrams进行评分

ema*_*rel 3 mapping settings scoring partial elasticsearch

我有一个直截了当的问题,我已将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'
          ]
        }
      }
    }
  }
Run Code Online (Sandbox Code Playgroud)

映射:

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'
                },

             }

       }]
Run Code Online (Sandbox Code Playgroud)

查询:

GET /user/_search
{
    "query": {
        "match": {
           "_all": {
               "query": "Ke",
               "operator": "and"

           }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Val*_*Val 8

你可以使用edgeNGramtokenizer而不是edgeNGramfilter 来解决这个问题:

 settings: {
    analysis: {
      tokenizer: {
        ngram_tokenizer: {
          type: 'edge_ngram',
          min_gram: 2,
          max_gram: 15
        }
      },
      analyzer: {
        ngram_analyzer: {
          type: 'custom',
          tokenizer: 'ngram_tokenizer',
          filter: [
            'lowercase'
          ]
        }
      }
    }
  }
Run Code Online (Sandbox Code Playgroud)

这样做的原因是edgeNGram过滤器会将给定标记的术语写在同一位置(非常类似于同义词),而edgeNGram标记化器将创建具有不同位置的标记,从而影响长度标准化,从而影响分数.

请注意,这仅适用于2.0之前的ES版本,因为复合分数是根据所有ngram标记得分计算的,而在ES 2.x中,只对匹配的标记进行评分.