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'两个条件的行数据。

from tablestore import *

def nested_query(client):
    # 查询条件一:要求address子行的country列值为"China"
    term_query1 = TermQuery('address.country','China')

    # 查询条件二:要求address子行的city列值为'Seattle'
    term_query2 = TermQuery('address.city', 'Seattle')

    # 通过BoolQuery的And条件,查询同时满足上述条件的子行
    bool_query = BoolQuery(
        must_queries=[term_query1, term_query2]
    )

    # NestedQuery内部设置BoolQuery,要求某一子行同时满足多个查询条件
    nested_query = NestedQuery(
        path="address",  # 设置嵌套类型列的路径,即要查询字段的父路径
        query=bool_query,  # 设置内部查询条件
        score_mode=ScoreMode.NONE  # 设置评分模式为None
    )

    # 构建搜索查询
    search_query = SearchQuery(
        query=nested_query
    )

    # 执行搜索
    resp = client.search(table_name='<TABLE_NAME>',index_name='<SEARCH_INDEX_NAME>',
                         search_query=search_query)
    print("Row:", resp.rows)
    

JSON Object类型查询示例

以下示例用于查询address列的多个子行满足address.country为'China'且address.city为'Seattle'两个条件的行数据。

from tablestore import *

def bool_query(client):
    # 查询条件一:要求address子行的country列值为"China"
    term_query1 = TermQuery('address.country','China')

    # 查询条件二:要求address子行的city列值为'Seattle'
    term_query2 = TermQuery('address.city','Seattle')

    # 通过BoolQuery的And条件,查询同时满足上述条件的子行
    bool_query = BoolQuery(
        must_queries=[term_query1, term_query2]
    )

    # 构建搜索查询
    search_query = SearchQuery(
        query=bool_query
    )


    # 执行搜索
    resp = client.search(table_name='<TABLE_NAME>',index_name='<SEARCH_INDEX_NAME>',
                         search_query=search_query)
    print("Row:", resp.rows)