从弹性搜索中的评分中删除提升项

Posted

技术标签:

【中文标题】从弹性搜索中的评分中删除提升项【英文标题】:Removing boost term from scoring in elasticsearch 【发布时间】:2020-09-05 21:27:30 【问题描述】:

有什么方法可以从弹性相关性评分中删除默认的提升词或将其设为 1(因此它不会反映在评分中)。例如,

编辑:输入查询是

GET test_index/_search

  "query": 
    "match": 
      "text": "asia pacific"
    
,"explain": true

部分结果是

"details" : [
        
          "value" : 6.5127892,
          "description" : "weight(text:asia in 5417) [PerFieldSimilarity], result of:",
          "details" : [
            
              "value" : 6.5127892,
              "description" : "score(freq=6.0), product of:",
              "details" : [
                
                  "value" : 2.2,
                  "description" : "boost",
                  "details" : [ ]
                ,
                
                  "value" : 3.8113363,
                  "description" : "idf, computed as log(1 + (N - n + 0.5) / (n + 0.5)) from:",
                  "details" : [
                    
                      "value" : 462,
                      "description" : "n, number of documents containing term",
                      "details" : [ ]
                    ,
                    
                      "value" : 20909,
                      "description" : "N, total number of documents with field",
                      "details" : [ ]
                    
                  ]
                ,
                 
                  "value" : 0.7767246,
                  "description" : "tf, computed as freq / (freq + k1 * (1 - b + b * dl / avgdl)) from:",
                  "details" : [
                    
                      "value" : 6.0,
                      "description" : "freq, occurrences of term within document",
                      "details" : [ ]
                    ,
                    
                      "value" : 1.2,
                      "description" : "k1, term saturation parameter",
                      "details" : [ ]
                    ,
                    
                      "value" : 0.75,
                      "description" : "b, length normalization parameter",
                      "details" : [ ]
                    ,
                    
                      "value" : 1048.0,
                      "description" : "dl, length of field (approximate)",
                      "details" : [ ]
                    ,
                    
                      "value" : 662.01294,
                      "description" : "avgdl, average length of field",
                      "details" : [ ]
                    
                  ]
                
              ]
            
          ]
        ,

这是对简单匹配查询中的一个术语的解释。 在上面的示例中,我想删除 2.2 的提升项或使其等于 1。 请建议如何执行此操作。

【问题讨论】:

【参考方案1】:

在查询中使用 bool->filter 而不是 bool->must。这正是Filter is for。

【讨论】:

我目前正在使用这样的简单查询 GET test_index/_search "query": "match": "text": "asia pacific" 来获取结果,但如果我使用 GET test_index/_search "query": "bool": "filter": "term": "text": "asia pacific" ,它会返回 0 个结果。关于我在这里做错了什么的任何建议。 Term vs match 已经在这里回答了:***.com/a/23151332/8160318 如果你想保持 1 分,使用这个:"query":"bool":"filter":["match":"text":"asia pacific"] 感谢您的建议。但我试图将 boost 设为 1,并且仍然需要基于 BM25 的 TF 和 IDF 分数。使用这种 bool->filter->match 格式会给出一个恒定的分数,这与我想要达到的结果不同。 哦,我看错了你的问题。我认为您不能挑选得分部分......您可以通过脚本或函数得分(elastic.co/guide/en/elasticsearch/reference/current/…)调整最终得分,但您不能打破match得分策略。

以上是关于从弹性搜索中的评分中删除提升项的主要内容,如果未能解决你的问题,请参考以下文章

删除弹性搜索中的旧索引

删除亚马逊弹性搜索中的旧索引

如何从熊猫数据框中的字符串项中删除数字

从表中的多个重复项中删除特定记录

使用正则表达式从python中的列表项中删除子字符串

从 mongodb 数组中的所有重复项中拉出一个元素