背景介绍
排查问题时需要分析问题成因,设置explain为true,打开分数打印后,公式虽然大差不离的看得懂,但是却忘了几个参数什么意思,在这里记录一下。
样例分析
首先任意选取一次explain的结果
图中很明显是在做tf和idf的计算,几个比较迷惑人的地方
- 542是什么意思
weight(topic_name:周杰伦 in 542) [PerFieldSimilarity], result of:
这里面的542一开始我误以为是docCount,后来发现不是…542是lucene文档内部的id,和外部的_id不同,不参与计算,无需理会。
- docFreq是什么
docFreq是指符合搜索条件的doc数目有多少,图中为5,我们可以理解为,符合topic_name:周杰伦这个召回条件的docCount在这个分片下有5篇。注意!!!是在这条数据对应的分片下!!! - docCount是什么
docCount是指数据对应的分片下的文档总数,日常召回时会发现不同文档的docCount不一样,而理论上应该是一样的。原因就是来自于集群的不同分片。同理,如果你专门去找2条来自于同一分片的数据验证对比,可以发现docCount是相同的。 - termFreq是什么
搜索词在该字段中出现的次数。这里注意不是简单理解上的搜索次数,需要看字段的类型,如果是不分词字段,则必须要完全匹配才会有一次。
关于分片的原理参考Elasticsearch参数search_type与分布式原理
这篇博客的这一段说法,说得很好,很容易理解
从定义可知,idf仅仅与搜索关键词有关,与文档无关。所以同一输入来说,所有的文档应该是共享同一idf的。但事实上并非如此。原因就在elasticsearch的分布式机制。elasticsearch的索引(index)会被分片(shard),而每一个分片相当于一个独立的搜索引擎。每一次搜索任务会被分配到不同的shard去执行,然后将各个shard的结果汇总起来得到最终我们看到的结果。而评分的过程会在shard完成,因此不同分片下,会得到不同的idf。这里需要有个前提假设是文档数量足够多的时候各个分片的词频会趋近,因此idf的差异也就不大。但是如果文档数量不够多的时候启用分片,可能词频在不同分片会有较大的差异,我遇到的情况就是这样的
结论
在排查相关性分数相关问题时首先打开explain查看具体计算方式,而这些计算分数的因子可能受分片数量影响,需要注意
作者:十五倍压枪
链接:https://www.jianshu.com/p/ffecea5c7360
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。