8

しばらくの間、プレフィックス検索を行うアプリがありました。最近、インデックスのサイズが大きくなり、いくつかのプレフィックスがあまりにも多くて lucene が処理できないことが判明しました。Too Many Clausesエラーが表示され続け、JAR を確認し続け、含まれているコードのいずれも実際にブールクエリを使用していないことを確認したため、非常にイライラしました。

Too Many Hits 例外のようなものがスローされないのはなぜですか? そして、ブールクエリの静的な最大句の整数を増やすと、実際にこのエラーがなくなるのはなぜですか? 私が理解していないクエリの実行方法に基本的なものはありますか? それらがひそかにブールクエリになるということですか?

4

3 に答える 3

5

これは以前打ったことがあります。Query.rewrite() を呼び出すと、Lucene が隠れて多くの (すべて?) ものをブールクエリに変換するという事実に関係しています。

出典: http://web.archive.org/web/20110915061619/http://lucene.apache.org:80/java/2_2_0/api/org/apache/lucene/search/Query.html

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
于 2008-08-12T17:58:08.627 に答える
3

TooManyClauses の API リファレンス ページは、PrefixQuery、FuzzyQuery、WildcardQuery、および RangeQuery がこのように (BooleanQuery に) 展開されることを示しています。APIリファレンスにあるので、ユーザーが頼りにできる挙動であるはずです。Lucene では、(ドキュメント ID が int である場合を除いて) ヒット数に任意の制限を設けないため、「ヒット数が多すぎる」という例外は意味をなさない場合があります。おそらく、PrefixQuery.rewrite(IndexReader) は TooManyClauses をキャッチして「プレフィックスが多すぎます」という例外をスローする必要がありますが、現時点ではそのようには動作しません。

ちなみに、プレフィックスで検索するもう 1 つの方法は、PrefixFilter を使用することです。クエリをフィルター処理するか、ConstantScoreQuery でフィルターをラップします。

于 2008-09-29T20:44:09.653 に答える
0

プレフィックスクエリを実行すると、Luceneはクエリに一致する「辞書」内のすべての用語を検索します。1024を超える(デフォルトで)一致する場合、TooManyClauses-Exceptionがスローされます。

BooleanQuery.setMaxClauseCountを呼び出すと、BooleanQueryごとに許可される句の最大数を増やすことができます。

于 2008-09-15T20:07:19.003 に答える