全部产品
Search
文档中心

Tablestore:Kueri bersarang

更新时间:Jul 06, 2025

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

Penting
  • Hanya bidang bersarang yang dapat dikueri dalam kueri bersarang.

  • Anda dapat melakukan kueri pada bidang bersarang dan jenis bidang lainnya dalam satu permintaan. Untuk informasi lebih lanjut tentang tipe bidang bersarang, lihat Tipe Data Bersarang.

Operasi API

Untuk melakukan kueri bersarang, Anda dapat memanggil operasi Search atau ParallelScan dan atur tipe kueri ke NestedQuery.

Parameter

Parameter

Deskripsi

path

Jalur bidang bersarang. Jalur ini mirip dengan struktur pohon. Sebagai contoh, news.title menentukan subbidang judul dalam bidang bersarang bernama news.

query

Kueri yang ingin Anda lakukan pada subbidang dalam bidang bersarang. Kueri dapat berupa jenis kueri apa pun.

scoreMode

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

getTotalCount

Menentukan apakah akan mengembalikan jumlah total baris yang memenuhi kondisi kueri. Nilai default parameter ini adalah false, yang menentukan bahwa jumlah total baris yang memenuhi kondisi kueri tidak dikembalikan.

Jika Anda mengatur parameter ini ke true, kinerja kueri akan terpengaruh.

weight

Bobot yang ingin Anda tetapkan pada bidang yang ingin Anda kueri untuk menghitung skor relevansi kata kunci berbasis BM25. Parameter ini digunakan dalam skenario pencarian teks lengkap. Bobot yang lebih tinggi menghasilkan skor relevansi kata kunci berbasis BM25 yang lebih tinggi untuk bidang tersebut. Nilai parameter ini adalah angka titik mengambang positif.

Parameter ini tidak memengaruhi jumlah baris yang dikembalikan. Namun, parameter ini memengaruhi skor relevansi kata kunci berbasis BM25 dari hasil kueri.

tableName

Nama tabel data.

indexName

Nama indeks pencarian.

columnsToGet

Menentukan apakah akan mengembalikan semua kolom setiap baris yang memenuhi kondisi kueri. Anda dapat mengonfigurasi parameter returnAll dan columns untuk parameter ini.

Nilai default parameter returnAll adalah false, yang menentukan bahwa tidak semua kolom dikembalikan. Dalam hal ini, Anda dapat menggunakan parameter columns untuk menentukan kolom yang ingin Anda kembalikan. Jika Anda tidak menentukan kolom yang ingin Anda kembalikan, hanya kolom kunci utama yang dikembalikan.

Jika Anda mengatur parameter returnAll ke true, semua kolom dikembalikan.

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

Metode

Anda dapat menggunakan Konsol Tablestore atau SDK Tablestore untuk melakukan kueri bersarang. Sebelum melakukannya, pastikan persiapan berikut telah dilakukan:

  • Akun Alibaba Cloud atau pengguna RAM dengan izin operasi Tablestore telah dibuat. Untuk informasi tentang cara memberikan izin operasi Tablestore kepada pengguna RAM, lihat Gunakan Kebijakan RAM untuk Memberikan Izin kepada Pengguna RAM.

    Jika Anda ingin menggunakan SDK Tablestore untuk melakukan kueri bersarang, pasangan AccessKey telah dibuat untuk akun Alibaba Cloud atau pengguna RAM Anda. Untuk informasi lebih lanjut, lihat Buat Pasangan AccessKey.

    Peringatan

    Pasangan AccessKey dari akun Alibaba Cloud memiliki izin pada semua operasi API. Kami merekomendasikan agar Anda menggunakan pengguna RAM untuk memanggil operasi API atau melakukan pemeliharaan rutin O&M. Hindari mengkode keras ID AccessKey dan rahasia AccessKey ke dalam kode proyek Anda. Jika tidak, pasangan AccessKey mungkin bocor dan keamanan semua sumber daya di akun Anda terganggu.

  • Tabel data telah dibuat. Untuk informasi lebih lanjut, lihat Operasi pada Tabel Data.

  • Indeks pencarian telah dibuat untuk tabel data. Untuk informasi lebih lanjut, lihat Buat Indeks Pencarian.

  • Jika Anda ingin menggunakan SDK Tablestore untuk melakukan kueri bersarang, instance OTSClient telah diinisialisasi. Untuk informasi lebih lanjut, lihat Inisialisasi Instance OTSClient.

