全部产品
Search
文档中心

Tablestore:Sorot

更新时间:Jul 06, 2025

Ketika membuat indeks pencarian, Anda dapat mengaktifkan fitur sorot untuk bidang Teks. Dengan cara ini, saat menggunakan indeks pencarian untuk menanyakan data berdasarkan bidang Teks, Anda dapat mengonfigurasi parameter sorot untuk menyorot string kueri dalam segmen baris yang memenuhi kondisi kueri.

Skenario

Fitur sorot dapat digunakan dalam pencarian teks lengkap untuk menyorot string kueri dalam segmen baris yang memenuhi kondisi kueri. Fitur ini cocok untuk skenario seperti pencarian web, pengambilan riwayat obrolan, dan pencarian dokumen.

Ikhtisar fitur

Fitur sorot membantu menyorot teks yang cocok atau terkait dengan string kueri dalam hasil kueri. Ini meningkatkan efisiensi pengambilan informasi dengan memungkinkan pengguna menemukan string kueri dengan cepat. Fitur ini juga mendukung pencarian di data bersarang dengan struktur rumit, seperti JSON. Secara default, Tablestore menggunakan untuk menyorot string kueri dalam hasil kueri.

Untuk menggunakan fitur highlight, selesaikan konfigurasi berikut:

  1. Saat membuat indeks pencarian, atur parameter enableHighlighting ke True untuk bidang Teks. Untuk detail lebih lanjut, lihat Buat Indeks Pencarian.

    Penting

    Fitur sorot hanya dapat diaktifkan untuk bidang Teks.

  2. Saat menggunakan fitur sorot dalam permintaan kueri, tentukan gaya sorotan kustom dengan mengonfigurasi parameter seperti metode pengkodean fragmen teks yang disorot, jumlah maksimum fragmen teks yang ingin dikembalikan per baris, serta tag pembuka dan penutup.

Sebagai contoh, jika Anda mengaktifkan fitur sorot untuk bidang Teks saat membuat indeks pencarian dan melakukan kueri frasa cocok untuk string kueri West Lake, baris dengan nilai Hangzhou West Lake Scenic Area akan memenuhi kondisi kueri. Segmen teks yang disorot, Hangzhou West Lake Scenic Area, akan dikembalikan.

Catatan penggunaan

  • Jika fitur sorot diaktifkan dalam kueri cocok atau kueri frasa cocok, string kueri dalam hasil mungkin disorot menggunakan beberapa tag pembuka (preTag) dan tag penutup (postTag).

  • Jika metode tokenisasi untuk bidang Teks adalah tokenisasi berbasis unit semantik maksimum (MaxWord), fitur sorot tidak didukung saat melakukan kueri frasa cocok pada bidang Teks.

  • Jika Anda mengembalikan beberapa fragmen, string kueri dalam fragmen tersebut mungkin terpisah dan tidak disorot.

Operasi API

Untuk menggunakan fitur highlight, panggil operasi Search dan atur tipe query ke TermQuery, TermsQuery, MatchQuery, MatchPhraseQuery, PrefixQuery, WildcardQuery, atau NestedQuery.

Parameter

Dalam sebagian besar kasus, Anda dapat mengonfigurasi parameter Highlight untuk menggunakan fitur highlight. Untuk subbidang dari bidang bersarang, Anda harus mengonfigurasi parameter InnerHits.

Parameter Highlight

Parameter

Deskripsi

highlightEncoder

Metode pengkodean untuk fragmen teks yang disorot. Nilai yang valid:

  • PLAIN (default): menampilkan fragmen teks yang disorot tanpa perlu pengkodean.

  • HTML: melakukan pengkodean HTML pada fragmen teks yang disorot. Setelah pengkodean HTML selesai, < diubah menjadi &lt;, > menjadi &gt;, " menjadi &quot;, ' menjadi &#x27;, dan / menjadi &#x2F;. Jika Anda ingin menampilkan halaman web, kami sarankan Anda menggunakan format HTML.

fieldHighlightParams

Pengaturan highlight untuk bidang. Anda hanya dapat mengaktifkan fitur highlight untuk bidang yang berisi kata kunci yang ditentukan dalam objek SearchQuery.

HighlightParameter

numberOfFragments

Jumlah maksimum fragmen teks yang disorot untuk dikembalikan. Kami sarankan Anda mengatur nilainya menjadi 1.

fragmentSize

Panjang setiap fragmen teks yang dikembalikan. Nilai default: 100.

Penting

Panjang aktual dari fragmen teks yang dikembalikan mungkin berbeda dari nilai parameter ini.

preTag

Tag pembuka yang digunakan untuk menyorot kata kunci kueri. Contoh: <em> dan <b>. Nilai default: <em>. Anda dapat menentukan tag pembuka kustom sesuai dengan kebutuhan bisnis Anda. Parameter preTag mendukung set karakter berikut: < > " ' /, a-z, A-Z, dan 0-9.

postTag

Tag penutup yang digunakan untuk menyorot kata kunci kueri. Contoh: </em> dan </b>. Nilai default: <em>. Anda dapat menentukan tag penutup kustom sesuai dengan kebutuhan bisnis Anda. Parameter postTag mendukung set karakter berikut: < > " ' /, a-z, A-Z, dan 0-9.

