OpenSearch 節點中的 JVM Heap 壓力問題

Wei Lee 60 信譽點數
2026-10-09T04:27:29.0666667+00:00

你好,

我們的 OpenSearch 節點因為未映射的文本欄位聚合 (unmapped text field aggregations) 而面臨 JVM Heap 壓力。目前系統的文本欄位上啟用了 fielddata。請問我們該如何停用文本欄位上的 fielddata,並改用關鍵字 (keyword) 映射?

Windows for business | Windows 365 商務版
0 則留言 沒有留言

1 個回答

排序依據: 最實用
  1. VPHAN 47,355 信譽點數 獨立顧問
    2026-10-09T07:15:48.3733333+00:00

    Wei Lee

    在啟用 fielddata 的 text 欄位上進行聚合(Aggregating)會導致嚴重的 heap(堆積)壓力,因為搜尋引擎被迫將每個分詞後的字串直接載入至作用中的記憶體內。為了穩定您的節點,您必須將聚合操作轉為使用基於磁碟的 doc values,這需要轉換至 keyword 資料類型。

    您可以透過直接向索引(index)的 _mapping API 端點提交 PUT 請求來完成此操作,且無需中斷服務。在 JSON 酬載的 properties 物件中,定義您的目標 text 欄位,並明確將 fielddata 屬性設定為 false。緊接著在下方,新增一個 fields 物件以建立多重欄位(multi-field),將子欄位命名為 keyword,並將其 type 屬性也設定為 keyword。此設定能立即保護您的 JVM 堆積免於未來載入 fielddata 的影響,同時為未來的聚合操作建立正確的資料結構。

    由於映射(mapping)的變更不會追溯套用至已寫入磁碟的資料,您必須強制 OpenSearch 針對新的映射重新評估您的歷史文件。您可以透過向索引的 _update_by_query API 端點發送 POST 請求來達成此目的。當此背景作業完成後,您現有的資料集便會填入新的 keyword 子欄位。接著,您可以安全地更新查詢,改為針對新的子欄位路徑進行聚合,從而徹底消除 JVM 堆積的壓力。

    希望這個解答對您提供了一些有用的資訊。如果對您有幫助,請點擊「接受答案」(accept answer)。如果您有任何問題,歡迎隨時留言。

    VPHAN

    此回答有幫助嗎?

    0 則留言 沒有留言

您的回答

答案可由問題作者標示為「已接受」,而由仲裁者標示為「推薦」,這可協助使用者知道答案解決了作者的問題。