全部产品
Search
文档中心

Tablestore:Kueri bersarang

更新时间:Jul 06, 2025

Anda dapat melakukan kueri bersarang untuk menanyakan data di baris anak dari bidang bersarang. Bidang bersarang tidak dapat langsung di-kueri. Untuk menanyakan bidang bersarang, Anda harus menentukan jalur bidang bersarang dan subkueri dalam objek NestedQuery. Subkueri dapat berupa kueri dari jenis apa pun.

Prasyarat

Parameter

Parameter

Deskripsi

tableName

Nama tabel data.

indexName

Nama indeks pencarian.

path

Jalur bidang bersarang. Bidang bersarang menggunakan struktur pohon. Sebagai contoh, news.title menentukan subbidang judul dalam bidang bersarang bernama news.

query

Kueri pada subbidang dalam bidang bersarang. Kueri dapat berupa kueri dari jenis apa pun.

scoreMode

Nilai yang digunakan untuk menghitung skor jika sebuah bidang berisi beberapa nilai.

InnerHits

Pengaturan subbidang dari bidang bersarang.

  • sort: aturan pengurutan untuk baris anak dari bidang bersarang.

  • offset: posisi awal baris anak yang akan dikembalikan jika bidang bersarang terdiri dari beberapa baris anak.

  • limit: jumlah maksimum baris anak yang akan dikembalikan jika bidang bersarang terdiri dari beberapa baris anak. Nilai default: 3.

  • highlight: pengaturan sorotan untuk subbidang dari bidang bersarang. Untuk informasi lebih lanjut, lihat Sorotan.

Contoh

Kueri bidang bersarang tingkat tunggal

Berikut ini adalah contoh kode sampel tentang cara menanyakan baris di mana nilai Sub_Col_Keyword subbidang dalam bidang bersarang Col_Nested adalah Hangzhou:

/**
 * Col_Nested: '[{Sub_Col_Keyword: "Hangzhou"},{Sub_Col_Keyword: "Shanghai"}]'
 */
client.search({
    tableName: "<TABLE_NAME>",
    indexName: "<SEARCH_INDEX_NAME>",
    searchQuery: {
        offset: 0,
        limit: 10, // Untuk menanyakan hanya jumlah baris yang memenuhi kondisi kueri tanpa mengembalikan data spesifik, setel parameter limit ke 0. 
        query: { // Setel tipe kueri ke TableStore.QueryType.NESTED_QUERY. 
            queryType: TableStore.QueryType.NESTED_QUERY,
            query: {
                path: "Col_Nested",
                query: {
                    queryType: TableStore.QueryType.TERM_QUERY,
                    query: {
                        fieldName: "Col_Nested.Sub_Col_Keyword",
                        term: "Hangzhou"
                    }
                },
            }
        },
        getTotalCount: true // Tentukan apakah akan mengembalikan jumlah total baris yang memenuhi kondisi kueri. Nilai default: false. 
    },
    columnToGet: { // Tentukan kolom yang ingin Anda kembalikan. Anda dapat menyetel parameter ini ke RETURN_SPECIFIED untuk mengembalikan kolom tertentu, RETURN_ALL untuk mengembalikan semua kolom, RETURN_ALL_FROM_INDEX untuk mengembalikan semua kolom dalam indeks pencarian, atau RETURN_NONE untuk mengembalikan hanya kolom kunci utama. 
        returnType: TableStore.ColumnReturnType.RETURN_ALL
    }
}, function (err, data) {
    if (err) {
        console.log('error:', err);
        return;
    }
    console.log('success:', JSON.stringify(data, null, 2));
});

Sorot string kueri dalam hasil kueri dari kueri bersarang

Berikut ini adalah contoh kode sampel tentang cara menanyakan baris di mana nilai Sub_Col_Text subbidang dari bidang bersarang bernama Col_Nested cocok dengan tablestore dan sorot string kueri dalam hasil kueri.

