gabungkan kueri terpisah menjadi satu kueri
Nov 30 2020
saya memiliki kueri berikut menggunakan boolQueryBuilder yang memeriksa apakah status1 atau status2 DAN waktu kurang dari currentTime cocok:
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));
}
bagaimana cara menggabungkannya menggunakan multiMatchQuery?
ini adalah percobaan saya tetapi tidak berhasil
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));
}
Jawaban
Val Nov 30 2020 at 16:53
Saya pikir multi_match
kueri Anda salah dan Anda harus menggunakan filter
sebagai gantinya must
juga. Jadi seharusnya seperti ini:
public BoolQueryBuilder createSearchQuery(Long currentTime) {
return new BoolQueryBuilder()
.should(QueryBuilders
.multiMatchQuery(STATUS, "status1", "status2")
.operator(Operator.OR))
.filter(QueryBuilders.rangeQuery(TIME)
.lte(currentTime));
Tetapi saya tidak akan menggunakan multi_match
untuk tujuan itu, sebagai gantinya saya akan memanfaatkan dua term
filter:
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));
Kiat Pemilik Anjing yang Bermanfaat: Mengapa Penting untuk Membiarkan Anjing Anda Mengendus di Jalan
Taylor Sheridan Baru Menambahkan 1 Bintang 'Yellowstone' Favoritnya ke Pemeran 'Lawmen: Bass Reeves'