摘要與高亮
在查詢數(shù)據(jù)時通過設(shè)置高亮參數(shù),返回命中查詢詞的片段信息并對查詢詞進(jìn)行高亮顯示。僅Text類型字段支持查詢摘要與高亮功能。
前提條件
已初始化OTSClient。具體操作,請參見初始化OTSClient。
已創(chuàng)建數(shù)據(jù)表并寫入數(shù)據(jù)。具體操作,請參見創(chuàng)建數(shù)據(jù)表和寫入數(shù)據(jù)。
已在數(shù)據(jù)表上創(chuàng)建多元索引。具體操作,請參見創(chuàng)建多元索引。
注意事項
在MatchQuery和MatchPhraseQuery中使用查詢高亮功能時,關(guān)鍵詞可能會被多個preTag、postTag高亮顯示。
如果Text字段的分詞類型為最大語義分詞,則使用MatchPhraseQuery功能進(jìn)行數(shù)據(jù)查詢時不支持使用查詢高亮功能。
分片切分可能會將文本中的查詢關(guān)鍵詞分割,此時該關(guān)鍵詞可能不會被高亮。
參數(shù)
參數(shù) | 說明 | |
highlightEncoder | 對高亮分片原文內(nèi)容的編碼方式。取值范圍如下:
| |
fieldHighlightParams | 字段高亮參數(shù),僅支持設(shè)置SearchQuery中包含關(guān)鍵詞查詢的字段。 | |
HighlightParameter | numberOfFragments | 返回高亮分片的最大數(shù)量,推薦設(shè)置為1。 |
fragmentSize | 每個分片的長度。默認(rèn)值100。 重要 實際返回分片的長度不會與該值嚴(yán)格相等。 | |
preTag | 查詢詞高亮的前置Tag,例如 | |
postTag | 查詢詞高亮的后置Tag,例如 | |
highlightFragmentOrder | 當(dāng)高亮字段返回多個分片時,分片的排序規(guī)則。
|
示例
以下示例用于使用MatchQuery功能查詢表中Col_Text列的值能夠匹配hangzhou shanghai
的數(shù)據(jù),并在返回結(jié)果中對查詢詞進(jìn)行高亮顯示。其中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);
// 打印查詢和高亮結(jié)果。查詢非嵌套類型字段時設(shè)置prefix為空即可。
printSearchHit(resp.getSearchHits(), "");
}
/**
* 打印searchHit內(nèi)容。
* @param searchHits searchHits
* @param prefix Nested結(jié)構(gòu)輸出時,增加前綴以打印層次信息。
*/
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());
}
// 打印各字段高亮分片結(jié)果。
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();
}
}