- - PR -
Lucene 2.1 で ワイルドカードを使用した際の BooleanQuery$TooManyClauses の回避方法
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2007-03-02 12:10
お世話になります Lucene 2.1 を使った検索システムを作成中です。
およそ 50万件のデータにクエリーを投げるのですが、 ワイルドカートを指定した検索を行おうとすると、 Exception in thread "main" org.apache.lucene.search.BooleanQuery$TooManyClauses maxClauseCount is set to 1024 という例外が発生してしまいます。 これは BooleanQuery.setMaxClausesCount() で設定すれば回避できるにはできるのですが、検索時間がかかるため、あまり好ましくないと思います。 そのため、フィルターを使った処理を行おうと思ったのですが、 どうも上手くいきません、 とりあえず、以下のようなコードを現在構築中です args[0]:検索フィールド args[1]:検索クエリー (例: test*) ---------------------------------------------------------------------- //パーサーの作成 QueryParser parser = new QueryParser(args[0], analyzer); //クエリーの作成 Query query = parser.parse(args[1]); //複数のクエリを連結するのでBooleanQueryを構築 BooleanQuery bQuery = new BooleanQuery(); bQuery.add(query,BooleanClause.Occur.MUST); hits = searcher.search(bQuery); ---------------------------------------------------------------------- これですと 先に示しました例外がでますので 以下のように Filter を設定しようとしています --------------------------------------------------------------------- Term term = new Term(args[0], args[1]); Filter filter = new PrefixFilter(term); PrefixQuery pQuery = new PrefixQuery(term); //FilteredQuery fQuery = new FilteredQuery(query,filter); bQuery.add(pQuery,BooleanClause.Occur.MUST); ---------------------------------------------------------------------- 検索を実行するときにも hits = searcher.search(bQuery,filter); のように幾つかフィルターを試してみましたが、上手いこと動いてくれません。 どうかご教授くださいますようお願いいたします |
|
投稿日時: 2007-08-15 08:52
はじめまして、小林といいます。
ボクも同じ問題にあたりました。それを解決できたので方法を記述します。 まず原因ですが、条件検索のためのHeapサイズが足りないとのことです。 そこで、その設定を変更することがひとつ。 BooleanQuery.setMaxClauseCount(409600); デフォルトは1024です。 これだけではおそらくNGでしょう。 VMにHEAPがないと起こられるはずです。 今度はVMパラメータで -Xmx512M などとつけてください。 ボクはこれで動作できました。 |
1