All Products
Search
Document Center

Tablestore:Kueri bersarang

Last Updated:May 08, 2026

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

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

  • Anda dapat mengkueri bidang nested dan jenis bidang lainnya dalam satu permintaan. Untuk informasi selengkapnya tentang tipe bidang nested, lihat Tipe data nested.

Operasi API

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

Parameter

Parameter

Deskripsi

path

Path bidang nested. Path ini mirip dengan struktur pohon. Misalnya, news.title menentukan subfield title dalam bidang nested bernama news.

query

Kueri yang ingin Anda lakukan pada subfield dalam bidang nested. Kueri ini 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 berarti jumlah total baris yang memenuhi kondisi kueri tidak dikembalikan.

Jika Anda mengatur parameter ini ke true, performa kueri akan terganggu.

weight

Bobot yang ingin Anda tetapkan untuk bidang yang ingin Anda kueri guna 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 bilangan floating point 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 dari setiap baris yang memenuhi kondisi kueri. Anda dapat mengonfigurasi parameter returnAll dan columns untuk parameter ini.

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

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

InnerHits

Pengaturan subfield dari bidang nested.

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

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

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

  • highlight: pengaturan penyorotan untuk subfield dari bidang nested. Untuk informasi selengkapnya, 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 yang memiliki 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 selengkapnya, lihat Buat pasangan AccessKey.

    Peringatan

    Pasangan AccessKey akun Alibaba Cloud memiliki izin atas semua operasi API. Kami menyarankan agar Anda menggunakan Pengguna RAM untuk memanggil operasi API atau melakukan O&M rutin. Jangan menyematkan ID AccessKey dan Rahasia AccessKey secara langsung ke dalam kode proyek Anda karena dapat menyebabkan kebocoran pasangan AccessKey dan mengganggu keamanan semua sumber daya dalam akun Anda.

  • Tabel data telah dibuat. Untuk informasi selengkapnya, lihat Operasi pada tabel data.

  • Indeks pencarian telah dibuat untuk tabel data. Untuk informasi selengkapnya, lihat Buat indeks pencarian.

  • Jika Anda ingin menggunakan SDK Tablestore untuk melakukan kueri bersarang, instans OTSClient telah diinisialisasi. Untuk informasi selengkapnya, lihat Inisialisasi instans OTSClient.

Gunakan Konsol Tablestore

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

  1. Buka tab Index Management.

    1. Login ke Konsol Table Store.

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

    3. Di halaman Overview, klik nama instans atau klik Instance Management di kolom Actions.

    4. Di tab Instance Details, di tab Data Table List, klik nama tabel data atau klik Index Management di kolom Actions.

  2. Di tab Index Management, temukan Search Index yang dituju dan klik Search di kolom Actions.

  3. Di kotak dialog Search, kueri data.

    1. Secara default, semua kolom dikembalikan. Untuk mengembalikan kolom tertentu, matikan Retrieve All Columns dan masukkan nama kolom, dipisahkan dengan koma.

      Catatan

      Secara default, Table Store mengembalikan kolom kunci primer dari tabel data.

    2. Pilih operator logika: And, Or, atau Not.

      Jika Anda memilih And, kueri akan mengembalikan data yang memenuhi semua kondisi yang ditentukan. Jika Anda memilih Or, kueri akan mengembalikan data yang memenuhi setidaknya salah satu kondisi yang ditentukan. Jika Anda memilih Not, kueri akan mengembalikan data yang tidak memenuhi kondisi yang ditentukan.

    3. Pilih bidang tipe nested dan klik Add.

    4. Pilih subfield, atur tipe kueri ke tipe yang diinginkan, seperti TermQuery, dan masukkan nilai untuk dikueri.

    5. Secara default, pengurutan dinonaktifkan. Untuk mengurutkan hasil berdasarkan bidang tertentu, aktifkan Enable Sorting, tambahkan bidang pengurutan, dan konfigurasikan urutan pengurutan.

    6. Secara default, agregasi dinonaktifkan. Untuk melakukan agregasi statistik pada bidang tertentu, aktifkan Enable Aggregation, tambahkan bidang untuk agregasi, dan konfigurasikan pengaturan agregasi.

  4. Klik OK.

    Hasil kueri ditampilkan di tab Index Management.

Gunakan SDK Tablestore

Anda dapat menggunakan SDK untuk mengkueri data di bidang tipe nested tingkat tunggal maupun multi-level. Saat melakukan kueri bersarang, Anda dapat menggunakan fitur highlight untuk menyoroti kata kunci dalam hasil. Untuk informasi selengkapnya tentang penyorotan, 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.

Contoh kueri nested tingkat tunggal

