在查询数据时通过设置高亮参数,返回命中查询词的片段信息并对查询词进行高亮显示。仅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 + " ");
}
});
}