Gunakan Konsol Tablestore

Anda dapat menggunakan Konsol Tablestore untuk mengkueri hanya data bidang bersarang tingkat tunggal saat melakukan kueri bersarang.

  1. Pergi ke tab Indexes.

    1. Masuk ke Konsol Tablestore.

    2. Di bilah navigasi atas, pilih grup sumber daya dan wilayah.

    3. Di halaman Overview, klik nama instans yang ingin Anda kelola atau klik Manage Instance di kolom Actions instans.

    4. Di tab Tables dari tab Instance Details, klik nama tabel data atau klik Indexes di kolom Actions tabel data.

  2. Di tab Indexes, temukan indeks pencarian yang ingin Anda gunakan untuk mengkueri data dan klik Manage Data di kolom Actions.

  3. Di kotak dialog Search, tentukan kondisi kueri.

    1. Secara default, sistem mengembalikan semua kolom atribut. Untuk mengembalikan kolom atribut tertentu, matikan All Columns dan tentukan kolom atribut yang ingin Anda kembalikan. Pisahkan beberapa kolom atribut dengan koma (,).

      Catatan

      Secara default, sistem mengembalikan semua kolom kunci utama tabel data.

    2. Pilih operator logis And, Or, atau Not sesuai dengan kebutuhan bisnis Anda.

      Jika Anda memilih operator logika And, data yang memenuhi kondisi kueri akan dikembalikan. Jika Anda memilih operator Or dan menentukan kondisi kueri tunggal, data yang memenuhi kondisi kueri akan dikembalikan. Jika Anda memilih operator logika Or dan menentukan beberapa kondisi kueri, data yang memenuhi salah satu kondisi kueri akan dikembalikan. Jika Anda memilih operator logika Not, data yang tidak memenuhi kondisi kueri akan dikembalikan.

    3. Pilih bidang tipe Nested dan klik Add.

    4. Pilih subbidang dan atur parameter Query Type ke tipe kueri yang ingin Anda gunakan untuk mengkueri data, seperti TermQuery(TermQuery). Kemudian, masukkan nilai yang ingin Anda kueri.

    5. Secara default, fitur pengurutan dinonaktifkan. Jika Anda ingin mengurutkan hasil kueri berdasarkan bidang tertentu, aktifkan Sort dan tentukan bidang berdasarkan mana Anda ingin mengurutkan hasil kueri dan urutan pengurutan.

    6. Secara default, fitur agregasi dinonaktifkan. Jika Anda ingin mengumpulkan statistik pada bidang tertentu, aktifkan Collect Statistics, tentukan bidang berdasarkan mana Anda ingin mengumpulkan statistik, dan konfigurasikan informasi yang diperlukan untuk mengumpulkan statistik.

  4. Klik OK.

    Data yang memenuhi kondisi kueri ditampilkan secara terurut di tab Indexes.

Gunakan SDK Tablestore

Anda dapat menggunakan SDK Tablestore untuk mengkueri data bidang bersarang tingkat tunggal dan multi-level. Saat melakukan kueri bersarang, Anda dapat menggunakan fitur sorotan untuk menyoroti string kueri dalam hasil kueri. Untuk informasi lebih lanjut, lihat Highlight.

Anda dapat menggunakan SDK Tablestore berikut untuk melakukan kueri bersarang: Tablestore SDK for Java, Tablestore SDK for Go, Tablestore SDK for Python, Tablestore SDK for Node.js, Tablestore SDK for .NET, dan Tablestore SDK for PHP. Dalam contoh ini, Tablestore SDK for Java digunakan.

