编写自定义的Colletor,可以对搜索返回的文档实现更精确的控制。
1.接口
1.1 Collector
org.apache.lucene.search.Collector
接口。用于聚合原始的搜索结果,实现排序及定制化的过滤。
LeafCollector org.apache.lucene.search.Collector.getLeafCollector(LeafReaderContext context)
接口内的方法。创建一个新的collector 来完成给定上下文的收集。
boolean org.apache.lucene.search.Collector.needsScores()
接口内的方法。标识是否需要计算文档得分。
1.2 LeafCollector
org.apache.lucene.search.LeafCollector
接口。它有collect()与setScorer()两个方法声明。见下面两行。
void org.apache.lucene.search.LeafCollector.collect(int doc)
重要方法。这个docid是段内的docid,全局的docid=LeafReaderContext.docBase+doc。
void org.apache.lucene.search.LeafCollector.setScorer(Scorer scorer)
设置打分器。
2.抽象类
2.1 TopDocsCollector
org.apache.lucene.search.TopDocsCollector
抽象类,声明见下。
public abstract class TopDocsCollector<T extends ScoreDoc> implements Collector {...}
PriorityQueue<T> org.apache.lucene.search.TopDocsCollector.pq
字段。这个优先队列盛放top n 的文档。
2.2 TopScoreDocCollector
org.apache.lucene.search.TopScoreDocCollector
抽象类,声明见下。内含三个静态类。
public abstract class TopScoreDocCollector extends TopDocsCollector<ScoreDoc> { private static class PagingTopScoreDocCollector extends TopScoreDocCollector{...} abstract static class ScorerLeafCollector implements LeafCollector {...} private static class SimpleTopScoreDocCollector extends TopScoreDocCollector {...} }
3.设置搜索的超时时间
org.apache.lucene.search.TimeLimitingCollector
这个类用于及时停止耗时的搜索。如果慢于设定阀值,当前搜索线程就会因抛出 TimeExceededException异常而停止。
org.apache.lucene.search.TimeLimitingCollector.TimeLimitingCollector(Collector collector, Counter clock, long ticksAllowed)
构造函数。用于对已有的Collector进行包装。