NestedQuery用于查詢嵌套類型字段中子行的數據。嵌套類型不能直接查詢,需要通過NestedQuery包裝,NestedQuery中需要指定嵌套類型字段的路徑和一個子查詢,其中子查詢可以是任意Query類型。
前提條件
已初始化Client。具體操作,請參見初始化OTSClient。
已在數據表上創建多元索引。具體操作,請參見創建多元索引。
參數
參數 | 說明 |
tableName | 數據表名稱。 |
indexName | 多元索引名稱。 |
path | 路徑名,嵌套類型的列的樹狀路徑。例如news.title表示嵌套類型的news列中的title子列。 |
query | 嵌套類型的列中子列上的查詢,子列上的查詢可以是任意Query類型。 |
scoreMode | 當列存在多個值時基于哪個值計算分數。 |
InnerHits | 嵌套類型字段的子列的配置參數。包括如下配置項:
|
示例
單層級嵌套類型查詢示例
以下示例用于查詢Col_Nested.Sub_Col_Keyword為"開心"的數據。其中Col_Nested為嵌套類型字段,子行中包含Sub_Col_Keyword列。
/**
* 嵌套數據示例Col_Nested: '[{Sub_Col_Keyword: "開心"},{Sub_Col_Keyword: "晴天"}]'
*/
client.search({
tableName: "<TABLE_NAME>",
indexName: "<SEARCH_INDEX_NAME>",
searchQuery: {
offset: 0,
limit: 10, //如果只為了獲取行數,無需獲取具體數據,可以設置limit=0,即不返回任意一行數據。
query: { //設置查詢類型為TableStore.QueryType.NESTED_QUERY。
queryType: TableStore.QueryType.NESTED_QUERY,
query: {
path: "Col_Nested",
query: {
queryType: TableStore.QueryType.TERM_QUERY,
query: {
fieldName: "Col_Nested.Sub_Col_Keyword",
term: "開心"
}
},
}
},
getTotalCount: true //結果中的TotalCount可以表示表中數據的總行數,默認為false,表示不返回。
},
columnToGet: { //返回列設置,可設置為RETURN_SPECIFIED(自定義返回列)、RETURN_ALL(返回所有列)、RETURN_ALL_FROM_INDEX(返回多元索引中的所有列)、RETURN_NONE(不返回)。
returnType: TableStore.ColumnReturnType.RETURN_ALL
}
}, function (err, data) {
if (err) {
console.log('error:', err);
return;
}
console.log('success:', JSON.stringify(data, null, 2));
});
嵌套類型查詢使用查詢摘要與高亮示例
以下示例用于使用NestedQuery功能查詢表中Col_Nested嵌套類型字段中Sub_Col_Text子列的值能夠匹配tablestore
的數據,并在返回結果中對查詢詞進行高亮顯示。
client.search({
tableName: "<TABLE_NAME>",
indexName: "<SEARCH_INDEX_NAME>",
searchQuery: {
offset: 0,
limit: 10, //如果只為了獲取行數,無需獲取具體數據,可以設置limit=0,即不返回任意一行數據。
query: { //設置查詢類型為TableStore.QueryType.NESTED_QUERY。
queryType: TableStore.QueryType.NESTED_QUERY,
query: {
path: "Col_Nested",
query: {
queryType: TableStore.QueryType.MATCH_QUERY,
query: {
fieldName: "Col_Nested.Sub_Col_Text",
text: "tablestore"
}
},
innerHits: {
sort: {
sorters: [
{
scoreSort: {
order: TableStore.SortOrder.SORT_ORDER_DESC
}
},
{
docSort: {
order: TableStore.SortOrder.SORT_ORDER_ASC
}
},
],
},
highlight: {
highlightParameters: [
{
fieldName:"Col_Nested.Sub_Col_Text",
preTag: "<b>",
postTag: "</b>",
fragmentsOrder: TableStore.HighlightFragmentOrder.TEXT_SEQUENCE,
fragmentSize: 20,
numberOfFragments: 3,
}
]
}
},
}
},
getTotalCount: true //結果中的TotalCount可以表示表中數據的總行數,默認為false,表示不返回。
},
columnToGet: { //返回列設置,可設置為RETURN_SPECIFIED(自定義返回列)、RETURN_ALL(返回所有列)、RETURN_ALL_FROM_INDEX(返回多元索引中的所有列)、RETURN_NONE(不返回)。
returnType: TableStore.ColumnReturnType.RETURN_ALL
}
}, function (err, data) {
if (err) {
console.log('error:', err);
return;
}
console.log('success:', JSON.stringify(data.rows, null, 2));
printSearchHit(data.searchHits, "");
});
/**
* 打印searchHit內容。
* @param searchHits searchHits
* @param prefix Nested結構輸出時,增加前綴以打印層次信息。
*/
function printSearchHit(searchHits, prefix) {
TableStore.util.arrayEach(searchHits, function (searchHit) {
if (searchHit.highlightResultItem != null) {
console.log(prefix + "Highlight: \n");
var strBuilder = ""
for (const [key,val] of searchHit.highlightResultItem.highlightFields.entries()) {
strBuilder += key + ":[";
strBuilder += val.fragments.join(",") + "]\n";
console.log(strBuilder);
}
}
for (const [key,val] of searchHit.searchInnerHits.entries()) {
console.log(prefix + "Path: " + key + "\n");
console.log(prefix + "InnerHit: \n");
printSearchHit(val.subSearchHits, prefix + " ");
}
});
}
常見問題
相關文檔
多元索引查詢類型包括精確查詢、多詞精確查詢、全匹配查詢、匹配查詢、短語匹配查詢、前綴查詢、范圍查詢、通配符查詢、多條件組合查詢、地理位置查詢、嵌套類型查詢、向量檢索和列存在性查詢,您可以選擇合適的查詢類型進行多維度數據查詢。
如果要對結果集進行排序或者翻頁,您可以使用排序和翻頁功能來實現。具體操作,請參見排序和翻頁。
如果要按照某一列對結果集做折疊,使對應類型的數據在結果展示中只出現一次,您可以使用折疊(去重)功能來實現。具體操作,請參見折疊(去重)。
如果要進行數據分析,例如求最值、求和、統計行數等,您可以使用Search接口的統計聚合功能或者SQL查詢來實現。具體操作,請參見統計聚合和SQL查詢。
如果要快速導出數據,而不關心整個結果集的順序時,您可以使用ParallelScan接口和ComputeSplits接口實現多并發導出數據。具體操作,請參見并發導出數據。