lucene4.x收集器之TopScoreDocCollector

TopScoreDocCollector

        TopDocsCollector的子类,根据score和docID排序,在IndexSearcher的search方法内部使用,不需要显示指定,是最常用的收集器。IndexSearcher用它来实现基于TopDocs的查询,命中结果按评分降序并且文档id升序排列。在创建TopScoreDocCollector实例时需要事先了解收集的文档是否需要按文档id排序。Float.NaN和Float.NEGATIVE_INFINITY是无效的分数,收集器不能正确的收集这些分数的命中结果。
        create(int numHits, boolean docsScoredInOrder):创建一个TopScoreDocCollector并指定要收集的命中结果数量和文档是否按通过setScorer(Scorer)方法传入的Scorer进行排序。此方法返回的实例会预先分配一个numHits长度的数组,并用标记对象填充数组。
        create(int numHits, ScoreDoc after, boolean docsScoredInOrder):创建一个TopScoreDocCollector并指定要收集的命中结果数量、前一页最后一个文档和文档是否按通过setScorer(Scorer)方法传入的Scorer进行排序。此方法返回的实例会预先分配一个numHits长度的数组,并用标记对象填充数组。
        newTopDocs(ScoreDoc[] results, int start):创建一个包含查询结果中的最大评分的TopDocs对象。
        TopScoreDocCollector有四个静态私有内部子类,可以通过TopScoreDocCollector的create方法创建。
        由 create(int numHits, boolean docsScoredInOrder)创建:
        InOrderTopScoreDocCollector:假设文档是按文档id升序排列的,而HitQueue在评分相同时取文档id小的,所以在其collect方法中,当文档评分与队列中顶层元素分数相同时,不需要比较文档id直接跳过即可。
        OutOfOrderTopScoreDocCollector:假设文档是无序的,所以在文档评分与队列中顶层元素分数相同时,需要比较文档id,如果文档id较大则跳过。
        由 create(int numHits, ScoreDoc after, boolean docsScoredInOrder)创建:
        InOrderPagingScoreDocCollector:假设文档是按文档id升序排列的。
                collect(int doc):首先与after的评分和文档id比较,若评分小于after的评分,或者评分相同但文档id小于等于after的文档id,则表示文档再前一页查询时已经收集过跳过即可,否则再与队列中的顶层元素比较,与InOrderTopScoreDocCollector一样,评分相同时,不需要比较文档id直接跳过。
                newTopDocs(ScoreDoc[] results, int start):返回最高分为Float.NaN的TopDocs对象。
        OutOfOrderPagingScoreDocCollector:假设文档是无序的。
                collect(int doc):首先与after比较,逻辑与InOrderPagingScoreDocCollector相同,与队列中顶层元素比较的逻辑则与OutOfOrderTopScoreDocCollector相同。
                newTopDocs(ScoreDoc[] results, int start):返回最高分为Float.NaN的TopDocs对象。

猜你喜欢

转载自blog.csdn.net/asty9000/article/details/80114192