【问题标题】:Elasticsearch: Scoring with NgramsElasticsearch:使用 Ngram 评分
【发布时间】:2016-04-09 16:34:36
【问题描述】:

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

           }
        }
    }
}

【问题讨论】:

    标签: elasticsearch mapping settings partial scoring


    【解决方案1】:

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

    【讨论】:

    • 感谢您抽出宝贵时间回答我的问题!如您所述,我在上面进行了以下更改,但在子匹配和精确匹配中仍然获得相同的分数。我还需要更改映射中的任何内容吗?您是否能够最终重新创建相同的场景?谢谢你:)
    • 您是否已擦除索引并重新索引所有数据?
    • 是的,我有 @val .. 我想知道为什么 Ke、Kev、Kevi、Kevin 仍然显示相同的分数
    • 我在匹配Ke (0.15342641)、Kev (0.2169777)、Kevi (0.26574233) 和Kevin (0.30685282) 时得到不同的分数
    • 请说明您为重建索引所经历的步骤?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-19
    • 1970-01-01
    • 1970-01-01
    • 2021-11-26
    • 1970-01-01
    • 2018-03-05
    • 1970-01-01
    相关资源
    最近更新 更多