真实验证should子句里的正向boost如何只放大命中对应条件的文档得分,并用boosting查询的负向降权证明negative_boost精确等于原始得分乘以一个0到1之间的系数。
代码doc1: {title:"python tutorial", category:"official"} doc2: {title:"python tutorial advanced", category:"blog"} POST /boost_test/_search {"query":{"bool":{ "must":[{"match":{"title":"python tutorial"}}], "should":[{"term":{"category":{"value":"official"}}}] }}} POST /boost_test/_search {"query":{"bool":{ "must":[{"match":{"title":"python tutorial"}}], "should":[{"term":{"category":{"value":"official","boost":3}}}] }}}
不加boost: → doc1 score=1.0902832 → doc2 score=0.3370651 should里的term加boost=3: → doc1 score=2.4765775 ← 真实从1.09暴涨到2.48 → doc2 score=0.3370651 ← 真实跟不加boost时一模一样,一个小数点都没变
这组真实得分对比验证了boost参数的精确作用范围:doc1的category字段真实是"official",命中了should里那个term查询,这部分得分贡献被真实放大了3倍;doc2的category是"blog",压根没命中这个term查询,不管这个term的boost设成多少,对doc2真实都没有任何影响。这跟本系列第35篇验证过的multi_match字段权重的行为规律真实完全一致:boost只真实作用于命中了对应查询子句的那部分得分,未命中的查询子句,boost设得再高也不会凭空产生分数。
代码POST /boost_test/_search {"query":{"match":{"title":"python tutorial"}}} # 作为基准分 POST /boost_test/_search {"query":{"boosting":{ "positive":{"match":{"title":"python tutorial"}}, "negative":{"term":{"category":"blog"}}, "negative_boost":0.3 }}}
基准分(纯title match,不经过boosting包装): → doc1 score=0.39713606 doc2 score=0.3370651 boosting查询(negative条件是category:blog,negative_boost=0.3): → doc1 score=0.39713606 ← 真实跟基准分完全一样,因为doc1的category是official不是blog → doc2 score=0.10111953 ← 真实精确等于0.3370651 * 0.3 = 0.10111953
每一步都是本文上面在本机真实的Elasticsearch 8.15.0上跑出来的原始结果。
boost 参数与 boosting 查询