个人我在查询中遇到问题,想把AND子句放在一个术语中,但是我没有得到并尝试搜索没有成功。
按照示例返回查询(我用来测试Luke条件,结果不同)
builder.bool()
.should(builder
.bool()
.should(builder.keyword()
.onFields("campo01", "campo02", "campo03")
.matching(query).createQuery())
.should(builder.keyword().wildcard().onField("campo01")
.matching("*" + query + "*").createQuery())
.should(builder.keyword().wildcard().onField("campo02")
.matching("*" + query + "*").createQuery())
.should(builder.keyword().wildcard().onField("campo03")
.matching("*" + query + "*").createQuery()).createQuery())
.must(builder.keyword().onField("campo04").matching(0).createQuery())
.createQuery();
此代码生成以下查询lucene:
(((campo01:teste campo02:test campo03:teste) campo01:*teste* campo02*teste* campo03:*teste*) +campo04:0)
但是,此查询返回的结果大于预期。与卢克进行的测试意识到必须不是理想的,需要成为AND。
(((campo01:teste campo02:test campo03:teste) campo01:*teste* campo02*teste* campo03:*teste*) AND campo04:0)
因此结果是正确的,但我无法使构建查询创建此结果。
任何人都可以提供帮助或有任何疑问。我真正想要的是将AND条件放在特定的字段中。
答案 0 :(得分:2)
使用'must'和'should'子句你有正确的想法。您可以构造一个查询,使用它们有效地创建逻辑AND。你错过了一件事。 AND的结构,例如:
query1 AND query2
将是:
+query1 +query2
你的例子在第一个查询中错过了'+'或Must子句,所以虽然第二个是必需的,但第一个不是,但它会影响结果权重。
所以,具体来说,你想要的是
builder.bool()
.must(builder
.bool()
.should(builder.keyword()
.onFields("campo01", "campo02", "campo03")
.matching(query).createQuery())
.should(builder.keyword().wildcard().onField("campo01")
.matching("*" + query + "*").createQuery())
.should(builder.keyword().wildcard().onField("campo02")
.matching("*" + query + "*").createQuery())
.should(builder.keyword().wildcard().onField("campo03")
.matching("*" + query + "*").createQuery()).createQuery())
.must(builder.keyword().onField("campo04").matching(0).createQuery())
.createQuery();
或者...
(+((campo01:teste campo02:test campo03:teste) campo01:*teste* campo02*teste* campo03:*teste*) +campo04:0)