Kueri bidang bersarang tingkat tunggal

Kode sampel berikut memberikan contoh cara mengkueri baris di mana nilai kolom col_nested.nested_1 adalah tablestore. Dalam contoh ini, kolom bersarang bernama col_nested mencakup subkolom nested_1 dan nested_2.

private static void nestedQuery(SyncClient client) {
    SearchQuery searchQuery = new SearchQuery();
    NestedQuery nestedQuery = new NestedQuery(); // Atur tipe kueri ke NestedQuery. 
    nestedQuery.setPath("col_nested"); // Tentukan jalur kolom bersarang. 
    TermQuery termQuery = new TermQuery(); // Tentukan subkueri untuk melakukan kueri bersarang. 
    termQuery.setFieldName("col_nested.nested_1"); // Tentukan nama kolom. Nama tersebut harus mencakup jalur kolom bersarang. 
    termQuery.setTerm(ColumnValue.fromString("tablestore")); // Tentukan nilai yang ingin Anda gunakan untuk mencocokkan nilai kolom. 
    nestedQuery.setQuery(termQuery);
    nestedQuery.setScoreMode(ScoreMode.None);
    searchQuery.setQuery(nestedQuery);
    //searchQuery.setGetTotalCount(true);// Atur parameter GetTotalCount ke true untuk mengembalikan jumlah total baris yang cocok. 

    SearchRequest searchRequest = new SearchRequest("<TABLE_NAME>", "<SEARCH_INDEX_NAME>", searchQuery);
    // Anda dapat mengonfigurasi parameter columnsToGet untuk menentukan kolom yang akan dikembalikan atau menentukan bahwa semua kolom dikembalikan. Jika Anda tidak mengonfigurasi parameter ini, hanya kolom kunci utama yang dikembalikan. 
    //SearchRequest.ColumnsToGet columnsToGet = new SearchRequest.ColumnsToGet();
    //columnsToGet.setReturnAll(true); // Tentukan bahwa semua kolom dikembalikan. 
    //columnsToGet.setColumns(Arrays.asList("ColName1","ColName2")); // Tentukan kolom yang ingin Anda kembalikan. 
    //searchRequest.setColumnsToGet(columnsToGet);

    SearchResponse resp = client.search(searchRequest);
    //System.out.println("TotalCount: " + resp.getTotalCount()); // Tentukan bahwa jumlah total baris yang cocok bukan jumlah baris yang dikembalikan yang ditampilkan. 
    System.out.println("Row: " + resp.getRows());
}

Kueri bidang bersarang multi-level

Kode sampel berikut memberikan contoh cara mengkueri baris di mana nilai kolom col_nested.nested_2.nested_2_2 adalah tablestore. Dalam contoh ini, kolom bersarang bernama col_nested mencakup subkolom nested_1 dan nested_2. Subkolom nested_2 mencakup kolom nested_2_1 dan nested_2_2.

