All Products
Search
Document Center

Tablestore:Kueri JSON

Last Updated:Dec 07, 2025

Data JSON mencakup tipe Object dan Nested. Untuk mengkueri data bertipe Object, Anda dapat langsung menggunakan tipe kueri yang sesuai. Untuk mengkueri data bertipe Nested, Anda harus membungkus kondisi kueri dalam NestedQuery.

Prasyarat

Batasan

Bidang bertipe Vector tidak dapat digunakan dalam JSON.

Skenario kueri

Misalkan sebuah tabel data memiliki kolom id bertipe String dan kolom address bertipe String, yang menyimpan data dalam format JSON.

Misalnya, suatu baris memiliki nilai kolom address berikut: [{ "country": "China", "city": "hangzhou" }, { "country": "usa", "city": "Seattle" }]. Kueri untuk country="China" dan city="Seattle" tidak akan mengembalikan baris tersebut jika kolom address bertipe Nested. Namun, jika kolom tersebut bertipe Object, kueri tersebut akan mengembalikan baris tersebut.

Kode contoh

Contoh kueri tipe Nested JSON

Contoh berikut mengkueri baris-baris yang memenuhi dua kondisi dalam objek nested yang sama pada bidang address: address.country bernilai "China" dan address.city bernilai "Seattle".

import (
    "fmt"
    "github.com/aliyun/aliyun-tablestore-go-sdk/tablestore"
    "github.com/aliyun/aliyun-tablestore-go-sdk/tablestore/search"
)

func nestedQuery1(client *tablestore.TableStoreClient) {
    searchRequest := &tablestore.SearchRequest{}
    searchRequest.SetTableName("<TABLE_NAME>")
    searchRequest.SetIndexName("<SEARCH_INDEX_NAME>")

    // Kondisi 1: address.country = "China"
    termQuery1 := &search.TermQuery{
        FieldName: "address.country",
        Term:      "China",
    }

    // Kondisi 2: address.city = "Seattle"
    termQuery2 := &search.TermQuery{
        FieldName: "address.city",
        Term:      "Seattle",
    }

    // Menggabungkan kedua kondisi. Keduanya harus terpenuhi.
    boolQuery := &search.BoolQuery{
        MustQueries: []search.Query{
            termQuery1,
            termQuery2,
        },
    }

    // Kueri nested
    nestedQuery := &search.NestedQuery{
        Path:      "address",
        Query:     boolQuery,
        ScoreMode: search.ScoreMode_None,
    }

    // Membangun dan mengeksekusi pencarian.
    searchQuery := search.NewSearchQuery()
    searchQuery.SetQuery(nestedQuery)
    searchRequest.SetSearchQuery(searchQuery)

    resp, err := client.Search(searchRequest)
    if err != nil {
        fmt.Printf("Search failed: %v\n", err)
        return
    }

    fmt.Printf("Found %d rows\n", len(resp.Rows))
        for _, row := range resp.Rows {
        fmt.Printf("Row: %+v\n", row.PrimaryKey)
    }
}

Contoh kueri tipe Object JSON

Contoh berikut mengkueri baris-baris di mana bidang address memenuhi dua kondisi yang tersebar di objek-objek nested-nya: address.country bernilai "China" dan address.city bernilai "Seattle".

import (
    "fmt"
    "github.com/aliyun/aliyun-tablestore-go-sdk/tablestore"
    "github.com/aliyun/aliyun-tablestore-go-sdk/tablestore/search"
)

func boolQuery(client *tablestore.TableStoreClient) {
    searchRequest := &tablestore.SearchRequest{}
    searchRequest.SetTableName("<TABLE_NAME>")
    searchRequest.SetIndexName("<SEARCH_INDEX_NAME>")

    // Kondisi 1: address.country = "China"
    termQuery1 := &search.TermQuery{
        FieldName: "address.country",
        Term:      "China",
    }

    // Kondisi 2: address.city = "Seattle"
    termQuery2 := &search.TermQuery{
        FieldName: "address.city",
        Term:      "Seattle",
    }

    // Gunakan kondisi Must dari BoolQuery untuk mengkueri sub-baris yang memenuhi kedua kondisi.
    // Menggabungkan kedua kondisi. Keduanya harus terpenuhi.
    boolQuery := &search.BoolQuery{
        MustQueries: []search.Query{
            termQuery1,
            termQuery2,
        },
    }

    // Membangun dan mengeksekusi pencarian.
    searchQuery := search.NewSearchQuery()
    searchQuery.SetQuery(boolQuery)
    searchRequest.SetSearchQuery(searchQuery)

    // Eksekusi pencarian.
    resp, err := client.Search(searchRequest)
    if err != nil {
        fmt.Printf("Search failed: %v\n", err)
        return
    }

    fmt.Printf("Found %d rows\n", len(resp.Rows))
    for _, row := range resp.Rows {
        fmt.Printf("Row: %+v\n", row.PrimaryKey)
    }
}