在啟用 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