私はLucene for Javaを使用していますが、わかりにくいクエリを実行するときにエンジンが何をするかを把握する必要があります。次のクエリを取る:Luceneの検索クエリでネストされた禁止/要求演算子
+(foo -bar)
私は入力を解析するQueryParserを使用している場合は、私はこのようになりますBooleanQueryオブジェクトを取得:
org.apache.lucene.search.BooleanQuery:
org.apache.lucene.search.BooleanClause(required=true, prohibited=false):
org.apache.lucene.search.BooleanQuery:
org.apache.lucene.search.BooleanClause(required=false, prohibited=false):
org.apache.lucene.search.TermQuery: foo
org.apache.lucene.search.BooleanClause(required=false, prohibited=true):
org.apache.lucene.search.TermQuery: bar
のためのLuceneを見て何?それは 'foo'を含んでいなければならないが、 'bar'を含むことができないドキュメントですか?
-(foo +bar)
「foo」を含むことはできず、「bar」を含むことができないドキュメントはありますか?または 'foo'を含むことはできませんが、 'bar'を含んでいなければなりませんか?
それがいずれかを助けている場合、ここで私はQueryParser結果覗いていたもので、デフォルトで
QueryParser parser = new QueryParser("contents", new StandardAnalyzer());
Query query = parser.parse(text);
debug(query, 0);
public static void debug(Object o, int depth) {
for(int i=0; i<depth; i++) System.out.print("\t");
System.out.print(o.getClass().getName());
if(o instanceof BooleanQuery) {
System.out.println(":");
for(BooleanClause clause : ((BooleanQuery)o).getClauses()) {
debug(clause, depth + 1);
}
} else if(o instanceof BooleanClause) {
BooleanClause clause = (BooleanClause)o;
System.out.println("(required=" + clause.isRequired() + ", prohibited=" + clause.isProhibited() + "):");
debug(clause.getQuery(), depth + 1);
} else if(o instanceof TermQuery) {
TermQuery term = (TermQuery)o;
System.out.println(": " + term.getTerm().text());
} else {
throw new IllegalArgumentException("Unknown object type");
}
}
おかげで、やる問い合わせるかを理解することは非常に便利です! –