在查詢數據時通過設置高亮參數,返回命中查詢關鍵詞的片段信息并對關鍵詞進行高亮顯示。僅Text類型字段支持查詢高亮功能。
前提條件
已初始化Client。具體操作,請參見初始化OTSClient。
已在數據表上創建多元索引。具體操作,請參見創建多元索引。
注意事項
表格存儲Node.js SDK從5.5.0版本開始支持查詢高亮功能。使用查詢高亮功能時,請確保獲取了正確的Node.js SDK版本。關于Node.js SDK歷史迭代版本的更多信息,請參見Node.js SDK歷史迭代版本。
在MatchQuery和MatchPhraseQuery中使用查詢高亮功能時,關鍵詞可能會被多個preTag、postTag高亮顯示。
如果Text字段的分詞類型為最大語義分詞,則使用MatchPhraseQuery功能進行數據查詢時不支持使用查詢高亮功能。
分片切分可能會將文本中的查詢關鍵詞分割,此時該關鍵詞可能不會被高亮。
參數
參數 | 說明 | |
highlightEncoder | 對高亮分片原文內容的編碼方式。取值范圍如下:
| |
fieldHighlightParams | 字段高亮參數,僅支持設置SearchQuery中包含關鍵詞查詢的字段。 | |
HighlightParameter | numberOfFragments | 返回高亮分片的最大數量,推薦設置為1。 |
fragmentSize | 每個分片的長度。默認值100。 重要 實際返回分片的長度不會與該值嚴格相等。 | |
preTag | 查詢關鍵詞高亮的前置Tag,例如 | |
postTag | 查詢關鍵詞高亮的后置Tag,例如 | |
highlightFragmentOrder | 當高亮字段返回多個分片時,分片的排序規則。
|
示例
以下示例用于使用MatchQuery功能查詢表中Col_Text列的值能夠匹配hangzhou shanghai
的數據,并在返回結果中對關鍵詞進行高亮顯示。其中Col_Text列為Text類型。
client.search({
tableName: "<TABLE_NAME>",
indexName: "<SEARCH_INDEX_NAME>",
searchQuery: {
offset: 0,
limit: 10, //如果只為了取行數,但不需要具體數據,可以設置limit=0,即不返回任意一行數據。
query: { //設置查詢類型為MatchQuery。
queryType: TableStore.QueryType.MATCH_QUERY,
query: {
fieldName: "Col_Text", //設置要匹配的列。
text: "hangzhou shanghai" //設置要匹配的值。
}
},
highlight:{
highlightEncoder:TableStore.HighlightEncoder.PLAIN_MODE,
highlightParameters:[
{
fieldName:"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 + " ");
}
});
}