highlightFragmentOrder

Aturan pengurutan fragmen teks yang disorot untuk dikembalikan.

  • TEXT_SEQUENCE (default): Fragmen teks yang disorot diurutkan berdasarkan urutan kemunculannya dalam teks asli.

  • SCORE: Fragmen teks yang disorot diurutkan berdasarkan skor kata kunci yang cocok.

Parameter InnerHits

Parameter

Deskripsi

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 highlight untuk subbidang dari bidang bersarang. Untuk informasi lebih lanjut, lihat Parameter Highlight.

Metode

Penting

Fitur highlight hanya dapat digunakan melalui SDK Tablestore.

Sebelum menggunakan fitur highlight, 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 fitur highlight melalui SDK Tablestore, pasangan AccessKey telah dibuat untuk akun Alibaba Cloud atau pengguna RAM Anda. Untuk informasi lebih lanjut, lihat Buat Pasangan AccessKey.

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

  • Indeks pencarian telah dibuat untuk tabel data dan fitur highlight diaktifkan untuk bidang tertentu. Untuk informasi lebih lanjut, lihat Buat Indeks Pencarian.

  • Jika Anda ingin menggunakan fitur highlight melalui SDK Tablestore, instance OTSClient telah diinisialisasi. Untuk informasi lebih lanjut, lihat Inisialisasi Instance OTSClient.

Anda dapat menggunakan SDK Tablestore berikut untuk fitur highlight: Tablestore SDK for Java, Tablestore SDK for Go, Tablestore SDK for Python, dan Tablestore SDK for Node.js. Contoh ini menggunakan Tablestore SDK for Java.

Gunakan fitur sorotan saat Anda meminta bidang non-bertingkat

Kode sampel berikut menunjukkan cara menggunakan fitur MatchQuery untuk meminta data yang cocok dengan hangzhou shanghai dari bidang Col_Text dan menyorot kata kunci dalam hasil permintaan. Dalam contoh ini, bidang Col_Text bertipe Text.

/**
 * Aktifkan fitur sorotan untuk kata kunci dalam objek MatchQuery.
 */
public static void matchQueryWithHighlighting(SyncClient client) {
    SearchRequest searchRequest = SearchRequest.newBuilder()
            .tableName("<TABLE_NAME>")
            .indexName("<SEARCH_INDEX_NAME>")
            .returnAllColumnsFromIndex(true)
            .searchQuery(SearchQuery.newBuilder()
                    .limit(5)
                    .query(QueryBuilders.bool()
                            .should(QueryBuilders.match("Col_Text", "hangzhou shanghai")))
                    .highlight(Highlight.newBuilder()
                            .addFieldHighlightParam("Col_Text", HighlightParameter.newBuilder()
                                    .highlightFragmentOrder(HighlightFragmentOrder.TEXT_SEQUENCE)
                                    .preTag("")
                                    .build())
                            .build())
                    .build())
            .build();
    SearchResponse resp = client.search(searchRequest);

    // Tampilkan hasil permintaan yang disorot. Saat Anda meminta bidang non-Nested, atur parameter awalan menjadi null.
    printSearchHit(resp.getSearchHits(), "");
}

/**
 * Tampilkan konten yang memenuhi kondisi permintaan.
 * @param searchHits searchHits
 * Jika keluaran menggunakan struktur Nested dengan awalan @param, 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 fragmen sorotan untuk setiap bidang.
        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);
        }

        System.out.println();
    }
}

Gunakan fitur sorotan saat Anda meminta kolom bersarang

Berikut adalah contoh kode yang menunjukkan cara menggunakan kueri bersarang untuk meminta baris di mana nilai subkolom Level1_Col1_Nested dari kolom bersarang bernama Col_Nested cocok dengan hangzhou shanghai dan menyorot 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 dengan awalan @param, 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 bertipe Text dan subbidang Level1_Col2_Nested bertipe Nested. Subbidang Level1_Col2_Nested bertipe Nested juga terdiri dari bidang Level2_Col1_Text.

Berikut adalah contoh kode yang menunjukkan cara menambahkan kueri Boolean ke kueri bersarang untuk menyorot string kueri di 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 dengan awalan @param, 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

Penggunaan fitur sorot saat meminta data tidak memengaruhi aturan penagihan yang ada dari Tablestore.

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

FAQ

Referensi

  • Saat 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 nested, 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 menggunakan fitur pengurutan dan paging. Untuk informasi lebih lanjut, lihat Melakukan Pengurutan dan Paging.

    Anda dapat menggunakan fitur collapse (distinct) untuk menggabungkan set hasil berdasarkan kolom tertentu. 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, Anda dapat menggunakan fitur agregasi operasi Search atau mengeksekusi pernyataan SQL. Sebagai contoh, Anda bisa mendapatkan nilai minimum dan maksimum, jumlah, serta total jumlah baris. Untuk informasi lebih lanjut, lihat Agregasi dan Kueri SQL.

  • Jika Anda ingin 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.