2009-06-10 16 views
5

デフォルトの結合演算子をORとして残すLuceneを使用するコードがあります。これをANDに変更したいと思います。コードの中には単純なQueryParserを使用しているものもあります。これらのインスタンスでsetDefaultOperatorを呼び出すことができます。Lucene MultiFieldQueryParserとのデフォルトの接続を変更する方法

残念ながら、コードではMultiFieldQueryParserを使用し、静的な "解析"メソッド(String、String []、BooleanClause.Occur []、Analyzer)を呼び出します。したがって、setDefaultOperatorは役に立ちません。それはインスタンスメソッドだからです。

同じパーサーを使用したままで、デフォルトの接続詞を変更する方法はありますか?

答えて

8

MultiFieldQueryParserクラスは、QueryParserクラスを拡張します。おそらく、静的メソッドに頼るのではなく、単にこのクラスのインスタンスを設定することができますか? BooleanClause.Occurの値を実際に設定する必要がある場合は、後でそれを行うことができます。

String queryString = ...; 
String[] fields = ...; 
Analyzer analyzer = ...; 

MultiFieldQueryParser queryParser = new MultiFieldQueryParser(fields, analyzer); 
queryParser.setDefaultOperator(QueryParser.Operator.AND); 

Query query = queryParser.parse(queryString); 

// If you're not happy with MultiFieldQueryParser's default Occur (SHOULD), you can re-configure it afterward: 
if (query instanceof BooleanQuery) { 
    BooleanClause.Occur[] flags = ...; 
    BooleanQuery booleanQuery = (BooleanQuery) query; 
    BooleanClause[] clauses = booleanQuery.getClauses(); 
    for (int i = 0; i < clauses.length; i++) { 
     clauses[i].setOccur(flags[i]); 
    } 
} 
+0

ありがとうございます。欠落していたステップは、後でOccur値を構成する方法でした。 私が取り組んでいるもう1つのアプローチは、MultiFieldQueryParser.parseのコードが小さいため、アプリケーションに貼り付けて変更するだけかもしれません。 QueryParserインスタンス自体が作成されるので、デフォルトの演算子を設定するためにそれを微調整することができます。 –

+0

繰り返しループ内では、次のコマンドを使用してフィールドごとの結合を変更することもできます。 QueryParser = new QueryParser(Version.YOUR_VERSION、fields [i]、new YourAnalyzer()); parser.setDefaultOperator(QueryParser.Operator.AND);clause.setQuery(parser.parse(clause.getQuery()。toString(fields [i]))); – Ina

関連する問題