All Products
Search
Document Center

Tablestore:Nested query

Last Updated:Jul 27, 2026

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 BoolQuery yang berisi kondisi anak sebagai subkueri dari satu NestedQuery.

  • Untuk memungkinkan baris anak yang berbeda memenuhi kondisi secara terpisah, buat satu NestedQuery untuk setiap kondisi dan gabungkan kueri bersarang tersebut dalam BoolQuery luar.

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 -1, yang berarti tidak mengonfigurasi timeout kueri terpisah.

routingValues (optional)

List<PrimaryKey>

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 NestedQuery untuk kueri bersarang.

offset (optional)

Integer

Posisi awal kueri.

limit (optional)

Integer

Jumlah maksimum baris yang dikembalikan. Atur parameter ini ke 0 untuk tidak mengembalikan baris apa pun.

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 TRACK_TOTAL_COUNT_DISABLED, yang menonaktifkan penghitungan. Atur parameter ini ke TRACK_TOTAL_COUNT untuk menghitung semua baris yang cocok. Nilai yang lebih kecil meningkatkan performa kueri.

filter (optional)

SearchFilter

Filter yang diterapkan pada hasil query.

aggregationList (optional)

List<Aggregation>

Pengaturan agregasi. Untuk detail konfigurasi, lihat Aggregation.

groupByList (optional)

List<GroupBy>

Pengaturan pengelompokan. Untuk detail konfigurasi, lihat Aggregation.

token (optional)

byte[]

Token paginasi. Atur parameter ini ke nilai nextToken dari respons sebelumnya untuk melanjutkan pembacaan baris. Saat Anda mengatur token, SDK mengosongkan sort karena token tersebut sudah berisi kondisi pengurutan.

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 items.details.

query (required)

Query

Kondisi kueri yang dieksekusi pada baris anak di bawah path. Kondisi ini dapat berupa tipe Query apa pun. Tentukan subbidang dengan menggunakan path lengkapnya, seperti items.keyword.

scoreMode (required)

ScoreMode

Mode penskoran baris induk saat beberapa baris anak cocok. None menonaktifkan penskoran relevansi untuk baris anak. Avg, Max, Min, dan Total menggunakan rata-rata, maksimum, minimum, dan jumlah skor baris anak.

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 1.0 dan nilainya harus berupa bilangan titik mengambang positif. Nilai yang lebih besar meningkatkan skor baris yang cocok tetapi tidak mengubah baris mana yang cocok.

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 ScoreSort dan DocSort. FieldSort tidak didukung.

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 3.

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)

List<String>

Kolom atribut yang dikembalikan. Atur parameter ini hanya jika returnAll dan returnAllFromIndex keduanya false. Jika Anda menghilangkan parameter ini, hanya kolom kunci primer yang dikembalikan.

returnAll (optional)

boolean

Menentukan apakah semua kolom atribut dari tabel data akan dikembalikan. Nilai default-nya adalah false.

returnAllFromIndex (optional)

boolean

Menentukan apakah semua kolom atribut yang diindeks akan dikembalikan. Nilai default-nya adalah false. Jangan atur returnAll dan returnAllFromIndex keduanya ke true.

Nilai kembalian

Respons pencarian

search mengembalikan objek SearchResponse. Tabel berikut menjelaskan bidang intinya.

Name

Type

Description

totalCount

long

Jumlah baris yang cocok. Panggil getTotalCount() untuk mendapatkan nilainya. Nilai yang dikembalikan bergantung pada pengaturan trackTotalCount.

rows

List<Row>

Baris yang dikembalikan oleh kueri ini. Panggil getRows() untuk mendapatkan nilainya. Jumlah baris tidak melebihi limit.

searchHits

List<SearchHit>

Hasil kueri. Panggil getSearchHits() untuk mendapatkan nilainya. Jika innerHits dikonfigurasi, baca baris anak yang cocok dari bidang ini.

nextToken

byte[]

Token halaman berikutnya. Panggil getNextToken() untuk mendapatkan nilainya. Jika nilainya bukan null, atur sebagai token dalam permintaan berikutnya untuk melanjutkan pembacaan baris.

isAllSuccess

boolean

Menunjukkan apakah semua partisi indeks berhasil dikueri. Panggil isAllSuccess() untuk mendapatkan nilainya. Jika nilainya false, respons berisi hasil parsial dan totalCount mungkin kurang dari jumlah sebenarnya baris yang cocok.

Hasil pencarian

response.searchHits[] adalah objek SearchHit yang berisi bidang inti berikut.

Name

Type

Description

row

Row

Baris atau baris anak yang cocok. Panggil getRow() untuk mendapatkan nilainya.

score

Double

Skor relevansi. Panggil getScore() untuk mendapatkan nilainya.

offset

Integer

Posisi baris anak bersarang dalam larik aslinya. Panggil getOffset() untuk mendapatkan nilainya. Bidang ini bisa kosong dalam hasil baris induk.

highlightResultItem

HighlightResultItem

Hasil penyorotan. Panggil getHighlightResultItem() untuk mendapatkan nilainya.

searchInnerHits

Map<String, SearchInnerHit>

Baris anak yang cocok dikelompokkan berdasarkan path bidang bersarang. Panggil getSearchInnerHits() untuk mendapatkan map-nya, atau panggil getSearchInnerHitByPath(path) untuk mendapatkan hasil untuk path tertentu.

Hasil bersarang

response.searchHits[].searchInnerHits berisi nilai SearchInnerHit dengan bidang berikut.

Name

Type

Description

path

String

Path bidang bersarang. Panggil getPath() untuk mendapatkan nilainya.

subSearchHits

List<SearchHit>

Baris anak yang cocok. Panggil getSubSearchHits() untuk mendapatkan nilainya. Dalam kueri bersarang multi-level, searchInnerHits dalam hasil baris anak dapat berisi baris yang cocok dari level berikutnya.

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.