不确定如何在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)
答案 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实现必须和应该作为一元运算符的事实,而在传统编程语言中AND
和OR
是二元运算符
答案 1 :(得分:0)
我使用查询语法解决了类似的问题:
+(col1:{query} OR col2:{query})
这将返回至少一个字段中具有值{query}的文档。
(注意:我使用的课程查询和 MultiFieldQueryParser )