我有一个大约500M文档的Lucene(4.1)索引。我尝试在其上构建一个搜索界面,但我遇到了一些性能问题。
最初,我使用MatchAllDocumentsQuery
显示所有匹配(分页)。此搜索需要很长时间(大约10秒)。我认为这是因为我使用的收藏家,它试图找到命中总数TotalHitCountCollector
。
我希望能够限时查询,所以我找到了TimeLimitingCollector
。不幸的是,API文档有点阴暗。它使用的计数器没有太多记录。
有没有人在Lucene 4.x中使用TimeLimitingCollector
的经验?如果是这样,是否有方法可以对总点击次数进行估算?
我阅读了https://builds.apache.org/job/Lucene-Artifacts-4.x/javadoc/core/org/apache/lucene/search/TimeLimitingCollector.html和示例,但不清楚设置Counter
以及如何将其与numTicks
答案 0 :(得分:2)
计数器可以是线程安全的 - 只需使用静态Counter.newCounter(boolean threadSafe)
方法来实例化适合您的方法。
然后,假设我们允许10个刻度,并在单独的线程中更新刻度。代码应如下所示:
Counter clock = Counter.newCounter(true);
TimeLimitingCollector collector = new TimeLimitingCollector(c, clock, 10);
collector.setBaseline(0);
new Thread() {
public void run() {
clock.addAndGet(1); // will kill the indexSearcher.search(...) after 10 ticks (10 seconds)
Thread.sleep(1000); // try-catch is necessary here, yes
}
}.start();
indexSearcher.search(query, collector);
然而,我发现上面的内容有点麻烦。 Guava的TimeLimiter.callWithTimeout(...)看起来更干净,尽管不是Lucene的原生。