摘要与高亮

在查询数据时通过设置高亮参数,返回命中查询词的片段信息并对查询词进行高亮显示。仅Text类型字段支持查询摘要与高亮功能。

前提条件

注意事项

  • MatchQueryMatchPhraseQuery中使用查询高亮功能时,关键词可能会被多个preTag、postTag高亮显示。

  • 如果Text字段的分词类型为最大语义分词,则使用MatchPhraseQuery功能进行数据查询时不支持使用查询高亮功能。

  • 分片切分可能会将文本中的查询关键词分割,此时该关键词可能不会被高亮。

参数

参数

说明

HighlightEncoder

对高亮分片原文内容的编码方式。取值范围如下:

  • PLAIN(默认):原文展示,不进行编码。

  • HTML:对高亮分片原文进行HTML转义,转义包括<转义为&lt;>转义为&gt;"转义为&quot;'转义为&#x27;/转义为&#x2F;,网页展示时推荐使用HTML格式。

FieldHighlightParams

字段高亮参数,仅支持设置SearchQuery中包含关键词查询的字段。

HighlightParameter

NumberOfFragments

返回高亮分片的最大数量,推荐设置为1。

FragmentSize

每个分片的长度。默认值100。

重要

实际返回分片的长度不会与该值严格相等。

PreTag

查询词高亮的前置Tag,例如<em><b>。默认值为<em>,您可以按需自定义前置Tag。preTag支持的字符集包括< > " ' /a-zA-Z0-9

PostTag

查询词高亮的后置Tag,例如</em></b>。默认值为</em>,您可以按需自定义前置Tag。postTag支持的字符集包括< > " ' /a-zA-Z0-9

HighlightFragmentOrder

当高亮字段返回多个分片时,分片的排序规则。

  • TEXT_SEQUENCE(默认):片段在文本中出现的顺序。

  • SCORE:根据命中查询词评分排序多个分片。

示例

以下示例用于使用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("")
    }
}

相关文档

  • 关于查询摘要与高亮功能的更多信息,请参见查询高亮

  • 如果要在查询嵌套类型字段时使用查询摘要与高亮功能,请参考嵌套类型查询文档。