Lucene 3.6.1 を使用しています
私は当初、「真の愛」という特定の入力に対して、次のようなクエリを作成するクエリを持っていました。
+(+content:true +content:love)
+(title:"true love"^3.0 ((title:true title:love)^2.0)
(subTitle:true subTitle:love))
title_starts_with:true love*^3.0
+showToPublic:y
クエリ時間:
アプリケーション スターの後の最初のクエリ (ウォームアップなし): 250 ~ 300 ミリ秒
後続のクエリ: 35 ~ 40 ミリ秒
Lucene の Search Speed Tips ページを読んでいると、可能な場合はフィルターを使用することをお勧めしていることがわかりました。
フィルターの使用を検討してください。クエリ句を使用するよりも、キャッシュされたビット セット フィルターを使用して、結果をインデックスの一部に制限する方がはるかに効率的です。これは、大規模なインデックスの多数のドキュメントに一致する制限の場合に特に当てはまります。フィルターは通常、結果をカテゴリに制限するために使用されますが、多くの場合、任意のクエリ句を置き換えるために使用できます。クエリとフィルターの使用の違いの 1 つは、クエリはスコアに影響を与えますが、フィルターは影響を与えないことです。
+showToPublic:y
そのため、クエリの一部を削除し 、 TermsFilterを次のように追加しました。
TermsFilter showToPublicFilter = new TermsFilter();
showToPublicFilter.addTerm(new Term("showToPublic","y"));
indexSearcher.search(booleanQuery, showToPublicFilter, collector);
私が気付いたのは、最初のクエリは大幅に高速化されていますが、後続のクエリは以前よりも大幅に遅くなっていることです。
アプリケーション スターの後の最初のクエリ (ウォームアップなし): 200 ~ 220 ミリ秒
後続のクエリ: 190 ~ 200 ミリ秒
TermsFilter の JavaDoc は、私の現在の状況にとって理想的であると述べているため、これは奇妙だと思います。
このクラスに追加された用語のいずれかと一致するドキュメントのフィルターを構築します。RangeFilter とは異なり、これは必ずしも連続していない複数の用語のフィルタリングに使用できます。たとえば、データベース クエリの結果からの主キーのコレクションや、エンド ユーザーが選んだ「カテゴリ」ラベルの選択などが考えられます。フィルターとして、これは同等のクエリ (多くの「すべき」TermQueries を持つ BooleanQuery) よりもはるかに高速です。
FieldValueFilterも使用してみました(「showToPublic」フィールドに「y」または値がないため):
FieldValueFilter showToPublicFilter = new FieldValueFilter("showToPublic", false);
indexSearcher.search(booleanQuery, showToPublicFilter, collector);
しかし、これではまったく結果が得られません(ただし、確かに高速です)。
だから私の質問は:
- これは正常な動作ですか。つまり、フィルタは同等のブール クエリよりも常に高速であるとは限りません。
- 使用する必要がある他のフィルターはありますか (私はそれらすべてを調べましたが、このシナリオに適用できるのは TermsFilter および/または FieldValueFilter だけのようです)。
- ここで FieldValueFilter が機能しないのはなぜですか?