2009-06-04 46 views

回答

6

我认为你指的是使用QueryParser对象解析布尔查询,是否正确? Lucene query syntax documentation应该有你需要的一切。

+0

它的作品。谢谢 – Shashi 2009-06-04 09:59:41

0

BooleanQuery. BooleanQuery是布尔子句的容器,它是可选的,必需的或禁止的子查询。您可以在条款通常添加到BooleanQuery利用,看起来像一个API的方法:

公共无效添加(查询的查询,需要布尔,布尔禁止)

2

根据该文件,应创建一次布尔查询通过BooleanQuery.QueryBuilder,然后被认为是不可变的。看看BooleanQuery.Builder.add(org.apache.lucene.search.BooleanClause)

的代码示例可以通过http://programtalk.com/java-api-usage-examples/org.apache.lucene.util.QueryBuilder/ 和一个例子给出的发现是:

public Query parse(Type type, String fieldName, Object value) throws IOException { 
    final String field; 
    MappedFieldType fieldType = context.fieldMapper(fieldName); 
    if (fieldType != null) { 
     field = fieldType.name(); 
    } else { 
     field = fieldName; 
    } 
    /* 
    * If the user forced an analyzer we really don't care if they are 
    * searching a type that wants term queries to be used with query string 
    * because the QueryBuilder will take care of it. If they haven't forced 
    * an analyzer then types like NumberFieldType that want terms with 
    * query string will blow up because their analyzer isn't capable of 
    * passing through QueryBuilder. 
    */ 
    boolean noForcedAnalyzer = this.analyzer == null; 
    if (fieldType != null && fieldType.tokenized() == false && noForcedAnalyzer) { 
     return blendTermQuery(new Term(fieldName, value.toString()), fieldType); 
    } 
    Analyzer analyzer = getAnalyzer(fieldType); 
    assert analyzer != null; 
    MatchQueryBuilder builder = new MatchQueryBuilder(analyzer, fieldType); 
    builder.setEnablePositionIncrements(this.enablePositionIncrements); 
    Query query = null; 
    switch(type) { 
     case BOOLEAN: 
      if (commonTermsCutoff == null) { 
       query = builder.createBooleanQuery(field, value.toString(), occur); 
      } else { 
       query = builder.createCommonTermsQuery(field, value.toString(), occur, occur, commonTermsCutoff, fieldType); 
      } 
      break; 
     case PHRASE: 
      query = builder.createPhraseQuery(field, value.toString(), phraseSlop); 
      break; 
     case PHRASE_PREFIX: 
      query = builder.createPhrasePrefixQuery(field, value.toString(), phraseSlop, maxExpansions); 
      break; 
     default: 
      throw new IllegalStateException("No type found for [" + type + "]"); 
    } 
    if (query == null) { 
     return zeroTermsQuery(); 
    } else { 
     return query; 
    } 
}