JSON包括Object類型和Nested類型,查詢 JSON Object類型時直接使用所需查詢類型進行操作即可,查詢JSON Nested類型時必須使用NestedQuery封裝查詢條件。
前提條件
已在資料表上建立多元索引並配置JSON欄位的類型。
使用限制
向量類型欄位無法在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)
}
}