2

ユーザーの検索結果に、特定の検索クエリに一致するものがいくつあったかについてのアイデアを含めたいと考えています。

しかし、ユーザーの検索ログを少し調査して観察した結果、ログに記録されたクエリの速度と結果の合計数との間に直接的な相関関係があることに気付き、これはtotalHitsプロパティにアクセスしているためであると判断しました。値を返すために、結果セット全体を反復処理します。

おおよその値を返すだけでもよろしいかと思いますが、パフォーマンスに著しく影響を与えずにこれを計算する良い方法があるかどうかはわかりません。検索が一致した結果の数の大まかなアイデアをユーザーに提供せずに、一見底なしの結果セットをユーザーの前にダンプしたくはありません。

助言がありますか?

4

4 に答える 4

3

ブールクエリを使用すると、近似を試みることができます。

  • |A or B| / |D| = ((|A| / |D|) + (|B| / |D|)) / 2
  • |A and B| / |D| = (|A| / |D|) * (|B| / |D|)

ここAで、 とBは 2 つの用語で、|D|はドキュメントの総数です。これは基本的に独立性を前提としています。

このrewriteメソッドを使用して、任意のクエリをブール クエリに書き換えることができます。

これを行うより良い方法は実際にはありませんが、この仮定は実際にはそれほど悪くないことがわかりました。ただし、ドキュメントの数が非常に少ない場合は、悪い答えが得られる可能性があります。

編集: jpountz が指摘するように、私の OR の計算は間違っています。次のようにする必要があります。

P(A U B) = 1 - P(~(AUB)) 
         = 1 - P((~A) & (~B))
         = 1 - P(~A)P(~B)
         = 1 - (1 - P(A))(1 - P(B))
         = 1 - (1 - P(A) - P(B) + P(A)P(B))
         = P(A) + P(B) - P(A)P(B)
于 2012-04-09T20:12:48.680 に答える
2

Luceneの最近のバージョンには、TotalHitCountCollectorと呼ばれるカウントの計算専用のコレクターがあります。

通常、他のコレクターよりも高速です。理由は次のとおりです。

于 2012-04-10T07:47:38.460 に答える
1

まず、それを実行するクエリの種類を知っておく必要があります。たとえば、具体的な用語(用語のdocFreq)を含むドキュメントがいくつあるかをすばやく確認する方法があります。したがって、3つの用語の接続詞があるとすると、3つのdocFreqsのうち最小のもので近似できます。

于 2012-04-09T19:51:45.007 に答える
0

についてtotalHits:これは、検索が完了した後にluceneによって設定された値です。プロパティにアクセスしても余分な作業は行われず、すべての結果が繰り返されるわけではありません。

検索を行うとき、Lucene は常にこれを設定します (そして、結果の合計数を認識します)。要求された上位 N の結果を (指定した内容に応じてスコアまたは並べ替えフィールドで) 得るために、それを行う必要があります。

そのため、実際には特定の状況で検索が遅くなります。

どのようなクエリが遅いかを確認しましたか? 遅い結果と多くの結果の組み合わせは、ある種のワイルドカード/ファジー クエリがあることを示している可能性があります。

検索速度を向上させるための一般的な情報は、http://wiki.apache.org/lucene-java/ImproveSearchingSpeedにあります。

lucene-2.9.2 タグに基づいて、可能であれば最新バージョンにアップグレードしてから、再度測定することをお勧めします。2.9.2以降、多くの変更/改善がありました

于 2012-04-10T17:29:51.500 に答える