在查询数据时通过设置高亮参数,返回命中查询词的片段信息并对查询词进行高亮显示。仅Text类型字段支持查询摘要与高亮功能。
前提条件
已初始化OTSClient。具体操作,请参见初始化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类型。
/**
* MatchQuery查询摘要与高亮。
*/
public static void matchQueryWithHighlighting(SyncClient client) {
SearchRequest searchRequest = SearchRequest.newBuilder()
.tableName("<TABLE_NAME>")
.indexName("<SEARCH_INDEX_NAME>")
.returnAllColumnsFromIndex(true)
.searchQuery(SearchQuery.newBuilder()
.limit(5)
.query(QueryBuilders.bool()
.should(QueryBuilders.match("Col_Text", "hangzhou shanghai")))
.highlight(Highlight.newBuilder()
.addFieldHighlightParam("Col_Text", HighlightParameter.newBuilder()
.highlightFragmentOrder(HighlightFragmentOrder.TEXT_SEQUENCE)
.preTag("<b>")
.postTag("</b>")
.build())
.build())
.build())
.build();
SearchResponse resp = client.search(searchRequest);
// 打印查询和高亮结果。查询非嵌套类型字段时设置prefix为空即可。
printSearchHit(resp.getSearchHits(), "");
}
/**
* 打印searchHit内容。
* @param searchHits searchHits
* @param prefix Nested结构输出时,增加前缀以打印层次信息。
*/
private static void printSearchHit(List<SearchHit> searchHits, String prefix) {
for (SearchHit searchHit : searchHits) {
if (searchHit.getScore() != null) {
System.out.printf("%s Score: %s\n", prefix, searchHit.getScore());
}
if (searchHit.getOffset() != null) {
System.out.printf("%s Offset: %s\n", prefix, searchHit.getOffset());
}
if (searchHit.getRow() != null) {
System.out.printf("%s Row: %s\n", prefix, searchHit.getRow().toString());
}
// 打印各字段高亮分片结果。
if (searchHit.getHighlightResultItem() != null) {
System.out.printf("%s Highlight: \n", prefix);
StringBuilder strBuilder = new StringBuilder();
for (Map.Entry<String, HighlightField> entry : searchHit.getHighlightResultItem().getHighlightFields().entrySet()) {
strBuilder.append(entry.getKey()).append(":").append("[");
strBuilder.append(StringUtils.join(",", entry.getValue().getFragments())).append("]\n");
}
System.out.printf("%s %s", prefix, strBuilder);
}
System.out.println();
}
}