1

我有一个大约 500M 文档的 Lucene (4.1) 索引。我尝试在其上构建搜索界面,但遇到了一些性能问题。

最初,我使用MatchAllDocumentsQuery. 此搜索需要很长时间(大约 10 秒)。我认为这是因为我使用的收集器,它试图找到总点击数TotalHitCountCollector

我希望能够对查询进行时间限制,所以我找到了TimeLimitingCollector. 不幸的是,API 文档有点阴暗。它使用了一个没有太多记录的计数器。

有没有人有使用TimeLimitingCollectorLucene 4.x 的经验?如果是这样,是否有方法可以估计点击总数?

我阅读了:https ://builds.apache.org/job/Lucene-Artifacts-4.x/javadoc/core/org/apache/lucene/search/TimeLimitingCollector.html和示例,但设置不清楚以及如何将其CounternumTicks

4

1 回答 1

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

于 2013-01-28T11:15:36.433 回答