【问题标题】:Lucene BooleanQueryLucene 布尔查询
【发布时间】:2010-10-31 06:25:38
【问题描述】:

如何在 Lucene Search 中将 booleanQuery 与 StandardAnalyzer 一起使用?

【问题讨论】:

    标签: hibernate search lucene hibernate-search analyzer


    【解决方案1】:

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

    【讨论】:

      【解决方案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;
          }
      }
      

      【讨论】:

        【解决方案3】:

        BooleanQuery. BooleanQuery 是一个布尔子句的容器,它们是可选的、必需的或禁止的子查询。您通常可以使用如下 API 方法向 BooleanQuery 添加子句:

        public void add(查询查询,需要布尔值,禁止布尔值)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-12-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多