答案 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)工作。但是,它正在运行,这意味着它是时候转移到网站的其他方面了。