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:
Saat membuat indeks pencarian, atur parameter enableHighlighting ke True untuk bidang Teks. Untuk detail lebih lanjut, lihat Buat Indeks Pencarian.
PentingFitur sorot hanya dapat diaktifkan untuk bidang Teks.
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:
| |
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: | |
postTag | Tag penutup yang digunakan untuk menyorot kata kunci kueri. Contoh: | |
highlightFragmentOrder | Aturan pengurutan fragmen teks yang disorot untuk dikembalikan.
| |
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
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.