client.search({
    tableName: "<TABLE_NAME>",
    indexName: "<SEARCH_INDEX_NAME>",
    searchQuery: {
        offset: 0,
        limit: 10, // Untuk menanyakan hanya jumlah baris yang memenuhi kondisi kueri tanpa mengembalikan data spesifik, setel parameter limit ke 0. 
        query: { // Setel tipe kueri ke TableStore.QueryType.NESTED_QUERY. 
            queryType: TableStore.QueryType.NESTED_QUERY,
            query: {
                path: "Col_Nested",
                query: {
                    queryType: TableStore.QueryType.MATCH_QUERY,
                    query: {
                        fieldName: "Col_Nested.Sub_Col_Text",
                        text: "tablestore"
                    }
                },
                innerHits: {
                    sort: {
                        sorters: [
                            {
                                scoreSort: {
                                    order: TableStore.SortOrder.SORT_ORDER_DESC
                                }
                            },
                            {
                                docSort: {
                                    order: TableStore.SortOrder.SORT_ORDER_ASC
                                }
                            },
                        ],
                    },
                    highlight: {
                        highlightParameters: [
                            {
                                fieldName:"Col_Nested.Sub_Col_Text",
                                preTag: "",
                                fragmentsOrder: TableStore.HighlightFragmentOrder.TEXT_SEQUENCE,
                                fragmentSize: 20,
                                numberOfFragments: 3,
                            }
                        ]
                    }
                },
            }
        },
        getTotalCount: true // Tentukan apakah akan mengembalikan jumlah total baris yang memenuhi kondisi kueri. Nilai default: false. 
    },
    columnToGet: { // Tentukan kolom yang ingin Anda kembalikan. Anda dapat menyetel parameter ini ke RETURN_SPECIFIED untuk mengembalikan kolom tertentu, RETURN_ALL untuk mengembalikan semua kolom, RETURN_ALL_FROM_INDEX untuk mengembalikan semua kolom dalam indeks pencarian, atau RETURN_NONE untuk mengembalikan hanya kolom kunci utama. 
        returnType: TableStore.ColumnReturnType.RETURN_ALL
    }
}, function (err, data) {
    if (err) {
        console.log('error:', err);
        return;
    }
    console.log('success:', JSON.stringify(data.rows, null, 2));

    printSearchHit(data.searchHits, "");
});

/**
 * Tampilkan konten yang memenuhi kondisi kueri. 
 * @param searchHits searchHits
 * Jika output menggunakan prefix Nested structure, tambahkan prefix untuk menampilkan informasi hierarki. 
 */
function printSearchHit(searchHits, prefix) {
    TableStore.util.arrayEach(searchHits, function (searchHit) {
        if (searchHit.highlightResultItem != null) {
            console.log(prefix + "Highlight: \n");
            var strBuilder = ""
            for  (const [key,val]  of searchHit.highlightResultItem.highlightFields.entries()) {
                strBuilder += key + ":[";
                strBuilder += val.fragments.join(",") + "]\n";
                console.log(strBuilder);
            }
        }
        for  (const [key,val]  of searchHit.searchInnerHits.entries()) {
            console.log(prefix + "Path: " + key + "\n");
            console.log(prefix + "InnerHit: \n");
            printSearchHit(val.subSearchHits, prefix + "    ");
        }
    });
}

FAQ

Referensi

  • Jenis-jenis kueri berikut didukung oleh indeks pencarian: kueri tepat, kueri terms, kueri cocok semua, kueri cocok, kueri frasa cocok, kueri awalan, kueri rentang, kueri wildcard, kueri Boolean, kueri geo, kueri bersarang, kueri vektor, dan kueri eksis. Anda dapat memilih jenis kueri untuk menanyakan data sesuai dengan kebutuhan bisnis Anda.

    Jika Anda ingin mengurutkan atau membagi halaman baris yang memenuhi kondisi kueri, Anda dapat menggunakan fitur Pengurutan dan paging. Untuk informasi lebih lanjut, lihat Pengurutan dan Paging.

    Jika Anda ingin menciutkan set hasil berdasarkan kolom tertentu, Anda dapat menggunakan fitur collapse (distinct). Dengan cara ini, data dari tipe yang ditentukan hanya muncul sekali dalam hasil kueri. Untuk informasi lebih lanjut, lihat Collapse (Distinct).

  • Jika Anda ingin menganalisis data dalam tabel data, seperti mendapatkan nilai ekstrem, jumlah total, dan jumlah baris keseluruhan, Anda dapat melakukan operasi agregasi atau menjalankan pernyataan SQL. Untuk informasi lebih lanjut, lihat Agregasi dan Kueri SQL.

  • Jika Anda ingin dengan cepat mendapatkan semua baris yang memenuhi kondisi kueri tanpa perlu mengurutkan baris tersebut, Anda dapat memanggil operasi ParallelScan dan ComputeSplits untuk menggunakan fitur pemindaian paralel. Untuk informasi lebih lanjut, lihat Pemindaian Paralel.