在最近使用 Elasticsearch 的過程中,我遇到了一個 字段值過長導致索引失敗 的問題。經過排查和多次嘗試,最終通過設置字段 "index": false
方式解決。本文將從問題現象、排查過程、問題分析、解決方案和建議等方面,詳細記錄這次踩坑經驗。
如下圖所示:
1.原因解釋:
你在保存文檔時,fieldOvyryf
字段的值(可能是一個超長字符串,比如大 JSON、大文本塊等)經過 UTF-8 編碼后,字節數達到了 61506;
但是 Elasticsearch 對單個字段的最大字節長度限制是 32766,超過就會報錯。
?
問題現象:
項目中使用 Spring Boot + Elasticsearch(ES 7.x)進行數據索引,當向某個索引插入一條數據時,報出了如下錯誤:
org.elasticsearch.index.mapper.MapperParsingException: failed to parse field [fieldOvyryf] of type [text]
進一步查看日志詳情,發現錯誤信息中提示:?
Document contains at least one immense term in field="fieldOvyryf" (whose UTF8 encoding is longer than the max length 32766)
也就是說,fieldOvyryf
字段的內容超長,已經超過了 ES 默認允許的最大長度(32,766 字節)?
我使用kibana查看索引發現一開始這個字段的類型
2.問題排查過程
在 Elasticsearch 中,字段長度受限于底層 Lucene 索引存儲結構,對于 text
類型的字段,一般最大允許的單個 term 是 32766 字節。這個限制并不針對字符串本身的字符數,而是它在 UTF-8 編碼下的字節長度。
一、確認異常字段
在請求報錯時,明確了是 fieldOvyryf
字段導致的問題。
二、檢查字段映射
我查詢了該字段的索引 mapping 映射配置:
"fieldOvyryf": {
"type": "text"
}
默認情況下,text
類型會被 ES 拿去做全文檢索,因此會經過分詞器處理,并寫入反向索引。這就會對字段長度做出嚴格限制。
三、分析數據來源
fieldOvyryf
實際上是某個業務模塊里的備注或富文本字段,用戶有可能粘貼大量內容甚至整個文檔、表格 HTML 等,這種內容一旦超過 32766 字節就會報錯。
?
3.最終解決方案
由于該字段我們并不需要對它做搜索功能,僅用于存儲展示,因此決定禁用它的索引:
?
由于的我的索引是創建過的不能直接在基礎上可以刪除后重新添加,我是先查詢來原有的字段,然后賦值下來 把舊的刪掉 然后重新創建了一個新的。這是一個笨方法
4.總結與建議
項 | 內容 |
---|---|
錯誤原因 | text 類型字段內容超出 Lucene 限制的 32766 字節 |
導致后果 | 文檔無法索引寫入,拋出 MapperParsingException |
關鍵字段 | "fieldOvyryf" |
解決方法 | 設置 "index": false 禁止該字段建索引 |
適用場景 | 對于備注、大段文本、富文本字段,僅展示、不搜索的情況 |
?