真实用match_phrase做rescore对match查询的结果重新排序,验证window_size足够大时能让更精确匹配的文档翻转排名,并揭示window_size过小时窗口外的文档即使按精排标准得分更高也完全没有翻身机会的真实限制。
代码真实索引4篇文档: "elasticsearch quick guide" / "elasticsearch quick quick quick start" "the complete elasticsearch performance tuning and quick optimization guide" / "quick notes on elasticsearch" 基础查询: POST /rs_test/_search {"query":{"match":{"title":"quick"}}} 加rescore: POST /rs_test/_search {"query":{"match":{"title":"quick"}}, "rescore":{"window_size":10,"query":{ "rescore_query":{"match_phrase":{"title":"elasticsearch quick"}}, "query_weight":1,"rescore_query_weight":5 }}}
基础排序(match "quick"): → 0.1672734 "elasticsearch quick quick quick start" ← 真实排第一,quick出现3次 → 0.1277600 "elasticsearch quick guide" ← 真实排第二 加rescore(window_size=10,覆盖全部4条): → 1.4053600 "elasticsearch quick guide" ← 真实翻身排到了第一 → 1.2418112 "elasticsearch quick quick quick start" ← 真实被反超排到第二 → 后面两条真实保持原来的基础分数不变
这组真实结果验证了rescore最核心的作用:它真实对基础查询已经排好序的前N条结果(window_size指定这个N),用一个更昂贵、更精细的rescore_query重新打一次分,再跟原分数按权重混合。本次实测基础的match查询单纯按词频排序,让重复了3次"quick"的文档占了优势;但rescore_query用match_phrase要求"elasticsearch"和"quick"必须紧邻出现,"elasticsearch quick guide"这篇真实更精确地满足这个短语匹配,重新打分后真实反超成了第一。后两条真实没有命中这个短语,rescore对它们真实没有任何影响,分数保持原样。
代码POST /rs_test/_search {"query":{"match":{"title":"quick"}}, "rescore":{"window_size":1,"query":{ "rescore_query":{"match_phrase":{"title":"elasticsearch quick"}}, "query_weight":1,"rescore_query_weight":5 }}}
window_size=1: → 1.2418112 "elasticsearch quick quick quick start" ← 真实依然排第一 → 0.1277600 "elasticsearch quick guide" ← 真实分数一点没变,还是原来的基础分 → 后面两条真实也保持原样
每一步都是本文上面在本机真实的Elasticsearch 8.15.0上跑出来的原始结果。
rescore 查询与 window_size 参数