private static void nestedQuery(SyncClient client) {
    SearchQuery searchQuery = new SearchQuery();
    NestedQuery nestedQuery = new NestedQuery(); // Atur tipe kueri ke NestedQuery. 
    nestedQuery.setPath("col_nested.nested_2"); // Tentukan jalur kolom bersarang, yaitu jalur induk kolom yang ingin Anda kueri. 
    TermQuery termQuery = new TermQuery(); // Tentukan subkueri untuk melakukan kueri bersarang. 
    termQuery.setFieldName("col_nested.nested_2.nested_2_2"); // Tentukan nama kolom. Nama tersebut harus mencakup jalur kolom bersarang. 
    termQuery.setTerm(ColumnValue.fromString("tablestore")); // Tentukan nilai yang ingin Anda gunakan untuk mencocokkan nilai kolom. 
    nestedQuery.setQuery(termQuery);
    nestedQuery.setScoreMode(ScoreMode.None);
    searchQuery.setQuery(nestedQuery);
    //searchQuery.setGetTotalCount(true);// Atur parameter GetTotalCount ke true untuk mengembalikan jumlah total baris yang cocok. 

    SearchRequest searchRequest = new SearchRequest("<TABLE_NAME>", "<SEARCH_INDEX_NAME>", searchQuery);
    // Anda dapat mengonfigurasi parameter columnsToGet untuk menentukan kolom yang akan dikembalikan atau menentukan bahwa semua kolom dikembalikan. Jika Anda tidak mengonfigurasi parameter ini, hanya kolom kunci utama yang dikembalikan. 
    //SearchRequest.ColumnsToGet columnsToGet = new SearchRequest.ColumnsToGet();
    //columnsToGet.setReturnAll(true); // Tentukan bahwa semua kolom dikembalikan. 
    //columnsToGet.setColumns(Arrays.asList("ColName1","ColName2")); // Tentukan kolom yang ingin Anda kembalikan. 
    //searchRequest.setColumnsToGet(columnsToGet);

    SearchResponse resp = client.search(searchRequest);
    //System.out.println("TotalCount: " + resp.getTotalCount()); // Tentukan bahwa jumlah total baris yang cocok bukan jumlah baris yang dikembalikan yang ditampilkan. 
    System.out.println("Row: " + resp.getRows());
}

Gabungkan kueri bersarang dengan kueri Boolean

Persyaratan kueri

Dalam contoh ini, tabel data terdiri dari kolom col_string tipe String dan kolom col_nested tipe String. Kolom col_nested menyimpan data dalam format JSON. Tabel berikut menjelaskan baris sampel dalam tabel data.

Catatan

Untuk membantu Anda lebih memahami demonstrasi, nomor seri ditambahkan ke setiap baris.

Nomor seri

col_string

col_nested

1

a

[{"col_keyword": "tablestore"},{"col_keyword": "searchindex","col_long": 1}]

2

b

[{"col_keyword": "tablestore","col_long": 1}]

3

c

[{"col_keyword": "searchindex"},{"col_long": 1}]

Sebagai contoh, Anda memiliki persyaratan kueri berikut untuk kolom col_nested:

  • Baris Anak yang Sama Memenuhi Beberapa Kondisi Kueri

    Sebagai contoh, Anda ingin mengkueri baris di mana nilai kolom col_keyword adalah "tablestore" dan nilai kolom col_long tidak kosong. Kolom col_keyword dan col_long termasuk dalam baris anak yang sama dari kolom col_nested.

  • Baris Anak yang Berbeda Memenuhi Beberapa Kondisi Kueri

    Sebagai contoh, Anda ingin mengkueri baris di mana nilai kolom col_keyword adalah "tablestore" dan nilai kolom col_long tidak kosong. Kolom col_keyword dan col_long termasuk dalam baris anak yang sama atau berbeda dari kolom col_nested.

Untuk mengkueri baris yang memenuhi persyaratan sebelumnya, lakukan langkah-langkah berikut:

  1. Buat indeks pencarian untuk tabel data dan atur tipe kolom col_nested dalam indeks pencarian ke Nested.

    Kolom col_nested terdiri dari subbidang berikut: subbidang col_keyword tipe Keyword dan subbidang col_long tipe Long.

  2. Pilih metode kueri yang sesuai berdasarkan persyaratan kueri.

    • Jika Anda ingin memenuhi persyaratan kueri bahwa baris anak yang sama memenuhi beberapa kondisi kueri, Anda dapat menentukan beberapa kueri Boolean dalam kueri bersarang.

    • Jika Anda ingin memenuhi persyaratan bahwa baris anak yang berbeda memenuhi beberapa kondisi kueri, Anda dapat menentukan beberapa kueri bersarang dalam kueri Boolean.

Kode sampel berikut memberikan contoh cara mengkueri data berdasarkan persyaratan kueri Anda. Lihat kode sampel yang sesuai berdasarkan persyaratan kueri Anda.

