在QueryBuilder中的Lucene条件AND

时间:2012-10-08 14:32:24

标签: hibernate search lucene hibernate-search query-builder

个人我在查询中遇到问题,想把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条件放在特定的字段中。

1 个答案:

答案 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)