当前位置:  开发笔记 > 数据库 > 正文

Elasticsearch:使用Ngrams进行评分

如何解决《Elasticsearch:使用Ngrams进行评分》经验,为你挑选了1个好方法。

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

你可以使用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'
          ]
        }
      }
    }
  }

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

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



1> Val..:

你可以使用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'
          ]
        }
      }
    }
  }

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

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

推荐阅读
贾志军
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有