在查詢資料時通過設定高亮參數,返回命中查詢詞的片段資訊並對查詢詞進行高亮顯示。僅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("")
}
}