Kueri bersarang dengan Tablestore SDK for Java mencocokkan data dalam bidang Nested sekaligus mempertahankan batas baris anak dan dapat mengembalikan baris anak yang cocok.
Prasyarat
Instal Tablestore SDK for Java dan inisialisasi klien.
Deskripsi fitur
Kueri bersarang melakukan kueri terhadap baris anak dalam bidang Nested. Setiap baris anak dalam bidang Nested secara independen mempertahankan hubungan antar bidangnya. Anda tidak dapat langsung melakukan kueri terhadap subbidang dari bidang Nested; sebagai gantinya, bungkus subkueri dalam objek NestedQuery.
NestedQuery.path menentukan path bidang bersarang yang akan dikueri. Nama bidang dalam subkueri harus menggunakan path lengkap. Subkueri dapat berupa tipe Query apa pun. Untuk mengkueri bidang bersarang multi-level, atur path langsung ke path lengkap bidang bersarang target atau susun objek NestedQuery untuk mengkueri setiap level.
Apakah beberapa kondisi harus dipenuhi oleh baris anak yang sama bergantung pada cara penggabungan NestedQuery dan BoolQuery:
Untuk mewajibkan baris anak yang sama memenuhi beberapa kondisi, atur
BoolQueryyang berisi kondisi anak sebagai subkueri dari satuNestedQuery.Untuk memungkinkan baris anak yang berbeda memenuhi kondisi secara terpisah, buat satu
NestedQueryuntuk setiap kondisi dan gabungkan kueri bersarang tersebut dalamBoolQueryluar.
Panggil metode search untuk menjalankan kueri bersarang. Dalam kondisi kueri, tentukan path bidang bersarang, subkueri, dan mode skor.
SearchResponse search(SearchRequest request)
Contoh berikut mengkueri baris anak dalam bidang bersarang items yang bidang items.keyword-nya sama dengan tablestore. Kueri ini mengembalikan hingga 10 baris dan jumlah total kecocokan.
String tableName = "example_table";
String indexName = "example_index";
TermQuery termQuery = new TermQuery();
termQuery.setFieldName("items.keyword");
termQuery.setTerm(ColumnValue.fromString("tablestore"));
NestedQuery nestedQuery = new NestedQuery();
nestedQuery.setPath("items");
nestedQuery.setQuery(termQuery);
nestedQuery.setScoreMode(ScoreMode.None);
SearchQuery searchQuery = new SearchQuery();
searchQuery.setQuery(nestedQuery);
searchQuery.setLimit(10);
searchQuery.setTrackTotalCount(SearchQuery.TRACK_TOTAL_COUNT);
SearchRequest request = new SearchRequest(tableName, indexName, searchQuery);
SearchResponse response = client.search(request);
System.out.println(response.getTotalCount());
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 kueri umum. |
|
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 |
|
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 kueri bersarang
request.searchQuery.query adalah objek NestedQuery yang berisi parameter berikut.
|
Name |
Type |
Description |
|
path (required) |
String |
Path bidang bersarang yang akan dikueri. Untuk bidang bersarang multi-level, atur parameter ini ke path lengkap bidang bersarang target, seperti |
|
query (required) |
Query |
Kondisi kueri yang dieksekusi pada baris anak di bawah |
|
scoreMode (required) |
ScoreMode |
Mode penskoran baris induk saat beberapa baris anak cocok. |
|
innerHits (optional) |
InnerHits |
Pengaturan untuk mengembalikan, mengurutkan, membagi halaman, dan menyorot baris anak yang cocok. Jika Anda menghilangkan parameter ini, detail tentang baris anak yang cocok tidak dikembalikan. |
|
weight (optional) |
float |
Bobot kueri. Nilai default-nya adalah |
Pengaturan pengembalian baris anak
request.searchQuery.query.innerHits adalah objek InnerHits yang berisi parameter berikut.
|
Name |
Type |
Description |
|
sort (optional) |
Sort |
Urutan pengurutan baris anak yang cocok. Anda dapat menggunakan |
|
offset (optional) |
Integer |
Posisi awal untuk mengembalikan baris anak yang cocok. |
|
limit (optional) |
Integer |
Jumlah maksimum baris anak yang cocok yang dikembalikan. Nilai default-nya adalah |
|
highlight (optional) |
Highlight |
Pengaturan sorotan untuk baris anak yang cocok. Untuk informasi tentang bidang dan parameter yang mendukung penyorotan, lihat Summary and highlighting. |
Kolom yang dikembalikan
request.columnsToGet adalah objek SearchRequest.ColumnsToGet yang berisi parameter berikut.
|
Name |
Type |
Description |
|
columns (optional) |
|
Kolom atribut yang dikembalikan. Atur parameter ini hanya jika |
|
returnAll (optional) |
boolean |
Menentukan apakah semua kolom atribut dari tabel data akan dikembalikan. Nilai default-nya adalah |
|
returnAllFromIndex (optional) |
boolean |
Menentukan apakah semua kolom atribut yang diindeks akan dikembalikan. Nilai default-nya adalah |
Nilai kembalian
Respons pencarian
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 kueri. Panggil |
|
nextToken |
byte[] |
Token halaman berikutnya. Panggil |
|
isAllSuccess |
boolean |
Menunjukkan apakah semua partisi indeks berhasil dikueri. Panggil |
Hasil pencarian
response.searchHits[] adalah objek SearchHit yang berisi bidang inti berikut.
|
Name |
Type |
Description |
|
row |
Row |
Baris atau baris anak yang cocok. Panggil |
|
score |
Double |
Skor relevansi. Panggil |
|
offset |
Integer |
Posisi baris anak bersarang dalam larik aslinya. Panggil |
|
highlightResultItem |
HighlightResultItem |
Hasil penyorotan. Panggil |
|
searchInnerHits |
|
Baris anak yang cocok dikelompokkan berdasarkan path bidang bersarang. Panggil |
Hasil bersarang
response.searchHits[].searchInnerHits berisi nilai SearchInnerHit dengan bidang berikut.
|
Name |
Type |
Description |
|
path |
String |
Path bidang bersarang. Panggil |
|
subSearchHits |
|
Baris anak yang cocok. Panggil |
Contoh skenario
Mengkueri bidang bersarang multi-level
Untuk mengkueri bidang bersarang multi-level, atur path ke path lengkap bidang bersarang target dan tentukan path subbidang lengkap dalam subkueri. Contoh berikut mengkueri baris yang bidang items.details.name-nya sama dengan beta.
TermQuery termQuery = new TermQuery();
termQuery.setFieldName("items.details.name");
termQuery.setTerm(ColumnValue.fromString("beta"));
NestedQuery nestedQuery = new NestedQuery();
nestedQuery.setPath("items.details");
nestedQuery.setQuery(termQuery);
nestedQuery.setScoreMode(ScoreMode.None);
SearchQuery searchQuery = new SearchQuery();
searchQuery.setQuery(nestedQuery);
Mewajibkan baris anak yang sama memenuhi beberapa kondisi
Atur BoolQuery yang berisi beberapa kondisi anak sebagai subkueri dari satu NestedQuery. Contoh berikut mewajibkan baris anak yang sama dalam items memiliki nilai items.keyword sebesar tablestore dan bidang items.number.
TermQuery termQuery = new TermQuery();
termQuery.setFieldName("items.keyword");
termQuery.setTerm(ColumnValue.fromString("tablestore"));
ExistsQuery existsQuery = new ExistsQuery();
existsQuery.setFieldName("items.number");
BoolQuery childQuery = new BoolQuery();
childQuery.setMustQueries(Arrays.asList(termQuery, existsQuery));
NestedQuery nestedQuery = new NestedQuery();
nestedQuery.setPath("items");
nestedQuery.setQuery(childQuery);
nestedQuery.setScoreMode(ScoreMode.None);
SearchQuery searchQuery = new SearchQuery();
searchQuery.setQuery(nestedQuery);
Memungkinkan baris anak yang berbeda memenuhi beberapa kondisi
Buat satu NestedQuery untuk setiap kondisi dan gabungkan kueri bersarang tersebut dalam BoolQuery luar. Contoh berikut memungkinkan nilai items.keyword sebesar tablestore dan keberadaan items.number dicocokkan oleh baris anak yang berbeda.
TermQuery termQuery = new TermQuery();
termQuery.setFieldName("items.keyword");
termQuery.setTerm(ColumnValue.fromString("tablestore"));
NestedQuery termNestedQuery = new NestedQuery();
termNestedQuery.setPath("items");
termNestedQuery.setQuery(termQuery);
termNestedQuery.setScoreMode(ScoreMode.None);
ExistsQuery existsQuery = new ExistsQuery();
existsQuery.setFieldName("items.number");
NestedQuery existsNestedQuery = new NestedQuery();
existsNestedQuery.setPath("items");
existsNestedQuery.setQuery(existsQuery);
existsNestedQuery.setScoreMode(ScoreMode.None);
BoolQuery boolQuery = new BoolQuery();
boolQuery.setMustQueries(
Arrays.asList(termNestedQuery, existsNestedQuery));
SearchQuery searchQuery = new SearchQuery();
searchQuery.setQuery(boolQuery);
Mengembalikan dan menyorot baris anak yang cocok
Gunakan InnerHits untuk mengonfigurasi jumlah, urutan pengurutan, dan pengaturan sorotan baris anak yang cocok. Contoh berikut mengkueri baris anak yang bidang items.description-nya berisi hangzhou dan mengembalikan hasil yang disorot.
MatchQuery matchQuery = new MatchQuery();
matchQuery.setFieldName("items.description");
matchQuery.setText("hangzhou");
HighlightParameter parameter = new HighlightParameter();
parameter.setPreTag("");
parameter.setPostTag("");
Highlight highlight = new Highlight();
highlight.addFieldHighlightParam("items.description", parameter);
InnerHits innerHits = new InnerHits();
innerHits.setLimit(3);
innerHits.setSort(new Sort(Arrays.asList(
new ScoreSort(), new DocSort(SortOrder.ASC))));
innerHits.setHighlight(highlight);
NestedQuery nestedQuery = new NestedQuery();
nestedQuery.setPath("items");
nestedQuery.setQuery(matchQuery);
nestedQuery.setScoreMode(ScoreMode.None);
nestedQuery.setInnerHits(innerHits);
SearchQuery searchQuery = new SearchQuery();
searchQuery.setQuery(nestedQuery);
Dalam kueri bersarang multi-level, konfigurasikan innerHits di setiap level NestedQuery dari mana baris anak yang cocok harus dikembalikan atau disorot.