【问题标题】:TimeLimitingCollector Lucene, how to use effectively?TimeLimitingCollector Lucene,如何有效使用?
【发布时间】:2013-01-28 08:11:32
【问题描述】:

我有一个包含大约 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 结合使用

【问题讨论】:

    标签: performance lucene


    【解决方案1】:

    计数器可以是线程安全的,也可以不是线程安全的 - 只需使用静态 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 原生的。

    【讨论】:

    • 也感谢 Guava 的提示!
    猜你喜欢
    • 2011-10-01
    • 1970-01-01
    • 2011-09-23
    • 2012-02-09
    • 2012-02-11
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 2011-06-16
    相关资源
    最近更新 更多