使用 Tablestore Java SDK 的摘要與高亮功能可返回包含命中詞條的 Text 欄位片段,並使用指定標籤標記命中詞條。
前提條件
安裝Tablestore Java SDK並初始化用戶端。
功能說明
摘要與高亮用於從查詢結果中提取命中詞條附近的文本片段,並使用前置標籤和後置標籤標記命中詞條,便於展示命中上下文。該功能僅支援 Text 類型欄位。
使用摘要與高亮前,需要在建立多元索引時將目標欄位的 enableHighlighting 設定為 true。查詢時,通過 SearchQuery.highlight 指定要返回摘要與高亮結果的欄位及分區配置。目標欄位必須參與支援摘要與高亮的查詢條件,否則不會返回該欄位的高亮分區。
支援摘要與高亮的查詢類型包括 TermQuery、TermsQuery、MatchQuery、MatchPhraseQuery、PrefixQuery、WildcardQuery、RangeQuery、BoolQuery、ConstScoreQuery 和 NestedQuery。
使用 BoolQuery 或 ConstScoreQuery 時,可為上述七種查詢類型的子查詢所使用的欄位配置摘要與高亮。使用 NestedQuery 查詢巢狀型別欄位時,需要通過 InnerHits.highlight 配置匹配子行的摘要與高亮,具體操作請參見巢狀型別查詢。
-
使用
MatchQuery或MatchPhraseQuery時,同一個命中詞條可能被多組前置標籤和後置標籤標記。 -
Text欄位使用最大數量語義分詞時,MatchPhraseQuery不支援摘要與高亮。 -
分區邊界可能切分命中詞條,導致該詞條未被高亮。
以下樣本使用匹配查詢檢索 description 欄位中包含 tablestore 詞條的資料,並使用 <b> 和 </b> 標記返回分區中的命中詞條。description 欄位為已啟用摘要與高亮的 Text 欄位。
String tableName = "example_table";
String indexName = "example_index";
MatchQuery matchQuery = new MatchQuery();
matchQuery.setFieldName("description");
matchQuery.setText("tablestore");
HighlightParameter highlightParameter = new HighlightParameter();
highlightParameter.setPreTag("<b>");
highlightParameter.setPostTag("</b>");
Highlight highlight = new Highlight();
highlight.addFieldHighlightParam("description", highlightParameter);
SearchQuery searchQuery = new SearchQuery();
searchQuery.setQuery(matchQuery);
searchQuery.setHighlight(highlight);
searchQuery.setLimit(10);
SearchRequest request = new SearchRequest(tableName, indexName, searchQuery);
SearchResponse response = client.search(request);
for (SearchHit hit : response.getSearchHits()) {
HighlightResultItem resultItem = hit.getHighlightResultItem();
if (resultItem == null) {
continue;
}
HighlightField field = resultItem.getHighlightFieldByName("description");
if (field != null) {
System.out.println(field.getFragments());
}
}
參數說明
request.searchQuery.highlight 的類型為 Highlight。其中,fieldHighlightParams 的值為 HighlightParameter,用於配置每個欄位的分區行為。
下表使用完整參數路徑說明 Highlight 和 HighlightParameter 兩層配置。
|
名稱 |
類型 |
說明 |
|
fieldHighlightParams(必選) |
|
欄位名稱及其分區配置。鍵為要返回摘要與高亮結果的欄位名稱,值為該欄位的 |
|
highlightEncoder(可選) |
HighlightEncoder |
高亮分區中原文的編碼方式。取值如下:
|
|
fieldHighlightParams[].numberOfFragments(可選) |
Integer |
單個欄位返回的最大高亮分區數。建議設定為 |
|
fieldHighlightParams[].fragmentSize(可選) |
Integer |
每個分區的目標長度。預設值為 |
|
fieldHighlightParams[].preTag(可選) |
String |
命中詞條的前置標籤。預設值為 |
|
fieldHighlightParams[].postTag(可選) |
String |
命中詞條的後置標籤。預設值為 |
|
fieldHighlightParams[].highlightFragmentOrder(可選) |
HighlightFragmentOrder |
返回多個高亮分區時的排序方式。 |
傳回值
查詢響應
search 方法返回 SearchResponse。與摘要與高亮相關的核心欄位如下。
|
名稱 |
類型 |
說明 |
|
searchHits |
|
查詢命中結果,通過 |
|
isAllSuccess |
boolean |
是否已成功查詢全部索引分割區,通過 |
查詢命中
response.searchHits[] 的類型為 SearchHit。與摘要與高亮相關的欄位如下。
|
名稱 |
類型 |
說明 |
|
row |
Row |
命中的行資料,通過 |
|
highlightResultItem |
HighlightResultItem |
當前行所有欄位的摘要與高亮結果,通過 |
高亮結果
response.searchHits[].highlightResultItem 的類型為 HighlightResultItem,包含以下欄位。
|
名稱 |
類型 |
說明 |
|
highlightFields |
|
當前行各欄位的高亮結果,通過 |
欄位分區
response.searchHits[].highlightResultItem.highlightFields[fieldName] 的類型為 HighlightField,包含以下欄位。
|
名稱 |
類型 |
說明 |
|
fragments |
|
指定欄位的高亮分區列表,通過 |