真实用function_score叠加文本相关性和浏览量加分,针对一个表面上违反直觉的排序结果,用_explain把总分拆解成可归因的分量,精确回答为什么浏览量更高的文档最终排名更靠前。
代码doc1: {title:"Elasticsearch performance tuning guide", views:500} doc2: {title:"performance guide for Elasticsearch clusters", views:9000} POST /rank_test/_search {"query":{"function_score":{ "query":{"match":{"title":"elasticsearch performance"}}, "field_value_factor":{"field":"views","modifier":"log1p","factor":0.5}, "boost_mode":"sum" }}}
搜索结果(按最终得分排序): → doc2 score=4.002098(views=9000) → doc1 score=2.7816808(views=500)
仅从搜索结果看,真实没法直接知道doc2为什么排在前面——是因为文本更相关,还是因为浏览量加分起了作用,还是两者都有贡献?这正是explain存在的真实价值:它能把这个笼统的最终得分,真实拆解成每一个子查询各自贡献了多少。
代码POST /rank_test/_explain/1 {同样的function_score查询} POST /rank_test/_explain/2 {同样的function_score查询}
doc1(views=500)explain拆解: → 总分 = 2.7816808 → 文本相关性(sum of elasticsearch+performance两个词的BM25分) = 0.3820071 → 浏览量加分(field_value_factor: log1p(500*0.5)) = 2.3996737 doc2(views=9000)explain拆解: → 总分 = 4.002098 → 文本相关性 = 0.34878913 ← 真实比doc1的0.382略低! → 浏览量加分(field_value_factor: log1p(9000*0.5)) = 3.653309 ← 真实远高于doc1的2.40
每一步都是本文上面在本机真实的Elasticsearch 8.15.0上跑出来的原始结果。
function_score 查询与 _explain API