एक क्वेरी में अलग प्रश्नों को मर्ज करें

Nov 30 2020

मेरे पास boolQueryBuilder का उपयोग करते हुए निम्नलिखित क्वेरी है, जो यह जांचती है कि status1 या status2 और समय 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));
    }

मल्टीमैच का उपयोग करके उन्हें मर्ज कैसे करें?

यह मेरी कोशिश है लेकिन यह काम नहीं करता है

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

जवाब

Val Nov 30 2020 at 16:53

मुझे लगता है कि आपकी multi_matchक्वेरी गलत है और आपको filterइसके बजाय उपयोग करना चाहिए must। तो इसके बजाय ऐसा होना चाहिए:

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फिल्टर लगाऊंगा:

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