Contoh berikut menunjukkan cara mengkueri data di mana `col_nested.nested_1` adalah `tablestore`. Dalam contoh ini, `col_nested` adalah bidang nested yang baris anaknya berisi kolom `nested_1` dan `nested_2`.

private static void nestedQuery(SyncClient client) {
    SearchQuery searchQuery = new SearchQuery();
    NestedQuery nestedQuery = new NestedQuery(); // Set the query type to NestedQuery.
    nestedQuery.setPath("col_nested"); // Set the path of the nested column.
    TermQuery termQuery = new TermQuery(); // Construct the subquery for NestedQuery.
    termQuery.setFieldName("col_nested.nested_1"); // Set the column name. Note that it includes the path of the nested column.
    termQuery.setTerm(ColumnValue.fromString("tablestore")); // Set the value to query.
    nestedQuery.setQuery(termQuery);
    nestedQuery.setScoreMode(ScoreMode.None);
    searchQuery.setQuery(nestedQuery);
    //searchQuery.setGetTotalCount(true); // Set this to return the total number of matched rows.

    SearchRequest searchRequest = new SearchRequest("<TABLE_NAME>", "<SEARCH_INDEX_NAME>", searchQuery);
    // Use the columnsToGet parameter to specify the columns to return or to return all columns. If you do not set this parameter, only the primary key columns are returned by default.
    //SearchRequest.ColumnsToGet columnsToGet = new SearchRequest.ColumnsToGet();
    //columnsToGet.setReturnAll(true); // Set this to return all columns.
    //columnsToGet.setColumns(Arrays.asList("ColName1","ColName2")); // Set this to return specified columns.
    //searchRequest.setColumnsToGet(columnsToGet);

    SearchResponse resp = client.search(searchRequest);
    //System.out.println("TotalCount: " + resp.getTotalCount()); // Print the total number of matched rows, not the number of returned rows.
    System.out.println("Row: " + resp.getRows());
}

Contoh kueri nested multi-level

Contoh berikut menunjukkan cara mengkueri data di mana `col_nested.nested_2.nested_2_2` adalah `tablestore`. Dalam contoh ini, `col_nested` adalah bidang nested yang baris anaknya berisi kolom `nested_1` dan `nested_2`. Kolom `nested_2` juga merupakan bidang nested yang baris anaknya berisi kolom `nested_2_1` dan `nested_2_2`.

private static void nestedQuery(SyncClient client) {
    SearchQuery searchQuery = new SearchQuery();
    NestedQuery nestedQuery = new NestedQuery(); // Set the query type to NestedQuery.
    nestedQuery.setPath("col_nested.nested_2"); // Set the path of the nested column, which is the parent path of the field to query.
    TermQuery termQuery = new TermQuery(); // Construct the subquery for NestedQuery.
    termQuery.setFieldName("col_nested.nested_2.nested_2_2"); // Set the column name, which is the full path of the field to query.
    termQuery.setTerm(ColumnValue.fromString("tablestore")); // Set the value to query.
    nestedQuery.setQuery(termQuery);
    nestedQuery.setScoreMode(ScoreMode.None);
    searchQuery.setQuery(nestedQuery);
    //searchQuery.setGetTotalCount(true); // Set this to return the total number of matched rows.

    SearchRequest searchRequest = new SearchRequest("<TABLE_NAME>", "<SEARCH_INDEX_NAME>", searchQuery);
    // Use the columnsToGet parameter to specify the columns to return or to return all columns. If you do not set this parameter, only the primary key columns are returned by default.
    //SearchRequest.ColumnsToGet columnsToGet = new SearchRequest.ColumnsToGet();
    //columnsToGet.setReturnAll(true); // Set this to return all columns.
    //columnsToGet.setColumns(Arrays.asList("ColName1","ColName2")); // Set this to return specified columns.
    //searchRequest.setColumnsToGet(columnsToGet);

    SearchResponse resp = client.search(searchRequest);
    //System.out.println("TotalCount: " + resp.getTotalCount()); // Print the total number of matched rows, not the number of returned rows.
    System.out.println("Row: " + resp.getRows());
}

Contoh kueri nested komposit

Kebutuhan kueri

Asumsikan bahwa sebuah tabel data memiliki dua kolom: `col_string` (String) dan `col_nested` (String). Kolom `col_nested` menyimpan data dalam format JSON. Tabel berikut menunjukkan data sampel dari tabel data ini.

Catatan

Kolom nomor baris ditambahkan ke setiap baris untuk tujuan demonstrasi.

Nomor baris

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}]

