2009-05-11 9 views
3

私は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"); 
    } 
} 

答えて

1

、Luceneのは、用語間のOR関係を前提とし、その最初のクエリは

+(foo OR -bar) 
に相当します(デフォルトのフィールドで)「foo」を含むか、または2番目のクエリでは、「バー」

を含まないドキュメントにマッチします、「+」を作る必要な「バー」を、作る

それは「-bar」「バー」

+0

おかげで、やる問い合わせるかを理解することは非常に便利です! –

0

ルークhttp://www.getopt.org/luke/を含まないすべての文書と一致するまで低減することができるので、冗長オプションの「fooが」理にかなって

+0

このツールは私が投稿した質問で私を助けませんでしたが、私が知っている多くの貴重な診断情報を提供します。ありがとう、私は私のチームにそれを転送しました。 –

関連する問題