将单独的查询合并为一个查询 [英] merge separate queries into one query

查看:48
本文介绍了将单独的查询合并为一个查询的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用 boolQueryBuilder 进行以下查询,该查询检查 status1 或 status2 并且时间小于 currentTime 是否匹配:

i have the following query using boolQueryBuilder which check if status1 or status2 AND the time is less than currentTime is matchs :

 public BoolQueryBuilder createSearchQuery(Long currentTime) {
        // Build and operator
        final BoolQueryBuilder firstAndOperator = createAndOperator(currentTime, "status1");

        // Build AND operator 
        final BoolQueryBuilder secondAndOperator = createAndOperator(currentTime, "status2);

        // Build OR
        return createOrOperator(firstAndOperator, secondAndOperator);
    }

    private BoolQueryBuilder createOrOperator(BoolQueryBuilder firstAndOperator, BoolQueryBuilder secondAndOperator) {
        return new BoolQueryBuilder()
            .should(firstAndOperator)
            .should(secondAndOperator);
    }

    private BoolQueryBuilder createAndOperator(Long currentDate, Status status) {
        return QueryBuilders.boolQuery()
            .must(QueryBuilders.matchQuery(STATUS, status))
            .must(QueryBuilders.rangeQuery(TIME).lte(currentDate));
    }

如何使用 multiMatchQuery 合并它们?

how to merge them using multiMatchQuery?

这是我的尝试,但它不起作用

this is my try but it does not work

 public BoolQueryBuilder createSearchQuery(Long currentTime) {
        return new BoolQueryBuilder()
            .should(QueryBuilders
                .multiMatchQuery("status1" + " " + "status2", STATUS)
                .type(MultiMatchQueryBuilder.Type.PHRASE_PREFIX)
                .operator(Operator.OR))
            .must(QueryBuilders.rangeQuery(TIME)
                .lte(currentTime));
    }

推荐答案

我认为您的 multi_match 查询是错误的,您应该使用 filter 而不是 must 也是如此.所以应该是这样的:

I think your multi_match query is wrong and you should use filter instead of must as well. So it should be like this instead:

public BoolQueryBuilder createSearchQuery(Long currentTime) {
    return new BoolQueryBuilder()
        .should(QueryBuilders
            .multiMatchQuery(STATUS, "status1", "status2")
            .operator(Operator.OR))
        .filter(QueryBuilders.rangeQuery(TIME)
            .lte(currentTime));

但我不会为此使用 multi_match,而是利用两个 term 过滤器:

But I wouldn't use multi_match for that purpose, instead I would leverage two term filters:

public BoolQueryBuilder createSearchQuery(Long currentTime) {
    return new BoolQueryBuilder()
        .minimumShouldMatch(1)
        .should(QueryBuilders.matchQuery("status1", STATUS))
        .should(QueryBuilders.matchQuery("status2", STATUS))
        .filter(QueryBuilders.rangeQuery(TIME)
            .lte(currentTime));

这篇关于将单独的查询合并为一个查询的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