Untuk menggunakan fitur rangkuman dan penyorotan, Anda harus mengaktifkan penyorotan pada bidang Text saat membuat indeks pencarian. Setelah itu, Anda dapat mengatur parameter penyorotan dalam kueri untuk mengembalikan cuplikan yang berisi istilah kueri yang cocok, dengan istilah tersebut disorot.
Skenario
Fitur rangkuman dan penyorotan memungkinkan Anda mengekstraksi cuplikan di sekitar istilah kueri yang cocok dan menyorotnya. Fitur ini berguna dalam skenario pencarian teks lengkap, seperti pencarian web, pengambilan catatan obrolan, dan pencarian dokumen.
Ikhtisar fungsi
Fitur rangkuman dan penyorotan menyoroti teks dalam hasil pencarian yang cocok atau relevan dengan kueri Anda. Hal ini membantu pengguna menemukan konten relevan dengan cepat dan meningkatkan efisiensi pengambilan informasi. Fitur ini juga didukung untuk struktur data kompleks yang berisi tipe bersarang, seperti JSON, guna menemukan informasi secara tepat. Secara default, Tablestore menggunakan tag untuk menandai istilah kueri yang cocok.
Untuk menggunakan fitur ini, lakukan konfigurasi berikut:
-
Saat membuat indeks pencarian, atur parameter enableHighlighting ke True untuk bidang Text. Untuk informasi selengkapnya, lihat Buat indeks pencarian.
PentingFitur rangkuman dan penyorotan hanya dapat diaktifkan untuk bidang Text.
-
Saat mengkueri data, Anda dapat menyesuaikan gaya penyorotan dengan menentukan parameter seperti metode encoding untuk fragmen yang disorot, jumlah maksimum fragmen yang dikembalikan, serta pre-tag dan post-tag.
Asumsikan Anda telah mengaktifkan fitur rangkuman dan penyorotan untuk bidang Text saat membuat indeks pencarian. Jika nilai bidang Text adalah query highlight test, Anda dapat menggunakan match phrase query untuk kata kunci highlight. Setelah menentukan parameter penyorotan, fragmen yang disorot query highlight test akan dikembalikan.
Catatan
-
Saat menggunakan fitur rangkuman dan penyorotan dengan MatchQuery atau MatchPhraseQuery, istilah yang cocok mungkin disorot oleh beberapa pasang pre-tag dan post-tag.
-
Jika tokenizer untuk bidang Text menggunakan tokenisasi semantik maksimum, fitur rangkuman dan penyorotan tidak didukung saat Anda menggunakan MatchPhraseQuery untuk mengkueri data.
-
Pemisahan fragmen mungkin membagi istilah yang cocok dalam teks. Dalam kasus ini, istilah tersebut mungkin tidak disorot.
API
Fitur rangkuman dan penyorotan menggunakan API Search. Jenis kueri yang didukung meliputi TermQuery, TermsQuery, MatchQuery, MatchPhraseQuery, PrefixQuery, WildcardQuery, dan NestedQuery.
Parameter
Saat menggunakan fitur rangkuman dan penyorotan, Anda dapat mengatur parameter penyorotan melalui parameter Highlight. Untuk sub-kolom bertipe bersarang, Anda dapat mengatur parameter penyorotan menggunakan parameter InnerHits.
Parameter penyorotan
|
Nama |
Tipe |
Deskripsi |
|
fieldHighlightParams (wajib) |
|
Nama bidang dan pengaturan fragmen. Kunci adalah nama bidang yang hasil rangkuman dan penyorotannya ingin Anda kembalikan. Nilainya adalah objek |
|
highlightEncoder (opsional) |
HighlightEncoder |
Metode encoding untuk teks asli dalam fragmen yang disorot. Nilai yang valid:
|
|
fieldHighlightParams[].numberOfFragments (opsional) |
Integer |
Jumlah maksimum fragmen yang disorot yang akan dikembalikan untuk suatu bidang. Kami menyarankan Anda mengatur parameter ini ke |
|
fieldHighlightParams[].fragmentSize (opsional) |
Integer |
Panjang target setiap fragmen. Nilai default adalah |
|
fieldHighlightParams[].preTag (opsional) |
String |
Pre-tag untuk istilah yang cocok. Nilai default adalah |
|
fieldHighlightParams[].postTag (opsional) |
String |
Post-tag untuk istilah yang cocok. Nilai default adalah |
|
fieldHighlightParams[].highlightFragmentOrder (opsional) |
HighlightFragmentOrder |
Urutan pengembalian beberapa fragmen yang disorot. |
Parameter InnerHits
|
Parameter |
Deskripsi |
|
sort |
Aturan pengurutan untuk sub-baris bersarang yang dikembalikan. |
|
offset |
Posisi awal untuk mengembalikan sub-baris ketika kolom bersarang berisi beberapa sub-baris. |
|
limit |
Jumlah sub-baris yang dikembalikan ketika kolom bersarang berisi beberapa sub-baris. Nilai default: 3. |
|
highlight |
Konfigurasi parameter penyorotan untuk sub-kolom bersarang. Untuk informasi selengkapnya tentang konfigurasi, lihat Parameter penyorotan. |
Penggunaan
Fitur rangkuman dan penyorotan hanya dapat digunakan melalui SDK.
Sebelum melakukan kueri penyorotan, pastikan persiapan berikut telah selesai:
-
Anda harus memiliki Akun Alibaba Cloud atau pengguna RAM yang memiliki izin untuk melakukan operasi pada Tablestore. Untuk memberikan izin kepada pengguna RAM agar dapat mengakses Tablestore, lihat Berikan izin kepada RAM user menggunakan kebijakan RAM.
Saat menggunakan SDK, jika Anda belum memiliki AccessKey yang valid, buatlah satu untuk Akun Alibaba Cloud atau pengguna RAM Anda. Untuk informasi selengkapnya, lihat Buat AccessKey.
-
Tabel data telah dibuat. Untuk informasi selengkapnya, lihat Operasi tabel data.
-
Indeks pencarian telah dibuat untuk tabel data dan penyorotan telah diaktifkan untuk bidang yang ditentukan. Untuk informasi selengkapnya, lihat Buat indeks pencarian.
-
Saat menggunakan SDK, Anda harus menginisialisasi klien Tablestore. Untuk informasi selengkapnya, lihat Inisialisasi Client Tablestore.
Fitur rangkuman dan penyorotan tersedia melalui Java SDK, Go SDK, Python SDK, dan Node.js SDK. Contoh berikut menunjukkan cara menggunakan fitur ini dengan Java SDK.
Menggunakan rangkuman dan penyorotan kueri untuk bidang non-bersarang
Contoh berikut menggunakan match query untuk mengambil baris di mana bidang description berisi istilah tablestore. Istilah yang cocok dibungkus dalam fragmen yang dikembalikan dengan tag <b> dan </b>. Bidang description merupakan bidang Text yang telah diaktifkan fitur rangkuman dan penyorotannya.
String tableName = "example_table";
String indexName = "example_index";
MatchQuery matchQuery = new MatchQuery();
matchQuery.setFieldName("description");
matchQuery.setText("tablestore");
HighlightParameter highlightParameter = new HighlightParameter();
highlightParameter.setPreTag("");
highlightParameter.setPostTag("");
Highlight highlight = new Highlight();
highlight.addFieldHighlightParam("description", highlightParameter);
SearchQuery searchQuery = new SearchQuery();
searchQuery.setQuery(matchQuery);
searchQuery.setHighlight(highlight);
searchQuery.setLimit(10);
SearchRequest request = new SearchRequest(tableName, indexName, searchQuery);
SearchResponse response = client.search(request);
for (SearchHit hit : response.getSearchHits()) {
HighlightResultItem resultItem = hit.getHighlightResultItem();
if (resultItem == null) {
continue;
}
HighlightField field = resultItem.getHighlightFieldByName("description");
if (field != null) {
System.out.println(field.getFragments());
}
}
Gunakan penyorotan saat mengkueri bidang bersarang
Contoh berikut menunjukkan cara menggunakan NestedQuery untuk mengkueri data di mana nilai sub-bidang Level1_Col1_Nested dalam bidang bersarang Col_Nested cocok dengan hangzhou shanghai. Kueri pencarian disorot dalam hasil yang dikembalikan.
MatchQuery matchQuery = new MatchQuery();
matchQuery.setFieldName("items.description");
matchQuery.setText("hangzhou");
HighlightParameter parameter = new HighlightParameter();
parameter.setPreTag("");
parameter.setPostTag("");
Highlight highlight = new Highlight();
highlight.addFieldHighlightParam("items.description", parameter);
InnerHits innerHits = new InnerHits();
innerHits.setLimit(3);
innerHits.setSort(new Sort(Arrays.asList(
new ScoreSort(), new DocSort(SortOrder.ASC))));
innerHits.setHighlight(highlight);
NestedQuery nestedQuery = new NestedQuery();
nestedQuery.setPath("items");
nestedQuery.setQuery(matchQuery);
nestedQuery.setScoreMode(ScoreMode.None);
nestedQuery.setInnerHits(innerHits);
SearchQuery searchQuery = new SearchQuery();
searchQuery.setQuery(nestedQuery);
Misalnya, bidang bersarang multi-level Col_Nested mencakup dua sub-bidang: Level1_Col1_Text (Text) dan Level1_Col2_Nested (Nested). Bidang bersarang Level1_Col2_Nested mencakup sub-bidang Level2_Col1_Text.
Contoh berikut menunjukkan cara menambahkan BoolQuery ke dalam NestedQuery untuk menerapkan fitur rangkuman dan penyorotan pada sub-bidang Level1_Col1_Text dalam bidang Col_Nested serta sub-bidang 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);
// Cetak hasil yang disorot.
printSearchHit(resp.getSearchHits(), "");
}
/**
* Cetak konten searchHit.
* @param searchHits Hasil pencarian.
* @param prefix Awalan yang ditambahkan saat mencetak struktur bersarang untuk menunjukkan informasi hierarkis.
*/
private static void printSearchHit(List<SearchHit> searchHits, String prefix) {
for (SearchHit searchHit : searchHits) {
if (searchHit.getScore() != null) {
System.out.printf("%s Skor: %s
", prefix, searchHit.getScore());
}
if (searchHit.getOffset() != null) {
System.out.printf("%s Offset: %s
", prefix, searchHit.getOffset());
}
if (searchHit.getRow() != null) {
System.out.printf("%s Baris: %s
", prefix, searchHit.getRow().toString());
}
// Cetak fragmen yang disorot untuk setiap bidang.
if (searchHit.getHighlightResultItem() != null) {
System.out.printf("%s Sorot:
", 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("]
");
}
System.out.printf("%s %s", prefix, strBuilder);
}
// Hasil yang disorot untuk tipe bersarang.
for (SearchInnerHit searchInnerHit : searchHit.getSearchInnerHits().values()) {
System.out.printf("%s Jalur: %s
", prefix, searchInnerHit.getPath());
System.out.printf("%s InnerHit:
", prefix);
printSearchHit(searchInnerHit.getSubSearchHits(), prefix + " ");
}
System.out.println();
}
}
Penagihan
Penggunaan fitur rangkuman dan penyorotan selama kueri data tidak memengaruhi aturan penagihan yang berlaku.
Saat mengkueri data menggunakan indeks pencarian, throughput baca dikonsumsi. Untuk informasi selengkapnya, lihat Pengukuran dan penagihan indeks pencarian.
FAQ
Referensi
Search Index mendukung berbagai jenis kueri untuk kueri data multidimensi, termasuk kueri tepat, kueri istilah, Pencocokan semua kueri, kueri cocok, kueri frasa cocok, kueri rentang, kueri awalan, kueri akhiran, kueri wildcard, kueri wildcard berbasis token, kueri multi-bidang, kueri geografis, kueri bersarang, Pencarian vektor, dan kueri eksistensi.
Saat mengkueri data, Anda dapat mengurutkan dan melakukan paginasi set hasil atau melakukan penggabungan (deduplikasi).
Untuk analisis data, seperti menemukan nilai maksimum atau minimum, menghitung jumlah, atau menghitung baris, Anda dapat menggunakan fitur agregasi statistik atau kueri SQL.
Untuk mengekspor data dengan cepat tanpa memperhatikan urutan set hasil, Anda dapat menggunakan fitur Parallel Scan.