Lucene BooleanQuery - 必须出现在两列中的一列中

时间:2014-06-22 17:37:06

标签: azure lucene indexing

不确定如何在Lucene中格式化查询。场景是搜索词必须出现在两列中的一列中(其中一列很好)。

boolQuery.Add(query1, Occur.MUST)  'this one is fine
boolQuery.Add(query2, Occur.SHOULD)
boolQuery.Add(query3, Occur.SHOULD)

即使第2列和第3列中根本不存在搜索词,也会显示结果。

boolQuery.Add(query2, Occur.MUST)
boolQuery.Add(query3, Occur.SHOULD)

当第3列中存在搜索词而第2列中没有搜索词时,不会显示结果。

如何格式化查询以便我得到相同的信息:

where  column 1= val1 and (column 2 = val2 or column 3 = val2)

2 个答案:

答案 0 :(得分:0)

正如顾名思义,必须使事件成为强制性的。应该是可选的。第一个布尔查询基本上只匹配第一个子句命中的文档,但如果它们中的任何一个可以被第二个或第三个子句命中,它们将得分更高。为了使结果与您期望的linq(我假设它是什么)语句匹配,这应该有效(使用java)。

BooleanQuery q = new BooleanQuery();

BooleanQuery subQuery = new BooleanQuery();
subQuery.addClause(new BooleanClause(q2,Occur.SHOULD));
subQuery.addClause(new BooleanClause(q3,Occur.SHOULD));

q.addClause(new BooleanClause(q1, Occur.MUST));
q.addClause(new BooleanClause(subQuery,Occur.MUST));

您的混淆可能源于查询API实现必须和应该作为一元运算符的事实,而在传统编程语言中ANDOR是二元运算符

答案 1 :(得分:0)

我使用查询语法解决了类似的问题:

+(col1:{query} OR col2:{query})

这将返回至少一个字段中具有值{query}的文档。

(注意:我使用的课程查询 MultiFieldQueryParser