在Lucene中嵌套搜索而不复制关键字

时间:2011-11-04 15:26:01

标签: java lucene lucene.net

2 个答案:

答案 0 :(得分:1)

我不了解您的用例,但您听起来好像在询问BooleanQuery API。您可以通过调用getClauses来获取查询的条款。

一个简单的例子:

BooleanQuery bq = new BooleanQuery();
bq.add(new TermQuery(new Term("field1","a")), BooleanClause.Occur.SHOULD)
bq.add(new TermQuery(new Term("field1","b")), BooleanClause.Occur.SHOULD)

BooleanClause[] clauses = bq.getClauses();

编辑:也许你只是要求搜索算法。在伪代码中:

generate_query (qs_that_matched, qs_that_didnt_match, level):
   new_query = qs_that_matched AND level:qs_that_didnt_match
   qs_still_unmatched = ...
   qs_which_just_matched = ...
   if qs_still_unmatched != null:
      return generate_query(qs_that_matched AND qs_which_just_matched, qs_still_unmatched, level+1)
   else:
      return qs_that_matched AND qs_which_just_matched

答案 1 :(得分:0)

最后,我构建了一个QueryTree类并将查询存储在树结构中。它存储对带有查询的函数的引用,要引入该查询的术语列表,是否应该AND和OR这些术语,以及子列表(代​​表匹配术语的唯一组合)。

要执行下一级搜索,我只需在树中最深的节点上调用Evaluate(Func<string, QueryParser.Operator, Query> newQuery),并引用一个带有术语和运算符的函数,并为该组逻辑返回正确的查询。然后Evaluate函数针对已传递给它的不匹配术语列表和所有祖先查询的结果集(通过与父对象进行AND运算,与其父对象进行AND运算等)测试新查询。然后,它使用GetHitTerms为每组匹配术语创建子项,并为孩子提供不匹配的术语。对每个级别的搜索重复。


我怀疑有更好的方法可以做到这一点 - 我甚至没有看到Xodarap提到的Bobo,而且我从来没有真正得到过切面的搜索(根据denis)工作。但是,它正在运行,这意味着它是时候转移到网站的其他方面了。