Baris anak yang sama memenuhi beberapa kondisi kueri

Kode sampel berikut memberikan contoh cara mengkueri baris di mana nilai kolom col_nested.col_keyword adalah "tablestore" dan nilai kolom col_nested.col_long tidak kosong. Kolom col_nested.col_keyword dan col_nested.col_long termasuk dalam baris anak yang sama.

Berdasarkan baris sampel dalam tabel data, hanya baris dengan nomor seri 2 yang memenuhi kondisi kueri.

public static void nestedQuery(SyncClient client) {
    // Kondisi kueri 1: Nilai kolom col_keyword di baris anak dari kolom col_nested adalah "tablestore".
    TermQuery termQuery = new TermQuery();
    termQuery.setFieldName("col_nested.col_keyword");
    termQuery.setTerm(ColumnValue.fromString("tablestore"));

    // Kondisi kueri 2: Nilai kolom col_long di baris anak dari kolom col_nested tidak kosong.
    ExistsQuery existsQuery = new ExistsQuery();
    existsQuery.setFieldName("col_nested.col_long");

    // Gunakan operator And dari kueri Boolean untuk mengkueri baris yang memenuhi kedua kondisi kueri sebelumnya pada saat yang sama.
    List<Query> mustQueries = new ArrayList<>();
    mustQueries.add(termQuery);
    mustQueries.add(existsQuery);
    BoolQuery boolQuery = new BoolQuery();
    boolQuery.setMustQueries(mustQueries);

    // Tentukan beberapa kueri Boolean dalam kueri bersarang untuk mengkueri baris yang memenuhi kedua kondisi kueri sebelumnya pada saat yang sama.
    NestedQuery nestedQuery = new NestedQuery(); // Atur tipe kueri ke NestedQuery. 
    nestedQuery.setPath("col_nested"); // Tentukan jalur kolom bersarang, yaitu jalur induk kolom yang ingin Anda kueri. 
    nestedQuery.setQuery(boolQuery);
    nestedQuery.setScoreMode(ScoreMode.None);

    SearchQuery searchQuery = new SearchQuery();
    searchQuery.setQuery(nestedQuery);

    SearchRequest searchRequest = new SearchRequest("<TABLE_NAME>", "<SEARCH_INDEX_NAME>", searchQuery);
    // Anda dapat mengonfigurasi parameter columnsToGet untuk menentukan kolom yang akan dikembalikan atau menentukan bahwa semua kolom dikembalikan. Jika Anda tidak mengonfigurasi parameter ini, hanya kolom kunci utama yang dikembalikan. 
    //SearchRequest.ColumnsToGet columnsToGet = new SearchRequest.ColumnsToGet();
    //columnsToGet.setReturnAll(true); // Tentukan bahwa semua kolom dikembalikan. 
    //columnsToGet.setColumns(Arrays.asList("ColName1","ColName2")); // Tentukan kolom yang ingin Anda kembalikan. 
    //searchRequest.setColumnsToGet(columnsToGet);

    SearchResponse resp = client.search(searchRequest);
    //System.out.println("TotalCount: " + resp.getTotalCount()); // Tentukan bahwa jumlah total baris yang cocok bukan jumlah baris yang dikembalikan yang ditampilkan. 
    System.out.println("Row: " + resp.getRows());
}

Baris anak yang berbeda memenuhi beberapa kondisi kueri

Kode sampel berikut memberikan contoh cara mengkueri baris di mana nilai kolom col_nested.col_keyword adalah "tablestore" dan nilai kolom col_nested.col_long tidak kosong. Kolom col_nested.col_keyword dan col_nested.col_long termasuk dalam baris anak yang sama atau berbeda.

Berdasarkan baris sampel dalam tabel data, baris dengan nomor seri 1 dan 2 memenuhi kondisi kueri.

