3

个人我在查询中遇到问题,想将 AND 子句放在一个术语中,但是我没有得到并尝试搜索但没有成功。

按照示例并返回查询(我正在使用我的 indece 测试 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)

但是,此查询返回的结果比预期的要大。与 Luke 一起进行测试时,发现 Must 并不理想,需要将 AND 放在适当的位置。

    (((campo01:teste campo02:test campo03:teste) campo01:*teste* campo02*teste* campo03:*teste*) AND campo04:0)

因此结果是正确的,但是我无法进行构建查询来创建此结果。

任何人都可以帮助或有任何问题。我真正想要的是在特定字段中放置一个 AND 条件。

4

1 回答 1

2

使用“必须”和“应该”从句是正确的想法。您可以构建一个查询,使用它们有效地创建逻辑 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)
于 2012-10-08T17:53:58.817 回答