JSON查询

JSON包括Object类型和Nested类型,查询 JSON Object类型时直接使用所需查询类型进行操作即可,查询JSON Nested类型时必须使用NestedQuery包装查询条件。

前提条件

使用限制

向量类型字段无法在JSON中使用。

查询场景

假设数据表中有id(String类型)和address(String类型)列,其中address列用于存储JSON格式的数据。

假设某行address列值为[{ "country": "China", "city": "hangzhou" }, { "country": "usa", "city": "Seattle" }]。当查询条件为country="China"city="Seattle"时,如果address列设置为Nested类型,则无法查到该行数据;如果address列设置为Object类型,则可以查询到该行数据。

示例代码

JSON Nested类型查询示例

以下示例用于查询address的同一子行能满足address.country为"China"且address.city为"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>")

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

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

    // 组合两个条件:必须同时满足
    boolQuery := &search.BoolQuery{
        MustQueries: []search.Query{
            termQuery1,
            termQuery2,
        },
    }

    // 嵌套查询
    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"两个条件的行数据。

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

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

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

    // 通过 BoolQuery 的 Must 条件,查询同时满足上述条件的子行
    // 组合两个条件:必须同时满足
    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)
    }
}