【问题标题】:Elasticsearch: "function_score" with "boost_mode":"replace" ignores function scoreElasticsearch:“function_score”与“boost_mode”:“replace”忽略函数分数
【发布时间】:2015-12-20 08:00:54
【问题描述】:

我正在尝试使用 function_score 中定义的不同函数修改来自正常查询的分数。

为了找出我的函数计算出的分数,我将“boost_mode”指定为“replace”。但是,这会使所有分数保持不变:都等于 1。

考虑以下查询:

{
  "query": {
    "function_score": {
      "query": {
        "terms": {
          "name": ["men", "women"]
        }
      },
      "score_mode": "avg",
      "functions": [
        {
          "filter": {
            "terms": {
              "name": ["men","man"]
            }
          },
          "weight": 2
        }
      ],
      "boost_mode": "replace"
    }
  },
  "explain": true,
  "from": 0
}

我希望在这里得到不同的分数,这取决于“姓名”字段是包含“男人”还是“男人”。此类文档肯定存在于索引中。

此外,如果我指定“解释”:true,我得到的解释中显示的分数与命中的 _score 字段中显示的分数不同:

{  
    "_shard":0,
    "_node":"ro26nlDuTfiTaIlIgHqg4g",
    "_index":"products10",
    "_type":"product_basic",
    "_id":"0c25fc90433481aac0cce62dd1a21e06",
    "_score":1,
    "_source":{  
        "category":[  
            "Chicago Blues",
            "Blues",
            "Styles",
            "Digital Music"
        ],
        "site_name":"www.amazon.com",
        "name":"Who's That Women?",
        "url":"http://www.amazon.com/dp/B001125F8I/",
        "price":0.99,
        "reviews":[  

        ],
        "breadcrumb":"Digital Music",
        "in_stock":true,
        "features":[  

        ],
        "pic_urls":[  
            "http://ecx.images-amazon.com/images/I/51CvgPMwtsL.jpg",
            "http://ecx.images-amazon.com/images/I/51CvgPMwtsL.jpg"
        ],
        "name_semantic_core":[  
            "Women ?",
            "?"
        ],
        "category_path":"/Chicago Blues/Blues/Styles/",
        "visit_datetime":"2014-11-04T11:50:34.169779",
        "detected_category":"Digital Music"
    },
    "_explanation":{  
        "value":1.2249949,
        "description":"function score, no filter match, product of:",
        "details":[  
            {  
                "value":1.2249949,
                "description":"product of:",
                "details":[  
                    {  
                        "value":2.4499898,
                        "description":"sum of:",
                        "details":[  
                            {  
                                "value":2.4499898,
                                "description":"weight(name:women in 6181332) [PerFieldSimilarity], result of:",
                                "details":[  
                                    {  
                                        "value":2.4499898,
                                        "description":"score(doc=6181332,freq=1.0), product of:",
                                        "details":[  
                                            {  
                                                "value":0.67790973,
                                                "description":"queryWeight, product of:",
                                                "details":[  
                                                    {  
                                                        "value":7.228071,
                                                        "description":"idf(docFreq=238699, maxDocs=120967660)"
                                                    },
                                                    {  
                                                        "value":0.09378847,
                                                        "description":"queryNorm"
                                                    }
                                                ]
                                            },
                                            {  
                                                "value":3.6140356,
                                                "description":"fieldWeight in 6181332, product of:",
                                                "details":[  
                                                    {  
                                                        "value":1,
                                                        "description":"tf(freq=1.0), with freq of:",
                                                        "details":[  
                                                            {  
                                                                "value":1,
                                                                "description":"termFreq=1.0"
                                                            }
                                                        ]
                                                    },
                                                    {  
                                                        "value":7.228071,
                                                        "description":"idf(docFreq=238699, maxDocs=120967660)"
                                                    },
                                                    {  
                                                        "value":0.5,
                                                        "description":"fieldNorm(doc=6181332)"
                                                    }
                                                ]
                                            }
                                        ]
                                    }
                                ]
                            }
                        ]
                    },
                    {  
                        "value":0.5,
                        "description":"coord(1/2)"
                    }
                ]
            },
            {  
                "value":1,
                "description":"queryBoost"
            }
        ]
    }
}

这里的解释显示“value”:1.2249949,而“_score”为1。

我做错了什么?如何获得使用 functinon_score 函数计算的实际分数[在与原始查询分数结合之前]?

更新:如果找到匹配的产品,我会得到以下信息。出于某种原因,分数是 1,而应该是 2:

【问题讨论】:

  • 在您的示例中,该函数与任何文档都不匹配:function score, no filter match,。此外,在使用replace 时,从documentation 会发生以下情况:only function score is used, the query score is ignored。所以,情况是这样的:过滤器不匹配 - 所以不计算评分 - 并且replace 将使查询分数被忽略并使用过滤器中的分数(它不存在,因为它没有'不匹配)。
  • 而函数不匹配时,函数的默认值为1。您可以通过"boost_mode": "sum" 进行检查。我的看法是,这就是您看到分数为1 的原因。
  • @AndreiStefan 提供的样本确实如此。该产品不匹配。但是对于匹配的产品,由于某种原因它仍然返回 1(请参阅有问题的更新)。
  • @AndreiStefan 嗯,然后当我将“score_mode”从“avg”更改为“multiply”时,我得到了有意义的结果:第一个得分为“2”,然后得分为“1”
  • 是的,sum 也是如此。我想知道平均值是如何计算出来的……看起来不太对。

标签: elasticsearch lucene


【解决方案1】:

在您的示例中,该函数与任何文档都不匹配:function score, no filter match,。此外,在使用替换时,从documentation 会发生以下情况:only function score is used, the query score is ignored。所以,情况是这样的:过滤器不匹配 - 所以不计算得分 - 并且replace 将使查询分数被忽略并使用过滤器中的分数(它不存在,因为它没有'不匹配)。

而函数不匹配时,函数的默认值为1。您可以通过"boost_mode": "sum" 进行检查。我的看法是,这就是您看到1 分数的原因。

关于avg 的行为,这对我来说看起来不太好,而且很可能是一个错误。我在这里举报了:https://github.com/elastic/elasticsearch/issues/13732

【讨论】:

  • "并且当函数不匹配时,函数的默认值为1" 我在es文档中找不到这样的声明,你能给我一个关于这个的链接吗?
  • 我也找不到这样的参考资料
  • "而当函数不匹配时,函数的默认值为1" 这相当混乱,尤其是对于"score_mode": "sum"。中性元素应为 0。
猜你喜欢
  • 2020-03-08
  • 1970-01-01
  • 1970-01-01
  • 2016-02-01
  • 2018-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-09
相关资源
最近更新 更多