lucene4.x收集器之TopFieldCollector

TopFieldCollector

        TopDocsCollector的子类,通过SortField使用FieldComparator来进行排序,在IndexSearcher的search方法内部使用,需要显示指定。
        create(Sort sort, int numHits,boolean fillFields, boolean trackDocScores, boolean trackMaxScore, boolean docsScoredInOrder):sort为排序的标准;numHits表示要收集的结果数量;fillFields表示是否在结果中返回实际的字段值;trackDocScores表示结果中是否保存文档评分,如果设置为false,则文档评分设置为Float.NaN,如果设置为true,要计算评分会影响,如果不需要用到评分,建议将其设置为false。trackMaxScore表示在TopDocs中是否保存最大评分,如果设置为false,TopDocs.getMaxScore()返回Float.NaN,如果设置为true,会自动将trackDocScores设置为true;docsScoredInOrder表示文档是否是文档id有序的。sort中的进行排序字段数不能为0,且numHits必须大于0,否则会抛出IllegalArgumentException异常。
        create(Sort sort, int numHits,FieldDoc after,boolean fillFields, boolean trackDocScores, boolean trackMaxScore,boolean docsScoredInOrder):只有after之后的命中结果才会被收集。after不为null时,after中的字段不能为null,且字段数量长度应与sort中的排序字段数量一致,否则会抛出IllegalArgumentException异常。
populateResults(ScoreDoc[] results, int howMany):填充返回结果数组,如果fillFields为true,则将字段值添加到返回结果中。
        TopFieldCollector具有13个静态私有内部子类
OneComparatorNonScoringCollector:按单个字段排序,不需要评分。是所有按单个字段排序的收集器的直接或间接父类。
        collect(int doc):在收集文档时,如果队列未满则直接放入文档,如果队列已满则将文档与队列顶部元素进行比较,由于是文档id升序的,所以如果字段比较结果为0,不需要比较文档id直接跳过即可。
OneComparatorScoringNoMaxScoreCollector:按单个字段排序,OneComparatorNonScoringCollector的子类,与其父类唯一不同的就是保存了每个文档的评分。
OneComparatorScoringMaxScoreCollector:按单个字段排序,OneComparatorNonScoringCollector的子类,与其父类不同的就是保存了每个文档的评分和最大的评分。
OutOfOrderOneComparatorNonScoringCollector:按单个字段排序,OneComparatorNonScoringCollector的子类。
        collect(int doc):在收集文档时,如果队列未满则直接放入文档,如果队列已满则将文档与队列顶部元素进行比较,由于文档是是无序的,所以如果字段比较结果为0,则还需比较文档id,保留文档id较小的文档。
OutOfOrderOneComparatorScoringNoMaxScoreCollector:按单个字段排序,OneComparatorScoringNoMaxScoreCollector的子类,与OutOfOrderOneComparatorNonScoringCollector的收集逻辑相同,但保存每个文档的评分。
OutOfOrderOneComparatorScoringMaxScoreCollector:按单个字段排序,OneComparatorScoringMaxScoreCollector的子类,与OutOfOrderOneComparatorNonScoringCollector的收集逻辑相同,但保存每个文档的评分和最大评分。
MultiComparatorNonScoringCollector:按多个字段排序,不需要评分。
        collect(int doc):在收集文档时,如果队列未满则直接放入文档,若队列已满,则与队列顶部元素依次比较每个字段,由于是文档id升序的,所以若最后一次比较值为0则直接跳过即可,不需要比较文档id。
MultiComparatorScoringNoMaxScoreCollector:按多个字段排序,MultiComparatorNonScoringCollector的子类,与其父类唯一不同的就是保存了每个文档的评分。
MultiComparatorScoringMaxScoreCollector:按多个字段排序,MultiComparatorNonScoringCollector的子类,与其父类唯一不同的就是保存了每个文档的评分和最大评分。
OutOfOrderMultiComparatorNonScoringCollector:按多个字段排序,是MultiComparatorNonScoringCollector的子类。
        collect(int doc):在收集文档时,如果队列未满则直接放入文档,如果队列已满则与队列顶部元素依次比较每个字段,由于文档是是无序的,所以若最后一次比较值为0,则还需比较文档id,保留文档id较小的文档。
OutOfOrderMultiComparatorScoringNoMaxScoreCollector:按多个字段排序,MultiComparatorScoringNoMaxScoreCollector的子类,与OutOfOrderMultiComparatorNonScoringCollector的收集逻辑相同,但保存每个文档的评分。
OutOfOrderMultiComparatorScoringMaxScoreCollector:按多个字段排序,是MultiComparatorScoringMaxScoreCollector的子类,与OutOfOrderMultiComparatorNonScoringCollector的收集逻辑相同,但保存每个文档的评分和最大评分。
PagingFieldCollector:当传入TopFieldCollector的create(Sort sort, int numHits,FieldDoc after,boolean fillFields, boolean trackDocScores, boolean trackMaxScore,boolean docsScoredInOrder)的after不为null时,会创建此对象的实例,此时参数docsScoredInOrder无效。
        collect(int doc):1.在收集文档时,将文档与after的每个字段依次进行比较,如果比较值小于0,或者比较值等于0,但文档id小于after的文档id时,则表示文档已被收集过不再收集。2.当trackMaxScore为true时会对评分进行比较,计算最大评分。3.当队列未满时,直接放入队列。当队列已满时,与队列顶部元素每个字段依次进行比较,如果比较值小于0,或者最后一次比较值为0但文档id大于队列顶部元素Id时则跳过。当trackDocScores为true时,如果trackMaxScore也为true,则不会再次调用scorer.score()方法,避免重复计算评分。

猜你喜欢

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