【问题标题】:Get field names from a lucene query string从 lucene 查询字符串中获取字段名称
【发布时间】:2009-03-12 15:21:59
【问题描述】:

如果我有一个 Lucene 查询字符串

"field1:value1 myField:aValue"

有没有办法让 Lucene 解析这个,以便我可以获取术语查询?
我最终希望能够将字段名称及其值返回到我的视图数据中,以便我可以在回发时将它们填充到我的文本框中。

【问题讨论】:

    标签: c# .net asp.net-mvc lucene


    【解决方案1】:

    lucene 的QueryParser 会将该字符串转换为包含两个TermQuery 子句的BooleanQuery。您需要使用BooleanQuerygetClauses 方法来获取术语查询。

    【讨论】:

      【解决方案2】:

      我遇到了类似的要求,但查询可以是通用的。想出了下面的方法(在java中实现)。完整代码https://github.com/atulsm/Test_Projects/blob/master/src/TestLuceneQueryStringFields.java

      private static Set<String> calculateQueryFieldsRecursively(Query query) throws ParseException{
          Set<String> fields = new HashSet<String>();
      
          if(query instanceof TermQuery){
              TermQuery tQuery = (TermQuery)query;            
              Term term = tQuery.getTerm();
              fields.add(term.field());
          } else if(query instanceof BooleanQuery){
              BooleanQuery bQuery = (BooleanQuery)query;
              List<BooleanClause> clauses = bQuery.clauses();
              for(BooleanClause clause: clauses){
                  Query innerQuery = clause.getQuery();
                  Set<String> innerFields = calculateQueryFieldsRecursively(innerQuery);
                  if(innerFields == null){
                      return null;
                  }else{
                      fields.addAll(innerFields);
                  }
              }
          } else { //TODO support more lucene query types
              return null;
          }   
          return fields;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-24
        • 2011-12-17
        • 2015-07-24
        • 2017-05-19
        相关资源
        最近更新 更多