2016-04-18 6 views
0

検索と挿入に関してLucene.Net 3.0.3でいくつかのテストを実行しました。Lucene検索のパフォーマンス - DOCとDEFAULTのソート

テストのために、実際の英語の単語に基づいてキーワードアナライザーとテキストジェネレーターを使用しました。

インデックスが1000万のランダムな文を検索している間に約800万のドキュメントにヒットした場合、検索が完了するまでに25分かかります。 (デフォルトのソート)

私たちは、ソートを文書化するために検索を変更した場合:

searcher.Search(query, null, int.MaxValue, new Sort(new SortField(null, SortField.DOC, true))); // boolean query 

検索のみを完了するまでに数秒かかります。

何がありますか? デフォルトのソートは関連性に基づいていますか?なぜそれはそのような巨大な影響を持っていますか?

また、int.MaxValueからのヒット数を50とすると、検索が数秒に短縮されます。

インデックスで見つかった最初の50ヒットのみを取って残りを無視していますか?

答えて

1

私はあなたの推測が正しいと信じています。ドキュメントID順で並べ替えると、一致するすべてのドキュメントをスコアリングする必要はありませんが、スコアリングのソートとは対照的に、どの文書が最もよくマッチするかを知るためには、文書を採点する必要があります。

あなたが質問しなければならない質問のようですが、とにかく検索するのに時間がかかるのはなぜですか?

あなたが書いたことに基づいて、私は推測できると思う:ではありません。フルテキストのためにKeywordAnalyzerを使用してください。あなたは、フルテキストをキーワードとして索引付けしていて、おそらく二重ワイルドカードや正規表現などを使用して文を検索しているように思えます。 それをやめてください。あなたはLuceneを忘れるかもしれませんし、Luceneにとにかく強制するものなので、古い逐次検索をコードしてください。検索のニーズに実際に対応するアナライザー(StandardAnalyzerまたはEnglishAnalyzer)を使用して、フレーズクエリを使用してフレーズや文章を検索します。

+0

この特定のケースでは、1つのフィールドにキーワードアナライザ、別のフィールドに標準アナライザを使用して全文を索引付けしています。入ってくる検索が100%正確でなければならない場合、私はキーワードアナライザによってインデックスされた特定のフィールドを検索します。あなたはこのケースにどのようにアプローチしますか? –

+0

@pelican_george - 100%正確とはどういう意味ですか?クエリがフィールドの*テキスト全体*と一致する必要がある場合は、キーワード分析が適切です。クエリがフィールドの一部と正確に一致しなければならない場合(つまり、現在のクエリでワイルドカードを使用する必要がある場合)、PhraseQueryが最初に考えられます。分析のための他のアプローチも有用である。 – femtoRgon

+0

私はクエリがフィールドのテキスト全体と一致しなければならないことを意味しました。入力いただきありがとうございます。 –