2009-04-30 11 views
1

NIOFSDirectoryを使用して約1,000万のオブジェクトが索引付けされています。Luceneパフォーマンス:Searcherからすべてのドキュメントを取得

MatchAllDocsQueryでドキュメントを取得すると、パフォーマンスは他のタイプのクエリ(BooleanQueryなど)よりも大幅に悪化します。私はいくつかのテストを実行し、パフォーマンスは約100倍悪化します。

とにかく上位n個のドキュメントだけに興味があるので、MatchAllDocsQueryを使用せずにSearcherオブジェクトから検索する方法はありますか?

オブジェクトのランダムプロパティでWildcardQueryを使用することも検討していますが、Lucene in Actionは、WildcardQueryに関連付けられた「パフォーマンスの低下」があると主張しています。

大変ありがとうございます。

+0

トップnドキュメントは何に応じていますか?無作為なサンプルだけが必要な場合は、別のテイク(データベース、多分)を使用するか、各ドキュメントに数値識別子を追加して、ルーゼン以外でランダムな選択をしてからタームクエリを使用します。他の制約がありますか?これは何とか間違っているようです。 –

+0

コードを投稿できますか? searcher.search()メソッドは100倍の時間がかかりますか?私は重要なパフォーマンス上の問題なしにMatchAllDocsQueryを使用します。 – bajafresh4life

+0

コメントありがとうございました。 ここにシナリオがあります。私はクラスFooの1000万のオブジェクトを持っており、その95%はフィールドBar(Bar = 1)に同じ値を持っています。 10MMオブジェクトで "Bar:1"を検索すると、発生頻度が非常に遅くなります。その結果、Barの値に基づいてインデックスを分割し、インデックスからBarフィールドを削除しました。 "Bar:2"が必要な場合は、オブジェクトのすべて(または任意のもの)を正しいパーティションに入れるだけです。これは本質的にMatchAllDocsQueryのために設計されていますが、パフォーマンスは受け入れられません。 – Cambium

答えて

1

コメントにYuvalが指摘しているように、トップ・ドキュメントを取得する基準を指定していません。ランダムなドキュメントを取得する場合は、検索を一切行わずにIndexReader.document()を使用するだけです。条件がある場合は、TermQuery(またはQueryParserによって返されたクエリ)を使用できます。

+0

答えをありがとう。 検索者が必要な場合があるため、検索者と一緒に仕事をするように拘束されています。 たとえば、入力クエリが "foo:1、bar:2"の場合、私のパーティションの1つで "foo:1"検索を実行する必要があります。 私は現在searcher.doc(i)メソッドで忙しいです。働いている可能性があります... – Cambium

+0

あなたの質問を前処理することをお勧めします。 barの値を検索すると決して役に立たないようです。したがって、最初のクエリから始めます。 barの値に応じてインデックスを選択します(まだluceneを使用していません)。その後、いくつか残っている場合は、残りのクエリを行います。たとえば、入力クエリが "foo:1、bar:2"である場合、2番目のインデックスを選択し、クエリ "foo:1"を発行します。それがちょうど "bar:2"の場合、Shashikant Koreが示唆しているように、2番目のインデックスからランダムな文書を取得します。 –

関連する問題