Asumsikan bahwa Anda memiliki kebutuhan kueri berikut untuk data dalam kolom `col_nested`:

  • Satu baris anak memenuhi beberapa kondisi kueri

    Misalnya, Anda dapat mengkueri baris di mana satu baris anak dalam kolom `col_nested` memenuhi kedua kondisi berikut: nilai kolom `col_keyword` adalah `tablestore` dan nilai kolom `col_long` tidak kosong.

  • Baris anak berbeda memenuhi beberapa kondisi kueri

    Misalnya, Anda dapat mengkueri baris di mana satu baris anak dalam kolom `col_nested` memiliki nilai `col_keyword` sebesar `tablestore`, dan baris anak lain memiliki nilai `col_long` yang tidak kosong.

Untuk memenuhi kebutuhan kueri ini, Anda dapat melakukan langkah-langkah berikut:

  1. Buat indeks pencarian untuk tabel data dan atur kolom `col_nested` sebagai tipe nested dalam indeks pencarian.

    Kolom `col_nested` berisi dua sub-field: `col_keyword` (Keyword) dan `col_long` (Long).

  2. Gunakan metode kueri yang sesuai berdasarkan kebutuhan Anda.

    • Untuk melakukan kueri di mana satu baris anak memenuhi beberapa kondisi kueri, konfigurasikan beberapa BoolQueries di dalam NestedQuery.

    • Untuk mengkueri baris anak berbeda yang memenuhi beberapa kondisi, Anda dapat mengatur beberapa kondisi `NestedQuery` di bawah `BoolQuery`.

Contoh berikut menunjukkan cara mengkueri data. Anda dapat merujuk pada contoh yang sesuai dengan kebutuhan kueri Anda.

Contoh kueri di mana satu baris anak memenuhi beberapa kondisi

Contoh berikut menunjukkan cara mengkueri baris di mana satu baris anak dalam kolom `col_nested` memenuhi kedua kondisi ini: `col_nested.col_keyword adalah "tablestore" dan `col_nested.col_long tidak kosong.

Berdasarkan data sampel, hanya data di baris 2 yang memenuhi kondisi kueri.

public static void nestedQuery(SyncClient client) {
    // Condition 1: The value of the col_keyword column in the child row of col_nested must be "tablestore".
    TermQuery termQuery = new TermQuery();
    termQuery.setFieldName("col_nested.col_keyword");
    termQuery.setTerm(ColumnValue.fromString("tablestore"));

    // Condition 2: The col_long column in the child row of col_nested must not be empty.
    ExistsQuery existsQuery = new ExistsQuery();
    existsQuery.setFieldName("col_nested.col_long");

    // Use the AND condition of BoolQuery to query for child rows that meet both conditions.
    List<Query> mustQueries = new ArrayList<>();
    mustQueries.add(termQuery);
    mustQueries.add(existsQuery);
    BoolQuery boolQuery = new BoolQuery();
    boolQuery.setMustQueries(mustQueries);

    // Set a BoolQuery within the NestedQuery to require a child row to meet multiple query conditions at the same time.
    NestedQuery nestedQuery = new NestedQuery();    // Set the query type to NestedQuery.
    nestedQuery.setPath("col_nested");   // Set the path of the nested column, which is the parent path of the field to query.
    nestedQuery.setQuery(boolQuery);
    nestedQuery.setScoreMode(ScoreMode.None);

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

    SearchRequest searchRequest = new SearchRequest("<TABLE_NAME>", "<SEARCH_INDEX_NAME>", searchQuery);
    // Use the columnsToGet parameter to specify the columns to return or to return all columns. If you do not set this parameter, only the primary key columns are returned by default.
    //SearchRequest.ColumnsToGet columnsToGet = new SearchRequest.ColumnsToGet();
    //columnsToGet.setReturnAll(true); // Set this to return all columns.
    //columnsToGet.setColumns(Arrays.asList("ColName1","ColName2")); // Set this to return specified columns.
    //searchRequest.setColumnsToGet(columnsToGet);

    SearchResponse resp = client.search(searchRequest);
    //System.out.println("TotalCount: " + resp.getTotalCount()); // Print the total number of matched rows, not the number of returned rows.
    System.out.println("Row: " + resp.getRows());
}

Contoh kueri di mana baris anak berbeda memenuhi beberapa kondisi

Contoh berikut mengkueri baris di mana objek nested dalam bidang `col_nested` memenuhi dua kondisi: col_nested.col_keyword adalah "tablestore" dan col_nested.col_long tidak kosong.

Berdasarkan data sampel, data di baris 1 dan baris 2 memenuhi kondisi kueri.