public static void nestedQuery(SyncClient client) {
        // Kondisi kueri 1: Nilai kolom col_keyword di baris anak dari kolom col_nested adalah "tablestore".
        TermQuery termQuery = new TermQuery();
        termQuery.setFieldName("col_nested.col_keyword");
        termQuery.setTerm(ColumnValue.fromString("tablestore"));
        NestedQuery nestedTermQuery = new NestedQuery();
        nestedTermQuery.setPath("col_nested");
        nestedTermQuery.setScoreMode(ScoreMode.None);
        nestedTermQuery.setQuery(termQuery);

        // Kondisi kueri 2: Nilai kolom col_long di baris anak dari kolom col_nested tidak kosong.
        ExistsQuery existsQuery = new ExistsQuery();
        existsQuery.setFieldName("col_nested.col_long");
        NestedQuery nestedExistsQuery = new NestedQuery();
        nestedExistsQuery.setPath("col_nested");
        nestedExistsQuery.setScoreMode(ScoreMode.None);
        nestedExistsQuery.setQuery(existsQuery);

        // Gunakan operator And dari kueri Boolean untuk mengkueri baris yang memenuhi kedua kondisi kueri sebelumnya.
        List<Query> mustQueries = new ArrayList<>();
        mustQueries.add(nestedTermQuery);
        mustQueries.add(nestedExistsQuery);

        // Tentukan beberapa kueri bersarang dalam kueri Boolean untuk mengkueri baris yang memenuhi kondisi kueri.
        BoolQuery boolQuery = new BoolQuery();
        boolQuery.setMustQueries(mustQueries);

        SearchQuery searchQuery = new SearchQuery();
        searchQuery.setQuery(boolQuery);

        SearchRequest searchRequest = new SearchRequest("<TABLE_NAME>", "<SEARCH_INDEX_NAME>", searchQuery);
        // Anda dapat mengonfigurasi parameter columnsToGet untuk menentukan kolom yang akan dikembalikan atau menentukan bahwa semua kolom dikembalikan. Jika Anda tidak mengonfigurasi parameter ini, hanya kolom kunci utama yang dikembalikan. 
        //SearchRequest.ColumnsToGet columnsToGet = new SearchRequest.ColumnsToGet();
        //columnsToGet.setReturnAll(true); // Tentukan bahwa semua kolom dikembalikan. 
        //columnsToGet.setColumns(Arrays.asList("ColName1","ColName2")); // Tentukan kolom yang ingin Anda kembalikan. 
        //searchRequest.setColumnsToGet(columnsToGet);

        SearchResponse resp = client.search(searchRequest);
        //System.out.println("TotalCount: " + resp.getTotalCount()); // Tentukan bahwa jumlah total baris yang cocok bukan jumlah baris yang dikembalikan yang ditampilkan. 
        System.out.println("Row: " + resp.getRows());
    }

Gunakan fitur sorotan dalam kueri bersarang

Kode sampel berikut memberikan contoh cara menggunakan kueri bersarang untuk mengkueri baris di mana nilai subkolom Level1_Col1_Nested dari kolom bersarang bernama Col_Nested cocok dengan hangzhou shanghai dan menyoroti string kueri dalam hasil kueri.

/**
 * Aktifkan fitur sorotan dengan menggunakan parameter innerHits untuk kueri bersarang. 
 */
public static void nestedQueryWithHighlighting(SyncClient client) {
        SearchRequest searchRequest = SearchRequest.newBuilder()
                .tableName("<TABLE_NAME>")
                .indexName("<SEARCH_INDEX_NAME>")
                .returnAllColumnsFromIndex(true)
                .searchQuery(SearchQuery.newBuilder()
                        .limit(5)
                        .query(QueryBuilders.nested()
                                .path("Col_Nested")
                                .scoreMode(ScoreMode.Min)
                                .query(QueryBuilders.match("Col_Nested.Level1_Col1_Nested", "hangzhou shanghai"))
                                .innerHits(InnerHits.newBuilder()
                                        .highlight(Highlight.newBuilder()
                                                .addFieldHighlightParam("Col_Nested.Level1_Col1_Nested", HighlightParameter.newBuilder().build())
                                                .build())
                                        .build()))
                        .build())
                .build();
        SearchResponse resp = client.search(searchRequest);

        // Tampilkan hasil yang disorot. 
        printSearchHit(resp.getSearchHits(), "");
}

