एक क्वेरी में अलग प्रश्नों को मर्ज करें
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));