Anda dapat melakukan kueri bersarang untuk menanyakan data di subbidang dari bidang Bersarang. Bidang Bersarang tidak dapat dikueri secara langsung. Untuk menanyakan bidang Bersarang, Anda harus menentukan jalur bidang Bersarang dan subkueri dalam objek NestedQuery. Subkueri dapat berupa jenis kueri apa pun.
Prasyarat
Sebuah instance OTSClient telah diinisialisasi. Untuk informasi lebih lanjut, lihat Inisialisasi instance OTSClient.
Tabel data dibuat dan data ditulis ke tabel data. Untuk informasi lebih lanjut, lihat Buat tabel data dan Tulis data.
Indeks pencarian dibuat untuk tabel data. Untuk informasi lebih lanjut, lihat Buat indeks pencarian.
Parameter
Parameter | Deskripsi |
NamaTabel | Nama tabel data. |
NamaIndeks | Nama indeks pencarian. |
Jalur | Jalur bidang Bersarang. Bidang Bersarang menggunakan struktur pohon. Sebagai contoh, news.title menentukan subbidang judul dalam bidang Bersarang bernama news. |
Kueri | Kueri pada subbidang dalam bidang Bersarang. Kueri dapat berupa jenis apa pun. |
ModeSkor | Nilai yang digunakan untuk menghitung skor ketika sebuah bidang berisi beberapa nilai. |
InnerHits | Pengaturan subbidang dalam bidang Bersarang.
|
Contoh
Bidang Bersarang Tingkat Tunggal
Kode sampel berikut memberikan contoh cara menanyakan baris di mana nilai bidang col_nested.nested_1 adalah tablestore. Dalam contoh ini, bidang Bersarang bernama col_nested terdiri dari subbidang berikut: nested_1 dan nested_2.
func NestedQuery(client *tablestore.TableStoreClient, tableName string, indexName string) {
searchRequest := &tablestore.SearchRequest{}
searchRequest.SetTableName(tableName)
searchRequest.SetIndexName(indexName)
query := &search.NestedQuery{ // Setel jenis kueri ke NestedQuery.
Path: "col_nested", // Tentukan jalur bidang Bersarang.
Query: &search.TermQuery{ // Bangun subkueri untuk kueri bersarang.
FieldName: "col_nested.nested_1", // Tentukan nama bidang yang ingin Anda tanyakan. Nama bidang harus berisi awalan col_nested.
Term: "tablestore", // Tentukan kata kunci yang digunakan untuk mencocokkan nilai bidang.
},
ScoreMode: search.ScoreMode_Avg,
}
searchQuery := search.NewSearchQuery()
searchQuery.SetQuery(query)
searchRequest.SetSearchQuery(searchQuery)
// Tentukan bahwa semua bidang dikembalikan.
searchRequest.SetColumnsToGet(&tablestore.ColumnsToGet{
ReturnAll: true,
})
searchResponse, err := client.Search(searchRequest)
if err != nil {
fmt.Printf("%#v", err)
return
}
fmt.Println("IsAllSuccess: ", searchResponse.IsAllSuccess) // Periksa apakah semua baris yang memenuhi kondisi kueri dikembalikan.
fmt.Println("RowCount: ", len(searchResponse.Rows))
for _, row := range searchResponse.Rows {
jsonBody, err := json.Marshal(row)
if err != nil {
panic(err)
}
fmt.Println("Row: ", string(jsonBody))
}
}Bidang Bersarang dengan Fitur Sorotan Diaktifkan
Kode sampel berikut memberikan contoh cara menanyakan baris di mana nilai bidang col_nested.nested_1 adalah tablestore dan menyoroti kata kunci dalam hasil kueri. Dalam contoh ini, bidang Bersarang bernama col_nested terdiri dari subbidang berikut: nested_1 dan nested_2.
func NestedQueryWithHighlight(client *tablestore.TableStoreClient, tableName string, indexName string) {
searchRequest := &tablestore.SearchRequest{}
searchRequest.SetTableName(tableName)
searchRequest.SetIndexName(indexName)
query := &search.NestedQuery{ // Setel jenis kueri ke NestedQuery.
Path: "col_nested", // Tentukan jalur bidang Bersarang.
Query: &search.TermQuery{ // Bangun subkueri untuk kueri bersarang.
FieldName: "col_nested.nested_1", // Tentukan nama bidang yang ingin Anda tanyakan. Nama bidang harus berisi awalan col_nested.
Term: "tablestore", // Tentukan nilai yang ingin Anda cocokkan.
},
ScoreMode: search.ScoreMode_Avg,
InnerHits: &search.InnerHits{
Offset: proto.Int32(0),
Limit: proto.Int32(3),
Highlight: &search.Highlight{
FieldHighlightParameters: map[string]*search.HighlightParameter{
"col_nested.nested_1": {
NumberOfFragments: proto.Int32(5),
PreTag: proto.String(""),
},
},
},
},
}
searchQuery := search.NewSearchQuery()
searchQuery.SetQuery(query)
searchRequest.SetSearchQuery(searchQuery)
// Tentukan bahwa semua bidang dikembalikan.
searchRequest.SetColumnsToGet(&tablestore.ColumnsToGet{
ReturnAllFromIndex: true,
})
if resp, err := client.Search(searchRequest); err != nil {
fmt.Println("Kueri sorotan gagal dengan kesalahan: ", err)
} else {
fmt.Println("RequestId: " + resp.RequestId)
// Tampilkan hasil yang disorot.
printSearchHit(resp.SearchHits, " ")
}
fmt.Println("kueri sorotan selesai")
}
/**
* Tampilkan konten yang memenuhi kondisi kueri.
* @param searchHits searchHits
* Jika keluaran menggunakan struktur Nested dengan awalan @param, tambahkan awalan untuk menampilkan informasi hierarki.
*/
func printSearchHit(searchHits []*tablestore.SearchHit, padding string) {
for _, searchHit := range searchHits {
if searchHit.Score != nil {
fmt.Printf("%sScore: %f\n", padding, *searchHit.Score)
}
if searchHit.NestedDocOffset != nil {
fmt.Printf("%sOffset: %d\n", padding, *searchHit.NestedDocOffset)
}
if searchHit.Row != nil {
fmt.Printf("%sRow: %v\n", padding, *searchHit.Row)
}
if searchHit.HighlightResultItem != nil && len(searchHit.HighlightResultItem.HighlightFields) != 0 {
fmt.Printf("%sHighlight: \n", padding)
for colName, highlightResult := range searchHit.HighlightResultItem.HighlightFields {
fmt.Printf("%sColumnName: %s, Highlight_Fragments: %v\n", padding+padding, colName, highlightResult.Fragments)
}
}
if searchHit.SearchInnerHits != nil && len(searchHit.SearchInnerHits) != 0 {
fmt.Printf("%sInnerHits: \n", padding)
for path, innerSearchHit := range searchHit.SearchInnerHits {
fmt.Printf("%sPath: %s\n", padding+padding, path)
fmt.Printf("%sSearchHit: \n", padding+padding)
printSearchHit(innerSearchHit.SearchHits, padding+padding)
}
}
fmt.Println("")
}
}FAQ
Referensi
Saat menggunakan indeks pencarian untuk menanyakan data, Anda dapat menggunakan metode kueri berikut: kueri tepat, kueri terms, kueri cocok semua, kueri cocok, kueri frasa cocok, kueri awalan, kueri rentang, kueri wildcard, kueri geo, kueri Boolean, kueri vektor KNN, kueri bersarang, dan kueri eksis. Anda dapat menggunakan metode kueri yang disediakan oleh indeks pencarian untuk menanyakan data dari berbagai dimensi sesuai dengan kebutuhan bisnis Anda.
Anda dapat mengurutkan atau membagi halaman baris yang memenuhi kondisi kueri dengan menggunakan fitur pengurutan dan penomoran halaman. Untuk informasi lebih lanjut, lihat Pengurutan dan penomoran halaman.
Anda dapat menggunakan fitur kolaps (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 Kolaps (distinct).
Jika ingin menganalisis data dalam tabel data, Anda dapat menggunakan fitur agregasi operasi Pencarian atau menjalankan pernyataan SQL. Sebagai contoh, Anda dapat memperoleh nilai minimum dan maksimum, jumlah, serta total jumlah baris. Untuk informasi lebih lanjut, lihat Agregasi dan Kueri SQL.
Jika 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 Melakukan pemindaian paralel.