/**
 * Tampilkan konten yang memenuhi kondisi kueri. 
 * @param searchHits searchHits
 * Jika output menggunakan struktur Nested @param prefix, tambahkan awalan untuk menampilkan informasi hierarki. 
 */
private static void printSearchHit(List<SearchHit> searchHits, String prefix) {
    for (SearchHit searchHit : searchHits) {
        if (searchHit.getScore() != null) {
            System.out.printf("%s Skor: %s\n", prefix, searchHit.getScore());
        }

        if (searchHit.getOffset() != null) {
            System.out.printf("%s Offset: %s\n", prefix, searchHit.getOffset());
        }

        if (searchHit.getRow() != null) {
            System.out.printf("%s Baris: %s\n", prefix, searchHit.getRow().toString());
        }

        // Tampilkan segmen teks yang disorot dari kolom di setiap baris. 
        if (searchHit.getHighlightResultItem() != null) {
            System.out.printf("%s Sorotan: \n", prefix);
            StringBuilder strBuilder = new StringBuilder();
            for (Map.Entry<String, HighlightField> entry : searchHit.getHighlightResultItem().getHighlightFields().entrySet()) {
                strBuilder.append(entry.getKey()).append(":").append("[");
                strBuilder.append(StringUtils.join(",", entry.getValue().getFragments())).append("]\n");
            }
            System.out.printf("%s   %s", prefix, strBuilder);
        }

        // Hasil sorotan dari kolom bersarang. 
        for (SearchInnerHit searchInnerHit : searchHit.getSearchInnerHits().values()) {
            System.out.printf("%s Jalur: %s\n", prefix, searchInnerHit.getPath());
            System.out.printf("%s InnerHit: \n", prefix);
            printSearchHit(searchInnerHit.getSubSearchHits(), prefix + "    ");
        }

        System.out.println();
    }
}

Sebagai contoh, bidang Col_Nested terdiri dari subbidang berikut: subbidang Level1_Col1_Text tipe Text dan subbidang Level1_Col2_Nested tipe Nested. Subbidang Level1_Col2_Nested tipe Nested juga terdiri dari bidang Level2_Col1_Text.

Kode sampel berikut memberikan contoh cara menambahkan kueri Boolean ke kueri bersarang untuk menyoroti string kueri dalam bidang Level1_Col1_Text dan subbidang Level2_Col1_Text dari bidang Level1_Col2_Nested.

