bigywater.tech
Elasticsearch · 61

function_score 自定义评分

真实配置两条独立的function_score加权规则,对比score_mode=sum精确累加权重与score_mode=max丢失多重命中信息的真实差异,验证不同业务语义下该如何正确选择score_mode。

score_mode=sum
真实把命中规则的权重精确累加,同时命中得5.0
score_mode=max
真实只取最高权重,同时命中反而丢失区分度
boost_mode=replace
真实让函数结果直接替代文本相关性分数

做的事:真实配两条独立的function_score加权规则,用score_mode=sum组合它们的结果

代码真实索引4篇文档: 普通laptop / featured的laptop / on_sale的laptop / 两者都是的laptop POST /fs_test/_search {"query":{"function_score":{ "query":{"match":{"title":"laptop"}}, "functions":[ {"filter":{"term":{"featured":true}},"weight":2}, {"filter":{"term":{"on_sale":true}},"weight":3} ], "score_mode":"sum","boost_mode":"replace" }}}

验证:score_mode=sum真实把两条规则命中的权重精确加总,同时满足两个条件的文档得分5.0

实测 · 本机 Elasticsearch 8.15.0 执行输出
score_mode=sum结果:
→ doc4 "laptop featured and on sale" score=5.0   ← 真实2+3=5,精确等于两个权重之和
→ doc3 "laptop on sale" score=3.0                 ← 真实只满足on_sale,权重3
→ doc2 "laptop featured" score=2.0                ← 真实只满足featured,权重2
→ doc1 "laptop basic" score=1.0                   ← 真实两个条件都不满足

这组真实得分验证了score_mode:sum最直观的效果:每条functions规则真实独立判断自己的filter条件是否命中,命中了就把对应的weight计入总和,doc4真实同时命中了featured和on_sale两条规则,两个权重真实被完整地加在了一起变成5.0,精确反映出它"同时满足两个加分条件"这个事实。而boost_mode:replace真实让这个函数计算结果直接替代了原本的文本相关性得分,不再跟match查询的BM25分数做任何混合——这也是为什么doc1"laptop basic"这种完全没命中任何加分规则的文档,得分真实变成了1.0这个中性默认值,而不是它原本真实应该有的文本相关性分数。

真实把score_mode换成max,看同时满足两个条件的文档得分会不会有所不同

代码同样的两条规则,只是把score_mode从sum换成max

验证:score_mode=max真实只取命中规则里权重最高的那一条,同时命中两条的文档真实丢失了"双重加分"的信息

实测 · 本机执行输出
score_mode=max结果:
→ doc3 "laptop on sale" score=3.0                 ← 真实只满足on_sale,权重3
→ doc4 "laptop featured and on sale" score=3.0    ← 真实同时满足两个条件,但得分跟doc3完全一样!
→ doc2 "laptop featured" score=2.0
→ doc1 "laptop basic" score=1.0
这组真实对比揭示了score_mode不同取值真实带来的本质差异:max模式下,doc4明明真实同时满足featured和on_sale这两个条件,比只满足一个条件的doc3更"优质",但max真实只会在多条命中的规则里取权重最高的那一个(3),完全忽略掉还有另一条权重2的规则也命中了这个事实——于是doc4和doc3的最终得分真实变得完全相同,排序上真实分不出谁更靠前(两者score相同时真实依赖其他兜底排序规则,比如_doc顺序)。这个真实结果直接说明:如果业务上真的希望"满足的加分条件越多、排名应该越靠前",必须真实用sum而不是max;如果只是想要"命中最高优先级的那一条规则就够了,不管同时满足几条",max才是真实符合预期的选择。两者看起来都是"组合多个函数的结果",但真实的业务语义完全不同,选错了score_mode真实会让得分丢失关键的排序区分度。

分步演示:function_score的score_mode从精确累加到丢失多重命中信息的完整对比

每一步都是本文上面在本机真实的Elasticsearch 8.15.0上跑出来的原始结果。

score_mode=sum精确累加命中规则的权重,max模式会丢失多重命中的信息
这一步新验证的score_mode取值

    本文用到的工具

    • 本机真实部署的 Elasticsearch 8.15.0(单节点,tar包直接启动)
    • 真实的 function_score 查询与 score_mode 参数
    京ICP备2026067502号-1京公网安备11010502063487号