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