【问题标题】:score_mode:total in elasticsearch [closed]score_mode:弹性搜索中的总计 [关闭]
【发布时间】:2013-03-29 00:20:35
【问题描述】:

custom_filters_score 有点麻烦。个人分数0.814913330.1250.08695652 相加等于0.1727262...

编辑:我再次查看它,看起来 custom_filters_score 的总和正在乘以“正常”查询。

有没有办法将普通查询 (custom_score) 合并到 custom_filter_score 中,或者强制弹性搜索将两者相加(而不是相乘)?

数据、查询和映射的要点在https://gist.github.com/sqwk/3d7b25192a236fba82b4

【问题讨论】:

  • 你用的是什么版本的ES?我在最近的版本中看到了一些修复分数解释的承诺
  • 0.20.6 我再次查看它,看起来 custom_filters_score 的总和正乘以“正常”查询。有办法改变吗?
  • 啊,这是分数归一化,相同的值适用于查询的所有结果 - 你可以忽略它。不,你不能在不编写一些自定义 Java 的情况下禁用它
  • 我的意思是,有没有办法将两者相加而不是相乘?自定义java很好,只需要知道放在哪里;)
  • 你能用映射、数据、查询和 curl 语句来概括一下吗?我想确切地了解发生了什么

标签: search elasticsearch


【解决方案1】:

好的 - 我终于弄清楚发生了什么。首先,在您的要点中,您的查询与您的任何文档都不匹配,因为纬度/经度。我随机选择了一份文档 (323) 并使用了那里的纬度/经度值。

这是我得到的解释:

 - custom score, score mode [total]                                    |    0.8795
   - Score based on score mode Max and child doc range from 10 to 16   |    1.0000
     - Child[16]                                                       |    1.0000
   - custom score, product of:                                         |    0.2000
     - match filter: cache(object_max_rooms:[4 TO *])                  |    1.0000
     - scriptFactor                                                    |    0.2000
     - queryBoost                                                      |    1.0000
   - custom score, product of:                                         |    0.5714
     - match filter: cache(object_min_living_area:[* TO 125])          |    1.0000
     - scriptFactor                                                    |    0.5714
     - queryBoost                                                      |    1.0000
   - custom score, product of:                                         |    0.1081
     - match filter: cache(object_max_living_area:[125 TO *])          |    1.0000
     - scriptFactor                                                    |    0.1081
     - queryBoost                                                      |    1.0000

如您所见,纬度/经度完全匹配,因此得分为 1,并且来自 custom_filters_score 查询的得分相加得很好。

然后我将 lat 的值从 50.0852386 更改为 50.0882386,然后重新运行。现在分数是这样的:

 - custom score, score mode [total]                                    |    0.7081
   - Score based on score mode Max and child doc range from 10 to 16   |    0.8050
     - Child[16]                                                       |    0.8050
   - custom score, product of:                                         |    0.2000
     - match filter: cache(object_max_rooms:[4 TO *])                  |    1.0000
     - scriptFactor                                                    |    0.2000
     - queryBoost                                                      |    1.0000
   - custom score, product of:                                         |    0.5714
     - match filter: cache(object_min_living_area:[* TO 125])          |    1.0000
     - scriptFactor                                                    |    0.5714
     - queryBoost                                                      |    1.0000
   - custom score, product of:                                         |    0.1081
     - match filter: cache(object_max_living_area:[125 TO *])          |    1.0000
     - scriptFactor                                                    |    0.1081
     - queryBoost                                                      |    1.0000

因此,过滤器的得分与查询的得分相结合,然后进行归一化。这是可以预料的。 score_mode 仅适用于过滤器,不适用于过滤器和查询的组合。

如果您想精确地组合它们,那么您需要将距离计算从查询移到custom_filters_score 过滤器下的过滤器中。问题是用于评分的script 无法访问嵌套的places 文档,因此您将无法这样做。

为什么确切的总数如此重要? _score 永远不应被视为绝对值。它只是反映了每个文档的相对重要性。您只需要调整每个条款的影响,直到您获得满足您需求的“正确”顺序。

【讨论】:

  • 感谢您抽出宝贵时间对此进行测试。确切的总数并不重要,但乘法不起作用,因为获得正确顺序的一个组成部分取决于另一个组成部分。有没有办法使用 mvel 循环嵌套字段? (如果我将查询移动到 custom_filters_score 下的过滤器中,我需要在单个脚本中进行计算。)
  • 不,很遗憾。嵌套文档在内部是单独的文档。上下文中的文档是根文档。它看不到嵌套文档。您可以使用_source['..'] 而不是_doc['...'] 来获取纬度/经度值,但这会慢很多。
猜你喜欢
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-06
  • 2017-01-02
  • 1970-01-01
  • 2021-11-23
相关资源
最近更新 更多