简介
名叫“Lucene之MaxScorer算法分析”其实并不准确,因为有Stefan提交的MaxScorer代码尚未提交到Lucene,至今还在讨论
中,具体见:https://issues.apache.org/jira/browse/LUCENE-4571,他索所要解决的问题就是Lucene在计算Top-k时效率慢的问题。
目前Lucene对于MaxScore的计算, AND计算比较快,这个就不用优化,主要是针对OR 查询,这时需要比对每个Scorer,计算其得
分这样就很耗时,导致性能很慢。其实可以预先就可以确定一些是不需要计算的,直接可以跳过,所以自1995年提出的MaxScore算
法就是为解决这个问题。Stefan根据几天涉及Maxscore优化的论文为Lucene贡献了MaxScorer代码(尚未通过审核提交到Lucene),
在此感谢Stefan的贡献。
MaxScorer思想
对于一个Boolean查询,每个Term查询出来对应一个Inverted List,每个list有可能很长有可能很短,每个list中的每个doc都包含了该term,
都有和当前term的一个相似性打分。那么对于每个List来说就存在一个对于当前Term的最大打分。称为该list的Upper Bound。
假设queryString=“The OR conference OR berlin OR buzzwords”,具体MaxScore算法如下:
按照term对应的dcoFreq(包含该Term的文档数)从大到小排序。上图中方块的大小代表该文档
和term的相似性打分的大小