Boolean query pada Tablestore SDK for Java menggabungkan beberapa kondisi kueri menggunakan logika AND, OR, dan NOT, serta mengembalikan baris yang memenuhi kondisi gabungan tersebut.
Prasyarat
Instal Tablestore SDK for Java dan inisialisasi client.
Deskripsi fitur
Boolean query menggunakan BoolQuery untuk menggabungkan satu atau lebih subkueri menjadi kondisi kueri kompleks. Subkueri dapat berupa tipe Query apa pun, termasuk BoolQuery lainnya.
BoolQuery mendukung jenis klausa berikut:
-
mustQueries: Baris harus memenuhi semua subkueri. Subkueri yang sesuai berkontribusi terhadap skor relevansi. Klausa ini setara dengan operasi AND. -
filterQueries: Baris harus memenuhi semua subkueri, tetapi subkueri yang sesuai tidak berkontribusi terhadap skor relevansi. Klausa ini juga setara dengan operasi AND. -
shouldQueries: Baris harus memenuhi minimal jumlah subkueri yang ditentukan olehminShouldMatch. Semakin banyak subkueri yang sesuai, semakin tinggi skor relevansinya. Klausa ini setara dengan operasi OR. -
mustNotQueries: Baris tidak boleh memenuhi subkueri mana pun. Klausa ini setara dengan operasi NOT dan tidak berkontribusi terhadap skor relevansi.
Jika minShouldMatch tidak dikonfigurasi dan Boolean query hanya berisi shouldQueries serta mustNotQueries, maka minimal satu subkueri shouldQueries harus sesuai. Namun, jika Boolean query juga mencakup mustQueries atau filterQueries pada level yang sama, subkueri shouldQueries bersifat opsional secara default.
Panggil metode search untuk menjalankan Boolean query.
SearchResponse search(SearchRequest request)
Contoh berikut mengkueri baris di mana nilai city sama dengan hangzhou dan nilai category sama dengan book. Kueri ini mengembalikan maksimal 10 baris beserta jumlah total kecocokan.
String tableName = "example_table";
String indexName = "example_index";
TermQuery cityQuery = new TermQuery();
cityQuery.setFieldName("city");
cityQuery.setTerm(ColumnValue.fromString("hangzhou"));
TermQuery categoryQuery = new TermQuery();
categoryQuery.setFieldName("category");
categoryQuery.setTerm(ColumnValue.fromString("book"));
BoolQuery boolQuery = new BoolQuery();
boolQuery.setMustQueries(Arrays.asList(cityQuery, categoryQuery));
SearchQuery searchQuery = new SearchQuery();
searchQuery.setQuery(boolQuery);
searchQuery.setLimit(10);
searchQuery.setTrackTotalCount(SearchQuery.TRACK_TOTAL_COUNT);
SearchRequest request = new SearchRequest(tableName, indexName, searchQuery);
SearchRequest.ColumnsToGet columnsToGet = new SearchRequest.ColumnsToGet();
columnsToGet.setReturnAll(true);
request.setColumnsToGet(columnsToGet);
SearchResponse response = client.search(request);
System.out.println(response.getRows());
Parameter
Permintaan pencarian
request adalah objek SearchRequest yang berisi parameter berikut.
|
Name |
Type |
Description |
|
tableName (required) |
String |
Nama tabel data. |
|
indexName (required) |
String |
Nama indeks pencarian. |
|
searchQuery (required) |
SearchQuery |
Kondisi kueri dan pengaturan umum kueri. |
|
columnsToGet (optional) |
SearchRequest.ColumnsToGet |
Kolom yang akan dikembalikan. Jika parameter ini tidak dikonfigurasi, hanya kolom kunci primer yang dikembalikan. |
|
timeoutInMillisecond (optional) |
int |
Timeout kueri tingkat permintaan dalam milidetik. Nilai default-nya adalah |
|
routingValues (optional) |
|
Nilai kunci primer yang sesuai dengan bidang routing kustom. Biarkan parameter ini tidak diatur jika routing kustom tidak dikonfigurasi. |
Pengaturan kueri
request.searchQuery adalah objek SearchQuery yang berisi parameter berikut.
|
Name |
Type |
Description |
|
query (required) |
Query |
Kondisi kueri. Atur parameter ini ke objek |
|
offset (optional) |
Integer |
Posisi awal kueri. |
|
limit (optional) |
Integer |
Jumlah maksimum baris yang dikembalikan. Atur parameter ini ke |
|
highlight (optional) |
Highlight |
Pengaturan ringkasan dan penyorotan saat subkueri sesuai dengan bidang Text. Untuk detail konfigurasi, lihat Summary and highlighting. |
|
collapse (optional) |
Collapse |
Pengaturan collapse bidang, yang menghapus duplikat hasil berdasarkan bidang tertentu. Untuk detail konfigurasi, lihat Collapse query results. |
|
sort (optional) |
Sort |
Urutan pengurutan hasil. Untuk detail konfigurasi, lihat Sort and paginate results. |
|
trackTotalCount (optional) |
int |
Jumlah maksimum baris yang cocok yang diharapkan untuk dihitung. Nilai default-nya adalah |
|
filter (optional) |
SearchFilter |
Filter yang diterapkan pada hasil |
|
aggregationList (optional) |
|
Pengaturan agregasi. Untuk detail konfigurasi, lihat Aggregation. |
|
groupByList (optional) |
|
Pengaturan pengelompokan. Untuk detail konfigurasi, lihat Aggregation. |
|
token (optional) |
byte[] |
Token paginasi. Atur parameter ini ke nilai |
Kondisi Boolean query
request.searchQuery.query adalah objek BoolQuery yang berisi parameter berikut.
|
Name |
Type |
Description |
|
mustQueries (optional) |
|
Subkueri yang semuanya harus sesuai dengan baris. Subkueri yang sesuai berkontribusi terhadap skor relevansi. Jenis klausa ini setara dengan AND. |
|
filterQueries (optional) |
|
Subkueri yang semuanya harus sesuai dengan baris. Subkueri yang sesuai tidak berkontribusi terhadap skor relevansi. Jenis klausa ini setara dengan AND. |
|
shouldQueries (optional) |
|
Subkueri yang jumlah minimum tertentu harus sesuai. Jenis klausa ini setara dengan OR. Semakin banyak subkueri yang sesuai, semakin tinggi skor relevansinya. |
|
mustNotQueries (optional) |
|
Subkueri yang tidak boleh ada yang sesuai. Jenis klausa ini setara dengan NOT dan tidak berkontribusi terhadap skor relevansi. |
|
minShouldMatch (optional) |
String atau int |
Jumlah minimum subkueri |
|
weight (optional) |
Float |
Bobot Boolean query. Jika parameter ini dihilangkan, kueri menggunakan bobot |
setMinimumShouldMatch(Integer) sudah tidak digunakan lagi. Gunakan setMinShouldMatch(int) atau setMinShouldMatch(String).
Kolom yang dikembalikan
request.columnsToGet adalah objek SearchRequest.ColumnsToGet yang berisi parameter berikut.
|
Name |
Type |
Description |
|
columns (optional) |
|
Kolom atribut yang akan dikembalikan. Atur parameter ini hanya jika |
|
returnAll (optional) |
boolean |
Menentukan apakah akan mengembalikan semua kolom atribut dari tabel data. Nilai default-nya adalah |
|
returnAllFromIndex (optional) |
boolean |
Menentukan apakah akan mengembalikan semua kolom atribut yang diindeks. Nilai default-nya adalah |
Nilai kembalian
Respons pencarian
Metode search mengembalikan objek SearchResponse. Tabel berikut menjelaskan bidang intinya.
|
Name |
Type |
Description |
|
totalCount |
long |
Jumlah baris yang cocok. Panggil |
|
rows |
|
Baris yang dikembalikan oleh kueri ini. Panggil |
|
searchHits |
|
Hasil hit kueri. Panggil |
|
nextToken |
byte[] |
Token halaman berikutnya. Panggil |
|
isAllSuccess |
boolean |
Menunjukkan apakah semua partisi indeks berhasil dikueri. Panggil |
Search hit
response.searchHits[] adalah array objek SearchHit yang berisi bidang inti berikut.
|
Name |
Type |
Description |
|
row |
Row |
Baris yang cocok. Panggil |
|
score |
Double |
Skor relevansi. Panggil |
|
highlightResultItem |
HighlightResultItem |
Hasil ringkasan dan penyorotan. Panggil |
Contoh skenario
Sesuai dengan salah satu kondisi
Gunakan shouldQueries untuk menggabungkan kondisi dan minShouldMatch untuk menentukan jumlah minimum kondisi yang harus dipenuhi. Contoh berikut mengkueri baris di mana nilai city sama dengan hangzhou atau nilai category sama dengan book.
TermQuery cityQuery = new TermQuery();
cityQuery.setFieldName("city");
cityQuery.setTerm(ColumnValue.fromString("hangzhou"));
TermQuery categoryQuery = new TermQuery();
categoryQuery.setFieldName("category");
categoryQuery.setTerm(ColumnValue.fromString("book"));
BoolQuery boolQuery = new BoolQuery();
boolQuery.setShouldQueries(Arrays.asList(cityQuery, categoryQuery));
boolQuery.setMinShouldMatch(1);
SearchQuery searchQuery = new SearchQuery();
searchQuery.setQuery(boolQuery);
Mengecualikan baris yang sesuai dengan suatu kondisi
Gunakan mustNotQueries untuk mengecualikan baris yang memenuhi kondisi tertentu. Contoh berikut mengkueri baris di mana nilai city tidak sama dengan hangzhou.
TermQuery cityQuery = new TermQuery();
cityQuery.setFieldName("city");
cityQuery.setTerm(ColumnValue.fromString("hangzhou"));
BoolQuery boolQuery = new BoolQuery();
boolQuery.setMustNotQueries(Collections.singletonList(cityQuery));
SearchQuery searchQuery = new SearchQuery();
searchQuery.setQuery(boolQuery);
Memfilter berdasarkan beberapa kondisi tanpa skor relevansi
Gunakan filterQueries untuk mewajibkan semua subkueri terpenuhi tanpa memengaruhi skor relevansi. Contoh berikut mengkueri baris di mana nilai city sama dengan hangzhou dan nilai category sama dengan book.
TermQuery cityQuery = new TermQuery();
cityQuery.setFieldName("city");
cityQuery.setTerm(ColumnValue.fromString("hangzhou"));
TermQuery categoryQuery = new TermQuery();
categoryQuery.setFieldName("category");
categoryQuery.setTerm(ColumnValue.fromString("book"));
BoolQuery boolQuery = new BoolQuery();
boolQuery.setFilterQueries(Arrays.asList(cityQuery, categoryQuery));
SearchQuery searchQuery = new SearchQuery();
searchQuery.setQuery(boolQuery);
Menggabungkan kondisi bertingkat
Gunakan BoolQuery sebagai subkueri dalam BoolQuery lain untuk menyatakan logika multi-level. Contoh berikut mengimplementasikan ekspresi (city = "hangzhou" OR price < 150) OR (category = "book" AND (price = 300 OR price = 400)).
TermQuery cityQuery = new TermQuery();
cityQuery.setFieldName("city");
cityQuery.setTerm(ColumnValue.fromString("hangzhou"));
RangeQuery lowPriceQuery = new RangeQuery();
lowPriceQuery.setFieldName("price");
lowPriceQuery.lessThan(ColumnValue.fromLong(150));
BoolQuery firstGroup = new BoolQuery();
firstGroup.setShouldQueries(Arrays.asList(cityQuery, lowPriceQuery));
TermQuery price300Query = new TermQuery();
price300Query.setFieldName("price");
price300Query.setTerm(ColumnValue.fromLong(300));
TermQuery price400Query = new TermQuery();
price400Query.setFieldName("price");
price400Query.setTerm(ColumnValue.fromLong(400));
BoolQuery priceGroup = new BoolQuery();
priceGroup.setShouldQueries(Arrays.asList(price300Query, price400Query));
TermQuery categoryQuery = new TermQuery();
categoryQuery.setFieldName("category");
categoryQuery.setTerm(ColumnValue.fromString("book"));
BoolQuery secondGroup = new BoolQuery();
secondGroup.setMustQueries(Arrays.asList(categoryQuery, priceGroup));
BoolQuery boolQuery = new BoolQuery();
boolQuery.setShouldQueries(Arrays.asList(firstGroup, secondGroup));
SearchQuery searchQuery = new SearchQuery();
searchQuery.setQuery(boolQuery);