TimeLimitingCollector Lucene,如何有效使用?

时间:2013-01-28 08:11:33

标签: performance lucene

我有一个大约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

结合使用

1 个答案:

答案 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的原生。