全部产品
Search
文档中心

Tablestore:Kueri Bersarang

更新时间:Jul 06, 2025

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

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.

  • Sort: aturan pengurutan subbidang dalam bidang bersarang.

  • Offset: subbidang pertama yang akan dikembalikan ketika bidang Bersarang terdiri dari beberapa subbidang.

  • Batas: jumlah maksimum subbidang yang akan dikembalikan ketika bidang Bersarang terdiri dari beberapa subbidang. Nilai default: 3.

  • highlight: menentukan apakah fitur sorotan diaktifkan untuk subbidang dalam bidang Bersarang. Untuk informasi lebih lanjut, lihat Sorot hasil kueri.

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.