Lucene を使用すると:接頭辞検索を行うと「句が多すぎます」というエラーが発生するのはなぜですか?
質問
しばらく前からプレフィックス検索を行うアプリを使用していました。最近インデックス サイズが大きくなり、一部のプレフィックスが非常に多すぎて lucene で処理できないことが判明しました。それは私に投げ続けました 条項が多すぎます このエラーは、JAR を調べ続け、含まれているコードで実際にブール クエリが使用されていないことを確認し続けていたため、非常にイライラしました。
Too Many Hits 例外のようなものをスローしないのはなぜですか?また、明らかにプレフィックス クエリのみを使用しているのに、ブール クエリの静的最大句の整数を増やすと実際にこのエラーがなくなるのはなぜでしょうか。クエリの実行方法に関して理解できない根本的なものはありますか。密かにブールクエリになっているのでしょうか?
解決
以前にもこれを打ったことがあります。これは、Query.rewrite() を呼び出すと、lucene が内部で多くの (すべて?) ものをブール クエリに変換するという事実と関係があります。
public Query rewrite(IndexReader reader)
throws IOException
Expert: called to re-write queries into primitive queries.
For example, a PrefixQuery will be rewritten into a
BooleanQuery that consists of TermQuerys.
Throws:
IOException
他のヒント
TooManyClauses の API リファレンス ページには、PrefixQuery、FuzzyQuery、WildcardQuery、および RangeQuery がこの方法で (BooleanQuery に) 展開されることが示されています。APIリファレンスに記載されているので、ユーザーが信頼できる動作となるはずです。Lucene はヒット数に任意の制限を設けないため (ドキュメント ID が int である場合を除き)、「ヒット数が多すぎる」という例外は意味をなさない可能性があります。おそらく PrefixQuery.rewrite(IndexReader) は TooManyClauses をキャッチして「プレフィックスが多すぎる」例外をスローするはずですが、現時点ではそのように動作しません。
ちなみに、プレフィックスで検索する別の方法は、PrefixFilter を使用することです。それを使用してクエリをフィルター処理するか、フィルターを ConstantScoreQuery でラップします。
プレフィックス クエリを実行すると、Lucene はクエリに一致するすべての用語を「辞書」内で検索します。1024 (デフォルト) を超える一致がある場合、TooManyClauses-Exception がスローされます。
BooleanQuery.setMaxClauseCount を呼び出して、BooleanQuery ごとに許可される句の最大数を増やすことができます。