NestedQuery用于查詢嵌套類型字段中子行的數據。嵌套類型不能直接查詢,需要通過NestedQuery包裝,NestedQuery中需要指定嵌套類型字段的路徑和一個子查詢,其中子查詢可以是任意Query類型。
前提條件
已初始化OTSClient。具體操作,請參見初始化OTSClient。
已在數據表上創建多元索引。具體操作,請參見創建多元索引。
參數
參數 | 說明 |
path | 路徑名,嵌套類型的列的樹狀路徑。例如news.title表示嵌套類型的news列中的title子列。 |
query | 嵌套類型的列中子列上的查詢,子列上的查詢可以是任意Query類型。 |
score_mode | 當列存在多個值時基于哪個值計算分數。 |
table_name | 數據表名稱。 |
index_name | 多元索引名稱。 |
inner_hits | 嵌套類型字段的子列的配置參數。包括如下配置項:
|
示例
單層級嵌套類型查詢示例
以下示例用于查詢表中col_nested.col_long列的值大于等于100且小于等于300的數據。
5.2.1及之后版本
使用5.2.1及之后的SDK版本時,默認的返回結果為SearchResponse對象,請求示例如下:
nested_query = RangeQuery('col_nested.col_long', range_from=100, range_to=300, include_lower=True, include_upper=True) query = NestedQuery('col_nested', nested_query) search_response = client.search( '<TABLE_NAME>', '<SEARCH_INDEX_NAME>', SearchQuery(query, limit=100, get_total_count=True), ColumnsToGet(return_type=ColumnReturnType.ALL) ) print('request_id : %s' % search_response.request_id) print('is_all_succeed : %s' % search_response.is_all_succeed) print('total_count : %s' % search_response.total_count) print('rows : %s' % search_response.rows)
如果需要返回Tuple類型結果,您可以使用如下請求示例實現。
nested_query = RangeQuery('col_nested.col_long', range_from=100, range_to=300, include_lower=True, include_upper=True) query = NestedQuery('col_nested', nested_query) rows, next_token, total_count, is_all_succeed, agg_result, group_by_results = client.search( '<TABLE_NAME>', '<SEARCH_INDEX_NAME>', SearchQuery(query, limit=100, get_total_count=True), ColumnsToGet(return_type=ColumnReturnType.ALL) ).v1_response()
5.2.1之前版本
使用5.2.1之前的SDK版本時,默認的返回結果為Tuple類型,請求示例如下:
nested_query = RangeQuery('col_nested.col_long', range_from=100, range_to=300, include_lower=True, include_upper=True) query = NestedQuery('col_nested', nested_query) rows, next_token, total_count, is_all_succeed = client.search( '<TABLE_NAME>', '<SEARCH_INDEX_NAME>', SearchQuery(query, limit=100, get_total_count=True), ColumnsToGet(return_type=ColumnReturnType.ALL) )
嵌套類型查詢使用查詢摘要與高亮示例
以下示例用于使用NestedQuery功能查詢表中col_nested嵌套類型字段中col_text子列的值能夠匹配tablestore
的數據,并在返回結果中對查詢詞進行高亮顯示。
def _print_rows(request_id, rows, total_count):
print('Request ID:%s' % request_id)
for row in rows:
print(row)
print('Rows return: %d' % len(rows))
print('Total count: %d' % total_count)
def _print_search_hit(hits):
for search_hit in hits:
print('\t score is %.6f' % search_hit.score)
for highlight_field in search_hit.highlight_result.highlight_fields:
print('\t\t highlight:%s:%s' % (highlight_field.field_name, highlight_field.field_fragments))
for inner_result in search_hit.search_inner_hits:
print('\t\t path:%s' % (inner_result.path))
_print_search_hit(inner_result.search_hits)
def highlight_query_for_nested(client):
print('********** Begin HighlightQueryForNested **********')
sort = Sort(
sorters=[FieldSort('col_nested.col_long', sort_order=SortOrder.ASC)]
)
highlight_parameter = HighlightParameter("col_nested.col_text", 1, 18, '<b>', '</b>', HighlightFragmentOrder.TEXT_SEQUENCE)
highlight_clause = Highlight([highlight_parameter], HighlightEncoder.PLAIN_MODE)
inner_hits_parameter = InnerHits(None, 0, 10, highlight_clause)
query = NestedQuery('n', MatchQuery('col_nested.col_text', 'tablestore'), ScoreMode.AVG, inner_hits_parameter)
search_response = client.search('<TABLE_NAME>', '<SEARCH_INDEX_NAME>',
SearchQuery(query, limit=2, get_total_count=True),
ColumnsToGet(return_type=ColumnReturnType.ALL_FROM_INDEX)
)
print('----- Print Rows:')
print('search rows count:%d' % len(search_response.rows))
_print_rows(search_response.request_id,search_response.rows,search_response.total_count)
print('----- Print Highlight Result:')
search_hits = search_response.search_hits
print('search hit count:%d' % len(search_hits))
_print_search_hit(search_hits)
print('********** End HighlightQuery **********')
常見問題
相關文檔
多元索引查詢類型包括精確查詢、多詞精確查詢、全匹配查詢、匹配查詢、短語匹配查詢、前綴查詢、范圍查詢、通配符查詢、多條件組合查詢、地理位置查詢、嵌套類型查詢、向量檢索和列存在性查詢,您可以選擇合適的查詢類型進行多維度數據查詢。
如果要對結果集進行排序或者翻頁,您可以使用排序和翻頁功能來實現。具體操作,請參見排序和翻頁。
如果要按照某一列對結果集做折疊,使對應類型的數據在結果展示中只出現一次,您可以使用折疊(去重)功能來實現。具體操作,請參見折疊(去重)。
如果要進行數據分析,例如求最值、求和、統計行數等,您可以使用Search接口的統計聚合功能或者SQL查詢來實現。具體操作,請參見統計聚合和SQL查詢。
如果要快速導出數據,而不關心整個結果集的順序時,您可以使用ParallelScan接口和ComputeSplits接口實現多并發導出數據。具體操作,請參見并發導出數據。