在查询数据时通过设置高亮参数,返回命中查询词的片段信息并对查询词进行高亮显示。仅Text类型字段支持查询摘要与高亮功能。
前提条件
已初始化Client。具体操作,请参见初始化OTSClient。
已在数据表上创建多元索引。具体操作,请参见创建多元索引。
注意事项
在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类型。
func MatchQuerywithHighlight(client *tablestore.TableStoreClient, tableName string, indexName string) {
searchRequest := &tablestore.SearchRequest{}
searchRequest.SetTableName(tableName)
searchRequest.SetIndexName(indexName)
query := &search.MatchQuery{} //设置查询类型为MatchQuery。
query.FieldName = "Col_Text" //设置要匹配的列。
query.Text = "hangzhou shanghai" //设置要匹配的值。
searchQuery := search.NewSearchQuery()
searchQuery.SetQuery(query)
highlight := &search.Highlight{
FieldHighlightParameters: map[string]*search.HighlightParameter{
"Col_Text": {
NumberOfFragments: proto.Int32(5),
PreTag: proto.String("<b>"),
PostTag: proto.String("</b>"),
},
},
}
searchQuery.SetHighlight(highlight)
searchQuery.SetGetTotalCount(true)
searchQuery.SetOffset(0) //设置offset为0。
searchQuery.SetLimit(20) //设置limit为20,表示最多返回20条数据。
searchRequest.SetSearchQuery(searchQuery)
// 设置返回多元索引中的所有列。
searchRequest.SetColumnsToGet(&tablestore.ColumnsToGet{
ReturnAllFromIndex: true,
})
if resp, err := client.Search(searchRequest); err != nil {
fmt.Println("Highlighting query failed with err: ", err)
} else {
fmt.Println("RequestId: " + resp.RequestId)
// 打印查询和高亮结果。查询非嵌套类型字段时设置padding为空即可。
printSearchHit(resp.SearchHits, " ")
}
fmt.Println("highlight query finished")
}
/**
* 打印searchHit内容。
* @param searchHits searchHits
* @param padding Nested结构输出时,增加前缀以打印层次信息。
*/
func printSearchHit(searchHits []*tablestore.SearchHit, padding string) {
for _, searchHit := range searchHits {
if searchHit.Score != nil {
fmt.Printf("%sScore: %f\n", padding, *searchHit.Score)
}
if searchHit.Row != nil {
jsonBody, err := json.Marshal(*searchHit.Row)
if err != nil {
panic(err)
}
fmt.Println("Row: ", string(jsonBody))
}
if searchHit.HighlightResultItem != nil && len(searchHit.HighlightResultItem.HighlightFields) != 0 {
fmt.Printf("%sHighlight: \n", padding)
for colName, highlightResult := range searchHit.HighlightResultItem.HighlightFields {
fmt.Printf("%sColumnName: %s, Highlight_Fragments: %v\n", padding+padding, colName, highlightResult.Fragments)
}
}
fmt.Println("")
}
}