Elasticsearch:使用 Ngrams 评分

Elasticsearch: Scoring with Ngrams

我有一个直截了当的问题,我将 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"

           }
        }
    }
}

您可以使用 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 中,仅对匹配的标记进行评分。