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 クエリ文字列インジェクションを行う方法がないことを確認する必要があります。場合によっては、パフォーマンスへの影響はごくわずかであり、クエリ要素を追加するよりも結果セットをフィルター処理する方が簡単なため、フィルター オプションが優先されます。
ドキュメントに関連付けられたユーザー権限があり、ユーザーが検索結果に自分のドキュメントのみを表示する必要がある場合、どの手法がより適していますか?
この質問を参照してください。以前に議論されています。