public static void nestedQueryWithHighlighting(SyncClient client) {
    SearchRequest searchRequest = SearchRequest.newBuilder()
            .tableName("<TABLE_NAME>")
            .indexName("<SEARCH_INDEX_NAME>")
            .returnAllColumnsFromIndex(true)
            .searchQuery(SearchQuery.newBuilder()
                    .limit(5)
                    .query(QueryBuilders.nested()
                            .path("Col_Nested")
                            .scoreMode(ScoreMode.Min)
                            .query(QueryBuilders.bool()
                                    .should(QueryBuilders.match("Col_Nested.Level1_Col1_Text", "hangzhou shanghai"))
                                    .should(QueryBuilders.nested()
                                            .path("Col_Nested.Level1_Col2_Nested")
                                            .scoreMode(ScoreMode.Min)
                                            .query(QueryBuilders.match("Col_Nested.Level1_Col2_Nested.Level2_Col1_Text", "hangzhou shanghai"))
                                            .innerHits(InnerHits.newBuilder()
                                                    .highlight(Highlight.newBuilder()
                                                            .addFieldHighlightParam("Col_Nested.Level1_Col2_Nested.Level2_Col1_Text", HighlightParame
                                                            .build())
                                                    .build())))
                            .innerHits(InnerHits.newBuilder()
                                    .sort(new Sort(Arrays.asList(
                                            new ScoreSort(),
                                            new DocSort()
                                    )))
                                    .highlight(Highlight.newBuilder()
                                            .addFieldHighlightParam("Col_Nested.Level1_Col1_Text", HighlightParameter.newBuilder().build())
                                            .build())
                                    .build()))
                            .build())
            .build();
    SearchResponse resp = client.search(searchRequest);
    // Tampilkan hasil yang disorot. 
    printSearchHit(resp.getSearchHits(), "");
}

/**
 * Tampilkan konten yang memenuhi kondisi kueri. 
 * @param searchHits searchHits
 * Jika output menggunakan struktur Nested @param prefix, tambahkan awalan untuk menampilkan informasi hierarki. 
 */
private static void printSearchHit(List<SearchHit> searchHits, String prefix) {
    for (SearchHit searchHit : searchHits) {
        if (searchHit.getScore() != null) {
            System.out.printf("%s Skor: %s\n", prefix, searchHit.getScore());
        }

        if (searchHit.getOffset() != null) {
            System.out.printf("%s Offset: %s\n", prefix, searchHit.getOffset());
        }

        if (searchHit.getRow() != null) {
            System.out.printf("%s Baris: %s\n", prefix, searchHit.getRow().toString());
        }

        // Tampilkan segmen teks yang disorot dari bidang di setiap baris. 
        if (searchHit.getHighlightResultItem() != null) {
            System.out.printf("%s Sorotan: \n", prefix);
            StringBuilder strBuilder = new StringBuilder();
            for (Map.Entry<String, HighlightField> entry : searchHit.getHighlightResultItem().getHighlightFields().entrySet()) {
                strBuilder.append(entry.getKey()).append(":").append("[");
                strBuilder.append(StringUtils.join(",", entry.getValue().getFragments())).append("]\n");
            }
            System.out.printf("%s   %s", prefix, strBuilder);
        }

        // Hasil sorotan dari kolom bersarang. 
        for (SearchInnerHit searchInnerHit : searchHit.getSearchInnerHits().values()) {
            System.out.printf("%s Jalur: %s\n", prefix, searchInnerHit.getPath());
            System.out.printf("%s InnerHit: \n", prefix);
            printSearchHit(searchInnerHit.getSubSearchHits(), prefix + "    ");
        }

        System.out.println();
    }
}

Aturan penagihan

Saat Anda menggunakan indeks pencarian untuk mengkueri data, Anda dikenakan biaya untuk throughput baca yang dikonsumsi. Untuk informasi lebih lanjut, lihat Item yang Dapat Ditagih dari Indeks Pencarian.

FAQ

Referensi

  • Saat Anda menggunakan indeks pencarian untuk mengkueri data, Anda dapat menggunakan metode kueri berikut: kueri tepat, kueri terms, kueri match all, kueri match, kueri match phrase, kueri prefix, kueri range, kueri wildcard, kueri fuzzy, kueri Boolean, kueri geo, kueri bersarang, kueri vektor KNN, dan kueri exists. Anda dapat memilih metode kueri berdasarkan kebutuhan bisnis Anda untuk mengkueri data dari berbagai dimensi.

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

    Anda dapat menggunakan fitur collapse (distinct) untuk meruntuhkan set hasil berdasarkan kolom tertentu. Dengan cara ini, data dari jenis tertentu muncul hanya sekali dalam hasil kueri. Untuk informasi lebih lanjut, lihat Collapse (Distinct).

  • Jika Anda ingin menganalisis data dalam tabel data, Anda dapat menggunakan fitur agregasi dari operasi Search atau menjalankan pernyataan SQL. Sebagai contoh, Anda dapat memperoleh nilai minimum dan maksimum, jumlah, dan jumlah total baris. Untuk informasi lebih lanjut, lihat Agregasi dan Kueri SQL.

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