全部產品
Search
文件中心

:摘要與高亮

更新時間:Oct 11, 2024

在查詢資料時通過設定高亮參數,返回命中查詢詞的片段資訊並對查詢詞進行高亮顯示。僅Text類型欄位支援查詢摘要與高亮功能。

前提條件

注意事項

  • 在MatchQuery和MatchPhraseQuery中使用查詢摘要與高亮功能時,查詢詞可能會被多個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類型。

/**
 * 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();
    }
}

相關文檔

  • 關於查詢摘要與高亮功能的更多資訊,請參見摘要與高亮

  • 如果要在查詢巢狀型別欄位時使用查詢摘要與高亮功能,請參考巢狀型別查詢文檔。