Elasticsearch 映射 fielddata 工作原理解析
1.fielddata 是什么
fielddata 是 Elasticsearch 中一種數(shù)據(jù)結(jié)構(gòu),用于在內(nèi)存中緩存字段數(shù)據(jù),主要服務(wù)于以下場(chǎng)景:
- 聚合操作(Aggregations)
- 排序(Sorting)
- 腳本計(jì)算(Scripting)
- 某些類型的查詢(如
field字段上的term查詢)
當(dāng)需要對(duì) text 字段或其他非 doc_values 支持的字段執(zhí)行上述操作時(shí),Elasticsearch 需要將這些字段的值加載到內(nèi)存中,這就是 fielddata 的作用。
2.fielddata 的工作原理
- 按需加載:當(dāng)?shù)谝淮涡枰獙?duì)某個(gè)字段執(zhí)行聚合 / 排序等操作時(shí),Elasticsearch 會(huì)從磁盤讀取該字段的所有值并構(gòu)建內(nèi)存中的數(shù)據(jù)結(jié)構(gòu)。
- 存儲(chǔ)在 JVM 堆內(nèi)存:
fielddata會(huì)占用 JVM 堆內(nèi)存空間。 - 字段級(jí)啟用:默認(rèn)情況下,
text字段禁用fielddata,keyword字段使用doc_values而非fielddata。
3.主要用法
3.1 啟用 fielddata(通常在 text 字段上)
PUT my_index/_mapping
{
"properties": {
"my_text_field": {
"type": "text",
"fielddata": true
}
}
}3.2 監(jiān)控 fielddata 使用情況
GET _nodes/stats/indices/fielddata?fields=*
3.3 清除 fielddata 緩存
POST my_index/_cache/clear?fielddata=true
4.使用場(chǎng)景示例
示例 1:對(duì) text 字段進(jìn)行聚合
GET my_index/_search
{
"size": 0,
"aggs": {
"my_terms": {
"terms": {
"field": "my_text_field" // 需要該字段啟用 fielddata
}
}
}
}示例 2:對(duì) text 字段進(jìn)行排序
GET my_index/_search
{
"sort": [
{
"my_text_field": {
"order": "asc"
}
}
]
}5.fielddata 與 doc_values 的區(qū)別
| 特性 | fielddata | doc_values |
|---|---|---|
| 構(gòu)建時(shí)機(jī) | 查詢時(shí)按需構(gòu)建 | 索引時(shí)預(yù)先構(gòu)建 |
| 存儲(chǔ)位置 | JVM 堆內(nèi)存 | 磁盤(操作系統(tǒng)緩存) |
| 內(nèi)存占用 | 高 | 低 |
| 適用字段類型 | 主要為 text 字段 | 主要為 keyword / numeric / date 等字段 |
| 默認(rèn)啟用 | text 字段默認(rèn)禁用 | 支持的字段默認(rèn)啟用 |
6.注意事項(xiàng)
- 內(nèi)存消耗:
fielddata會(huì)顯著增加內(nèi)存使用,特別是高基數(shù)(大量唯一值)字段。 - 性能影響:首次加載
fielddata可能導(dǎo)致查詢延遲。 - 替代方案:對(duì)于
keyword/numeric/date等字段,優(yōu)先使用doc_values。 - 熔斷機(jī)制:Elasticsearch 有
fielddata熔斷器防止內(nèi)存耗盡。
7.最佳實(shí)踐
- 盡量避免在
text字段上啟用fielddata。 - 如需對(duì)文本進(jìn)行聚合/排序,考慮使用多字段(
multi-field)映射:
"my_field": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword"
}
}
}然后對(duì) my_field.keyword 進(jìn)行操作。
監(jiān)控 fielddata 內(nèi)存使用,設(shè)置合理的熔斷閾值。
到此這篇關(guān)于Elasticsearch 映射 fielddata 工作原理解析的文章就介紹到這了,更多相關(guān)Elasticsearch 映射 fielddata 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解如何使用Spring的@FeignClient注解實(shí)現(xiàn)通信功能
SpringBoot是一個(gè)非常流行的Java框架,它提供了一系列工具來使這種交互無縫且高效,在這些工具中,@FeignClient注解因其易用性和強(qiáng)大的功能而脫穎而出, 在這篇文章中,我們將探討如何使用Spring的@FeignClient注解進(jìn)行客戶端-服務(wù)器通信,需要的朋友可以參考下2023-11-11
Java調(diào)取創(chuàng)藍(lán)253短信驗(yàn)證碼的實(shí)現(xiàn)代碼
這篇文章主要介紹了Java調(diào)取創(chuàng)藍(lán)253短信驗(yàn)證碼的實(shí)現(xiàn)代碼,需要的朋友可以參考下2018-04-04
關(guān)于Mybatis插入對(duì)象時(shí)空值的處理
這篇文章主要介紹了關(guān)于Mybatis插入對(duì)象時(shí)空值的處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06
Java實(shí)現(xiàn)的生成二維碼和解析二維碼URL操作示例
這篇文章主要介紹了Java實(shí)現(xiàn)的生成二維碼和解析二維碼URL操作,結(jié)合實(shí)例形式分析了Java創(chuàng)建與解析二維碼,以及文件讀寫等相關(guān)操作技巧,需要的朋友可以參考下2018-07-07
Java版超大整數(shù)階乘算法代碼詳解-10,0000級(jí)
這篇文章主要介紹了Java版超大整數(shù)階乘算法代碼詳解-10,0000級(jí),具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01
Spring Boot 整合 Apache Flink 的詳細(xì)過程
Apache Flink 是一個(gè)高性能的分布式流處理框架,而Spring Boot提供了快速構(gòu)建企業(yè)級(jí)應(yīng)用的能力,下面給大家介紹Spring Boot 整合 Apache Flink 教程,感興趣的朋友一起看看吧2025-06-06