public static void nestedQuery(SyncClient client) {
        // Condition 1: The value of the col_keyword column in the child row of col_nested must be "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);

        // Condition 2: The col_long column in the child row of col_nested must not be empty.
        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);

        // Use the AND condition of BoolQuery to query for rows that meet the preceding conditions.
        List<Query> mustQueries = new ArrayList<>();
        mustQueries.add(nestedTermQuery);
        mustQueries.add(nestedExistsQuery);

        // The BoolQuery includes multiple NestedQuery conditions. The query is successful if different child rows meet the respective query conditions.
        BoolQuery boolQuery = new BoolQuery();
        boolQuery.setMustQueries(mustQueries);

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

        SearchRequest searchRequest = new SearchRequest("<TABLE_NAME>", "<SEARCH_INDEX_NAME>", searchQuery);
        // Use the columnsToGet parameter to specify the columns to return or to return all columns. If you do not set this parameter, only the primary key columns are returned by default.
        //SearchRequest.ColumnsToGet columnsToGet = new SearchRequest.ColumnsToGet();
        //columnsToGet.setReturnAll(true); // Set this to return all columns.
        //columnsToGet.setColumns(Arrays.asList("ColName1","ColName2")); // Set this to return specified columns.
        //searchRequest.setColumnsToGet(columnsToGet);

        SearchResponse resp = client.search(searchRequest);
        //System.out.println("TotalCount: " + resp.getTotalCount()); // Print the total number of matched rows, not the number of returned rows.
        System.out.println("Row: " + resp.getRows());
    }

Contoh penggunaan ringkasan dan penyorotan dalam kueri bersarang

Contoh berikut menunjukkan cara menggunakan `NestedQuery` untuk mengkueri data di mana nilai sub-field `Level1_Col1_Nested` dalam bidang nested `Col_Nested` cocok dengan `hangzhou shanghai. Kueri pencarian disorot dalam hasil yang dikembalikan.

/**
 * Use summary and highlighting in a NestedQuery. Set parameters using innerHits.
 */
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);

        // Print the highlighted results.
        printSearchHit(resp.getSearchHits(), "");
}

/**
 * Print the content of searchHit.
 * @param searchHits The search hits.
 * @param prefix The prefix to add when printing nested structures to show hierarchical information.
 */
private static void printSearchHit(List<SearchHit> searchHits, String prefix) {
    for (SearchHit searchHit : searchHits) {
        if (searchHit.getScore() != null) {
            System.out.printf("%s Score: %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 Row: %s\n", prefix, searchHit.getRow().toString());
        }

        // Print the highlighted fragments for each field.
        if (searchHit.getHighlightResultItem() != null) {
            System.out.printf("%s Highlight: \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);
        }

        // Highlighted results for the nested type.
        for (SearchInnerHit searchInnerHit : searchHit.getSearchInnerHits().values()) {
            System.out.printf("%s Path: %s\n", prefix, searchInnerHit.getPath());
            System.out.printf("%s InnerHit: \n", prefix);
            printSearchHit(searchInnerHit.getSubSearchHits(), prefix + "    ");
        }

        System.out.println();
    }
}

Asumsikan bahwa bidang nested multi-level `Col_Nested` mencakup dua sub-field: `Level1_Col1_Text` (Text) dan `Level1_Col2_Nested` (Nested). Bidang nested `Level1_Col2_Nested` mencakup sub-field `Level2_Col1_Text`.

Contoh berikut menunjukkan cara menambahkan `BoolQuery` ke `NestedQuery` untuk menggunakan fitur ringkasan dan penyorotan pada sub-field `Level1_Col1_Text` dalam bidang `Col_Nested` dan sub-field `Level2_Col1_Text` di bawah `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", HighlightParameter.newBuilder().build())
                                                            .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);
    // Print the highlighted results.
    printSearchHit(resp.getSearchHits(), "");
}

/**
 * Print the content of searchHit.
 * @param searchHits The search hits.
 * @param prefix The prefix to add when printing nested structures to show hierarchical information.
 */
private static void printSearchHit(List<SearchHit> searchHits, String prefix) {
    for (SearchHit searchHit : searchHits) {
        if (searchHit.getScore() != null) {
            System.out.printf("%s Score: %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 Row: %s\n", prefix, searchHit.getRow().toString());
        }

        // Print the highlighted fragments for each field.
        if (searchHit.getHighlightResultItem() != null) {
            System.out.printf("%s Highlight: \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);
        }

        // Highlighted results for the nested type.
        for (SearchInnerHit searchInnerHit : searchHit.getSearchInnerHits().values()) {
            System.out.printf("%s Path: %s\n", prefix, searchInnerHit.getPath());
            System.out.printf("%s InnerHit: \n", prefix);
            printSearchHit(searchInnerHit.getSubSearchHits(), prefix + "    ");
        }

        System.out.println();
    }
}

Penagihan

Mengkueri data menggunakan Indeks Pencarian mengonsumsi throughput baca. Untuk informasi selengkapnya, lihat Pengukuran dan penagihan Indeks Pencarian.

FAQ

Referensi