11

私のテストでは、termquery とワイルドカード クエリで構成されるブール クエリからヒットを取得しようとしたときに、Too Many Clauses 例外が突然発生しました。

BooleanQuery.SetMaxClauseCount() を増やすように提案されているネットや見つかったリソースを検索しました。
これは私には怪しいように聞こえます..何にアップすればよいですか?この新しいマジック ナンバーがクエリに十分であることをどのように信頼できますか? すべての地獄が解き放たれる前に、この数をどこまで増やすことができますか?

一般的に、これは解決策ではないと感じています。もっと深い問題があるに違いない..

クエリは +{+companyName:mercedes +paintCode:a*} で、インデックスには約 250 万のドキュメントがあります。

4

2 に答える 2

3

クエリのpaintCode:a *部分は、「a」で始まるすべてのpaintCodeのプレフィックスクエリです。それはあなたが目指していることですか?

Luceneは、プレフィックスクエリを、プレフィックスに一致する可能性のあるすべての用語を含むブールクエリに拡張します。paintCodeあなたの場合、明らかに「a」で始まる1024を超える可能性のあるsがあります。

プレフィックスクエリが役に立たないように聞こえる場合は、真実からそう遠くはありません。

プレフィックスクエリを使用しないように、インデックススキームを変更することをお勧めします。例で何を達成しようとしているのかわかりませんが、最初の文字でペイントコードを検索する場合は、paintCodeFirstLetterフィールドを作成し、そのフィールドで検索します。

追加した

必死で、部分的な結果を受け入れる意思がある場合は、ソースから独自のLuceneバージョンを作成できます。PrefixQuery.javaファイルとMultiTermQuery.java、の両方に変更を加える必要がありますorg/apache/lucene/searchrewrite両方のクラスのメソッドで、行を変更します

query.add(tq, BooleanClause.Occur.SHOULD);          // add to query

try {
    query.add(tq, BooleanClause.Occur.SHOULD);          // add to query
} catch (TooManyClauses e) {
    break;
}

私は自分のプロジェクトのためにこれを行いました、そしてそれはうまくいきます。

Luceneを変更するというアイデアが本当に気に入らない場合は、独自のPrefixQueryバリアントと独自のQueryParserを作成できますが、それがはるかに優れているとは思いません。

于 2009-03-05T15:05:08.417 に答える