Elasticsearch 映射 fielddata 工作原理解析
1.fielddata 是什么
fielddata 是 Elasticsearch 中一種數(shù)據(jù)結(jié)構(gòu),用于在內(nèi)存中緩存字段數(shù)據(jù),主要服務于以下場景:
- 聚合操作(Aggregations)
- 排序(Sorting)
- 腳本計算(Scripting)
- 某些類型的查詢(如
field字段上的term查詢)
當需要對 text 字段或其他非 doc_values 支持的字段執(zhí)行上述操作時,Elasticsearch 需要將這些字段的值加載到內(nèi)存中,這就是 fielddata 的作用。
2.fielddata 的工作原理
- 按需加載:當?shù)谝淮涡枰獙δ硞€字段執(zhí)行聚合 / 排序等操作時,Elasticsearch 會從磁盤讀取該字段的所有值并構(gòu)建內(nèi)存中的數(shù)據(jù)結(jié)構(gòu)。
- 存儲在 JVM 堆內(nèi)存:
fielddata會占用 JVM 堆內(nèi)存空間。 - 字段級啟用:默認情況下,
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.使用場景示例
示例 1:對 text 字段進行聚合
GET my_index/_search
{
"size": 0,
"aggs": {
"my_terms": {
"terms": {
"field": "my_text_field" // 需要該字段啟用 fielddata
}
}
}
}示例 2:對 text 字段進行排序
GET my_index/_search
{
"sort": [
{
"my_text_field": {
"order": "asc"
}
}
]
}5.fielddata 與 doc_values 的區(qū)別
| 特性 | fielddata | doc_values |
|---|---|---|
| 構(gòu)建時機 | 查詢時按需構(gòu)建 | 索引時預先構(gòu)建 |
| 存儲位置 | JVM 堆內(nèi)存 | 磁盤(操作系統(tǒng)緩存) |
| 內(nèi)存占用 | 高 | 低 |
| 適用字段類型 | 主要為 text 字段 | 主要為 keyword / numeric / date 等字段 |
| 默認啟用 | text 字段默認禁用 | 支持的字段默認啟用 |
6.注意事項
- 內(nèi)存消耗:
fielddata會顯著增加內(nèi)存使用,特別是高基數(shù)(大量唯一值)字段。 - 性能影響:首次加載
fielddata可能導致查詢延遲。 - 替代方案:對于
keyword/numeric/date等字段,優(yōu)先使用doc_values。 - 熔斷機制:Elasticsearch 有
fielddata熔斷器防止內(nèi)存耗盡。
7.最佳實踐
- 盡量避免在
text字段上啟用fielddata。 - 如需對文本進行聚合/排序,考慮使用多字段(
multi-field)映射:
"my_field": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword"
}
}
}然后對 my_field.keyword 進行操作。
監(jiān)控 fielddata 內(nèi)存使用,設置合理的熔斷閾值。
到此這篇關于Elasticsearch 映射 fielddata 工作原理解析的文章就介紹到這了,更多相關Elasticsearch 映射 fielddata 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java入門基礎之Java的基本語法與Java所支持的數(shù)據(jù)類型
這篇文章主要介紹了Java入門基礎之Java的基本語法與Java所支持的數(shù)據(jù)類型,熟悉語法和數(shù)據(jù)類型通常是了解一種編程語言的開始,需要的朋友可以參考下2016-02-02
Spring中ApplicationContextAware的使用方法詳解
ApplicationContextAware?通過它Spring容器會自動把上下文環(huán)境對象調(diào)用ApplicationContextAware接口中的setApplicationContext方法,這篇文章主要介紹了Spring中ApplicationContextAware的作用,需要的朋友可以參考下2023-03-03

