merge separate queries into one query

家住魔仙堡 提交于 2021-01-07 06:51:08

问题


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));
    }

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));
    }

回答1:


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));

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));


来源:https://stackoverflow.com/questions/65077447/merge-separate-queries-into-one-query

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!