- PR -

Lucene 2.1 で ワイルドカードを使用した際の BooleanQuery$TooManyClauses の回避方法

1
投稿者投稿内容
葉月要
会議室デビュー日: 2006/06/02
投稿数: 11
投稿日時: 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
投稿数: 1
投稿日時: 2007-08-15 08:52
はじめまして、小林といいます。

ボクも同じ問題にあたりました。それを解決できたので方法を記述します。

まず原因ですが、条件検索のためのHeapサイズが足りないとのことです。
そこで、その設定を変更することがひとつ。

BooleanQuery.setMaxClauseCount(409600);

デフォルトは1024です。

これだけではおそらくNGでしょう。
VMにHEAPがないと起こられるはずです。
今度はVMパラメータで -Xmx512M などとつけてください。

ボクはこれで動作できました。
1

スキルアップ/キャリアアップ(JOB@IT)