1

約 5 億のドキュメントの 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と例を読みましたが、設定が明確ではありませんとCounter組み合わせて使用​​する方法numTicks

4

1 に答える 1

2

Counter は、スレッド セーフでもそうでなくてもかまいません。静的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 に答える