scal oddzielne zapytania w jedno zapytanie

Nov 30 2020

Mam następujące zapytanie za pomocą boolQueryBuilder, które sprawdza, czy pasuje status1 lub status2 ORAZ czas jest mniejszy niż currentTime:

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

jak je połączyć za pomocą multiMatchQuery?

to moja próba, ale nie działa

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

Odpowiedzi

Val Nov 30 2020 at 16:53

Myślę, że twoje multi_matchzapytanie jest błędne i powinieneś użyć filterzamiast tego must. Zamiast tego powinno wyglądać tak:

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

Ale nie użyłbym multi_matchdo tego celu, zamiast tego użyłbym dwóch termfiltrów:

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