2008-08-12 21 views
7

しばらくの間、プレフィックス検索をしていたアプリを持っていました。最近、インデックスのサイズが増加し、いくつかのプレフィックスは、ルーセンが扱うにはあまりにも多くの量がかかっていたことが判明しました。それはToo Many Clausesというエラーを投げかけていました。私は自分のJARを見て、含まれているコードのどれもブールクエリを実際に使用していないことを確認していたので、非常に不満でした。Luceneと:プレフィックス検索を行うと、なぜ多すぎる句がエラーになるのですか?

なぜ「Too Many Hits」のような例外がスローされないのですか?なぜ、私は間違いなくプレフィックスクエリを使用しているときに、ブール値のクエリの静的なmax節の値を増やすと、実際にはこのエラーはなくなりますか?私が理解していないクエリがどのように実行されるかの基本的なものがありますか?彼らは密かにブールクエリになるのですか?

答えて

5

私はこれまでにヒットしました。接頭辞を実行している場合http://lucene.apache.org/java/2_2_0/api/org/apache/lucene/search/Query.html#rewrite(org.apache.lucene.index.IndexReader)

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 
+1

この 'Query.rewrite()'変換*は、実際にクエリが実行される前に行われますか? (それは妥当と思われる、クエリが実行される前にプリミティブクエリに分解する必要があります) – KajMagnus

0

:それはあなたがよりQuery.rewrite()

を呼び出すときのLuceneは、カバーの下に、ブールクエリに多くの(?すべて)のものを回すという事実に関係していますクエリでは、Luceneはクエリに一致する "辞書"内のすべての用語を検索します。 1024以上(デフォルト)が一致すると、TooManyClauses-Exceptionがスローされます。

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

+0

それは意味がありますが、私の問題は、私はPrefixQueryが実際にBooleanQueryになったことを知る方法がなかったということでした。 – dlamblin

3

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

ところで、プレフィックスで検索する別の方法は、PrefixFilterを使用することです。クエリをフィルタでフィルタリングするか、ConstantScoreQueryでフィルタをラップします。

+0

'PrefixFilter'もboolean句に展開されていますか? (あるいは、どういうふうに実装されていますか?) – KajMagnus

関連する問題