好的 - 我终于弄清楚发生了什么。首先,在您的要点中,您的查询与您的任何文档都不匹配,因为纬度/经度。我随机选择了一份文档(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
for 评分将无法访问嵌套places
文档,因此您将无法做到这一点。
为什么确切的总数如此重要?永远不应将其_score
视为绝对值。它只是反映了每个文档的相对重要性。您只需要调整每个条款的影响,直到您获得满足您要求的“正确”顺序。