2

この質問への回答を読んだところ、ユーザーの介入なしにユーザーの検索クエリの結果をさらに絞り込む方法が 2 つあります。

  1. クエリをサイレントに変更する
  2. Lucene フィルターの適用

上記の両方の手法を実装レベルでは理解していますが、概念レベルでは理解していません。次の質問があります。

  1. Lucene がフィルターを適用する順序は何ですか。クエリの前ですか、それとも後ですか? 私が名前で行くなら、それは後にあるべきだと思います。
  2. あるテクニックを他のテクニックよりも優先して使用するのはいつですか?
  3. 機能的な違いがない場合、上記の 2 つの手法の間にパフォーマンスの違いはありますか?
  4. ドキュメントに関連付けられたユーザー権限があり、ユーザーが検索結果に自分のドキュメントのみを表示する必要がある場合、どの手法がより適していますか?

ありがとう。

4

3 に答える 3

3

Lucene がフィルターを適用する順序は何ですか。

それは本当に問題ですか?n 個の独立したフィルターがある場合、全体的な結果は、AND 関数を実行しているこれらのフィルターの積になります。

クエリの前ですか、それとも後ですか?

厳密に言えば、彼らは手を取り合って働いています。IndexSearcher.java(Lucene ver 3.4)からの抜粋です。

while (true) {
  if (scorerDoc == filterDoc) {
    // Check if scorer has exhausted, only before collecting.
    if (scorerDoc == DocIdSetIterator.NO_MORE_DOCS) {
      break;
    }
    collector.collect(scorerDoc);
    filterDoc = filterIter.nextDoc();
    scorerDoc = scorer.advance(filterDoc);
  } else if (scorerDoc > filterDoc) {
    filterDoc = filterIter.advance(scorerDoc);
  } else {
    scorerDoc = scorer.advance(filterDoc);
  }
}

このコードを理解する方法は、フィルター/スコアラーの両方の反復子が前方に進み、フィルターがスコアラーよりも進んでいる場合はスコアラーが使用され、その逆も同様であるということです。

あるテクニックを他のテクニックよりも優先して使用するのはいつですか?

機能的な違いがない場合、上記の 2 つの手法の間にパフォーマンスの違いはありますか?

私は通常、クエリにビットを追加することを好みます。これは、クエリ後のフィルタリングよりも高速であると考えているからです (たとえ を使用したとしてもQueryWrapperFilter)。ただし、顧客が Lucene クエリ文字列インジェクションを行う方法がないことを確認する必要があります。場合によっては、パフォーマンスへの影響はごくわずかであり、クエリ要素を追加するよりも結果セットをフィルター処理する方が簡単なため、フィルター オプションが優先されます。

ドキュメントに関連付けられたユーザー権限があり、ユーザーが検索結果に自分のドキュメントのみを表示する必要がある場合、どの手法がより適していますか?

この質問を参照してください。以前に議論されています。

于 2013-01-21T11:24:02.240 に答える
1

特定の基準が変更されず、各インデックス更新の間に複数回再利用される場合Filterは、通常は a が適しています。

たとえば、私は通常、ユーザーのアクセス許可にフィルターを使用します。各インデックスの更新後、キャッシュされたフィルターは次の更新まで一度だけ再計算されます。インデックスがリアルタイムでない場合、これは非常にうまく機能します。

フィルターのもう 1 つの使用例は、BooleanQuery.TooManyClauses例外を回避することです。

于 2013-01-21T15:00:46.787 に答える
0

クエリにブール句を追加するか、フィルターを使用するかで迷っている場合は、おそらくフィルターを使用する必要があることを意味します。

フィルターはスコアリングを必要としないため、ブール句よりも優れています。結果として、それらはより高速になり、キャッシュすることができます (同じ条件で頻繁にフィルタリングする場合に非常に便利です)。

Lucene は、クエリの後にフィルターを適用しません。それどころか、最初にフィルターをチェックして、とにかくフィルターで除外されるドキュメントをスコア付けしないようにします (スコアリングにはコストがかかる可能性があります)。

于 2013-01-21T14:59:39.260 に答える