すべてのプロダクト
Search
ドキュメントセンター

Tablestore:JSON クエリ

最終更新日:Dec 07, 2025

JSON データには Object 型と Nested 型が含まれます。Object 型のデータをクエリするには、必要なクエリタイプを直接使用できます。Nested 型のデータをクエリするには、クエリ条件を NestedQuery でラップする必要があります。

前提条件

制限事項

ベクトル型のフィールドは JSON では使用できません。

クエリシナリオ

データテーブルに String 型の `id` カラムと String 型の `address` カラムが含まれていると仮定します。`address` カラムには、JSON フォーマットのデータが格納されます。

ある行の `address` カラムの値が [{ "country": "China", "city": "hangzhou" }, { "country": "usa", "city": "Seattle" }] であると仮定します。`address` カラムが Nested 型の場合、country="China"city="Seattle" のクエリではこの行は返されません。`address` カラムが Object 型の場合、クエリはこの行を返します。

サンプルコード

JSON Nested 型のクエリ例

次の例では、`address` フィールドの同じネストされたオブジェクト内で、address.country が "China"、address.city が "Seattle" という 2 つの条件を満たす行をクエリします。

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>")

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

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

    // 2つの条件を組み合わせます。両方を満たす必要があります。
    boolQuery := &search.BoolQuery{
        MustQueries: []search.Query{
            termQuery1,
            termQuery2,
        },
    }

    // Nested クエリ
    nestedQuery := &search.NestedQuery{
        Path:      "address",
        Query:     boolQuery,
        ScoreMode: search.ScoreMode_None,
    }

    // 検索を構築して実行します。
    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)
    }
}

JSON Object 型のクエリ例

次の例では、`address` フィールドのネストされたオブジェクトにわたって、address.country が "China" であり、かつ address.city が "Seattle" であるという 2 つの条件を満たす行をクエリします。

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>")

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

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

    // BoolQuery の Must 条件を使用して、両方の条件を満たすサブ行をクエリします。
    // 2つの条件を組み合わせます。両方を満たす必要があります。
    boolQuery := &search.BoolQuery{
        MustQueries: []search.Query{
            termQuery1,
            termQuery2,
        },
    }

    // 検索を構築して実行します。
    searchQuery := search.NewSearchQuery()
    searchQuery.SetQuery(boolQuery)
    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)
    }
}