Elasticsearch:使用Ngrams进行评分

时间:2016-01-05 18:23:53

标签: elasticsearch mapping settings partial scoring

我有一个直截了当的问题,我已将ngram用于部分匹配。实施效果很好,但得分结果并不像我希望的那样有效。我希望我的得分结果看起来像这样:

  • Ke:.1
  • Kev:.2
  • Kevi:.3
  • 凯文:.4

相反,我得到以下结果,如果该字段匹配,则得分相同:

  • Ke:.4
  • Kev:.4
  • Kevi:.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"

           }
        }
    }
}

1 个答案:

答案 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中,只对匹配的标记进行评分。