あなたは#3が速くなるのは正しいですが、私はそれが得点のためではないと思います。はるかに速い方法があります、あなたがこれの背後にある推論を気にしない場合は、一番下までスキップしてください。
#1のパフォーマンスの低下は、TopDocsコレクタが優先度キューにドキュメントを保持することに起因します。つまり、スコアでソートするのに時間がかかります。 (あなたもメモリを少し食べますが、int + floatのヒープだけを格納しているので、おそらく最小限に抑えられています)
Luceneがこれをデフォルトで提供しない理由は、すべての結果を探したくない。だからこそあなたが検索するとき、あなたはトップが見つかると言うだけですn結果。これにはstrong theoretical reasonsがあります。 Googleでも「のうちの25を表示すると約件の結果が表示されます。
あなたの忠告は次のとおりです。妥当な数の結果がある場合は、TopDocs.totalHits
を使用すると、パフォーマンスが悪化することはありません。 totalHits
メソッドで問題が発生した場合、私はカスタムコレクターがはるかに良いとは思わない。 (TopDocs.totalHitsはn回n回実行され、カスタムコレクタは線形になります。設定によっては、log n係数が関係する場合もありません)
この機能とTopDocs.totalHits
が遅すぎる場合は、検索語句の文書頻度を調べることをおすすめします。あなたは周波数が独立していると仮定することができるので(p(AとB)= p(A)* p(B))、そこからかなり良い推測をする。これは非常に高速です。なぜなら、各用語の定時検索ですからです。
ありがとう。 Luceneのリリースになるだろうか? – npellow
はい、今後の3.xリリースのブランチです(次のターゲットは3.1です) –
そのリンクは404を返します –