Elasticsearch核心:Mapping映射全解析+定义实战教程
-
- 一、前言
- 二、基础概念:什么是Elasticsearch Mapping?
-
- 2.1 核心定义
- 2.2 Mapping核心作用
- 2.3 Mapping工作流程图
- 三、Elasticsearch Mapping的两种类型
-
- 3.1 类型1:动态映射(Dynamic Mapping)
-
- 3.1.1 原理
- 3.1.2 自动类型推断规则
- 3.1.3 优缺点
- 3.1.4 动态映射演示(自动创建)
- 3.2 类型2:静态映射(Static Mapping)
-
- 3.2.1 原理
- 3.2.2 优缺点
- 3.2.3 静态映射演示(手动创建)
- 四、Elasticsearch 常用核心字段类型
-
- 4.1 核心字段类型清单
- 4.2 关键字段类型对比
- 五、如何定义Elasticsearch Mapping?(3种实战方式)
-
- 5.1 方式1:创建索引时定义静态Mapping(生产首选)
- 5.2 方式2:动态映射(自动创建,仅测试)
- 5.3 方式3:新增字段(动态更新Mapping)
- 六、Mapping核心注意事项(必看,避坑指南)
-
- 6.1 核心规则(新手必背)
- 6.2 生产最佳实践
- 七、查看与管理Mapping常用命令
-
- 7.1 查看索引Mapping
- 7.2 删除索引(修改Mapping必须删除重建)
- 八、总结
|
🌺The Begin🌺点点关注,收藏不迷路🌺 |
一、前言
在Elasticsearch(ES)的使用中,Mapping映射是最核心、最基础的知识点,也是新手最容易踩坑的环节。很多人遇到“查询不到数据、聚合失败、字段类型错误”等问题,本质都是Mapping配置不当。
本文将从基础定义、核心作用、动态映射、静态映射、字段类型、定义方式等维度,全方位解析ES Mapping,搭配流程图、实战代码,让你彻底掌握Mapping的使用技巧,避开生产环境90%的字段配置坑。
二、基础概念:什么是Elasticsearch Mapping?
2.1 核心定义
2.2 Mapping核心作用
2.3 Mapping工作流程图
#mermaid-svg-o4UucAOn2AkCaXvz{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-o4UucAOn2AkCaXvz .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-o4UucAOn2AkCaXvz .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-o4UucAOn2AkCaXvz .error-icon{fill:#552222;}#mermaid-svg-o4UucAOn2AkCaXvz .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-o4UucAOn2AkCaXvz .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-o4UucAOn2AkCaXvz .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-o4UucAOn2AkCaXvz .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-o4UucAOn2AkCaXvz .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-o4UucAOn2AkCaXvz .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-o4UucAOn2AkCaXvz .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-o4UucAOn2AkCaXvz .marker{fill:#333333;stroke:#333333;}#mermaid-svg-o4UucAOn2AkCaXvz .marker.cross{stroke:#333333;}#mermaid-svg-o4UucAOn2AkCaXvz svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-o4UucAOn2AkCaXvz p{margin:0;}#mermaid-svg-o4UucAOn2AkCaXvz .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-o4UucAOn2AkCaXvz .cluster-label text{fill:#333;}#mermaid-svg-o4UucAOn2AkCaXvz .cluster-label span{color:#333;}#mermaid-svg-o4UucAOn2AkCaXvz .cluster-label span p{background-color:transparent;}#mermaid-svg-o4UucAOn2AkCaXvz .label text,#mermaid-svg-o4UucAOn2AkCaXvz span{fill:#333;color:#333;}#mermaid-svg-o4UucAOn2AkCaXvz .node rect,#mermaid-svg-o4UucAOn2AkCaXvz .node circle,#mermaid-svg-o4UucAOn2AkCaXvz .node ellipse,#mermaid-svg-o4UucAOn2AkCaXvz .node polygon,#mermaid-svg-o4UucAOn2AkCaXvz .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-o4UucAOn2AkCaXvz .rough-node .label text,#mermaid-svg-o4UucAOn2AkCaXvz .node .label text,#mermaid-svg-o4UucAOn2AkCaXvz .image-shape .label,#mermaid-svg-o4UucAOn2AkCaXvz .icon-shape .label{text-anchor:middle;}#mermaid-svg-o4UucAOn2AkCaXvz .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-o4UucAOn2AkCaXvz .rough-node .label,#mermaid-svg-o4UucAOn2AkCaXvz .node .label,#mermaid-svg-o4UucAOn2AkCaXvz .image-shape .label,#mermaid-svg-o4UucAOn2AkCaXvz .icon-shape .label{text-align:center;}#mermaid-svg-o4UucAOn2AkCaXvz .node.clickable{cursor:pointer;}#mermaid-svg-o4UucAOn2AkCaXvz .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-o4UucAOn2AkCaXvz .arrowheadPath{fill:#333333;}#mermaid-svg-o4UucAOn2AkCaXvz .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-o4UucAOn2AkCaXvz .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-o4UucAOn2AkCaXvz .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-o4UucAOn2AkCaXvz .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-o4UucAOn2AkCaXvz .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-o4UucAOn2AkCaXvz .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-o4UucAOn2AkCaXvz .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-o4UucAOn2AkCaXvz .cluster text{fill:#333;}#mermaid-svg-o4UucAOn2AkCaXvz .cluster span{color:#333;}#mermaid-svg-o4UucAOn2AkCaXvz div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-o4UucAOn2AkCaXvz .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-o4UucAOn2AkCaXvz rect.text{fill:none;stroke-width:0;}#mermaid-svg-o4UucAOn2AkCaXvz .icon-shape,#mermaid-svg-o4UucAOn2AkCaXvz .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-o4UucAOn2AkCaXvz .icon-shape p,#mermaid-svg-o4UucAOn2AkCaXvz .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-o4UucAOn2AkCaXvz .icon-shape .label rect,#mermaid-svg-o4UucAOn2AkCaXvz .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-o4UucAOn2AkCaXvz .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-o4UucAOn2AkCaXvz .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-o4UucAOn2AkCaXvz :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
写入JSON数据
Mapping规则
字段类型判定
分词规则匹配
构建倒排索引
数据存储完成
查询数据
根据Mapping解析查询
匹配倒排索引
返回正确结果
三、Elasticsearch Mapping的两种类型
ES提供动态映射和静态映射两种方式,适用不同业务场景。
3.1 类型1:动态映射(Dynamic Mapping)
3.1.1 原理
ES根据自动写入的数据,自动推断字段类型,无需手动定义。
- 写入数据 → ES自动识别字段 → 自动创建Mapping
- 开箱即用,适合快速开发、测试环境
3.1.2 自动类型推断规则
3.1.3 优缺点
- 优点:无需手动配置,使用简单
- 缺点:容易推断错误(如数字被识别为文本、日期识别失败),生产环境不推荐
3.1.4 动态映射演示(自动创建)
# 直接写入数据,ES自动创建Mapping
POST /user_index/_doc/1
{
"name": "张三",
"age": 20,
"birthday": "2000-01-01"
}
# 查看自动生成的Mapping
GET /user_index/_mapping
3.2 类型2:静态映射(Static Mapping)
3.2.1 原理
手动提前定义索引的字段类型、分词规则等所有Mapping规则,写入数据必须遵循规则。
- 提前定义Mapping → 创建索引 → 写入规范数据
- 生产环境唯一推荐方式,保证数据准确性
3.2.2 优缺点
- 优点:字段类型可控、性能最优、避免自动推断错误
- 缺点:需要提前规划字段,配置相对复杂
3.2.3 静态映射演示(手动创建)
# 创建索引+手动定义静态Mapping
PUT /user_index
{
"mappings": {
"properties": {
"name": { "type": "text" }, // 文本类型,支持分词
"age": { "type": "integer" }, // 整型
"birthday": { "type": "date" }, // 日期类型
"address": { "type": "keyword" } // 关键字,不分词
}
}
}
四、Elasticsearch 常用核心字段类型
Mapping的核心是定义字段类型,ES提供丰富的类型,以下是生产最常用的6种:
4.1 核心字段类型清单
4.2 关键字段类型对比
| text | 是 | 全文搜索、文章内容 | 不支持 |
| keyword | 否 | 精准查询、排序、聚合 | 支持 |
| integer | 否 | 数字统计 | 支持 |
| date | 否 | 时间范围查询 | 支持 |
五、如何定义Elasticsearch Mapping?(3种实战方式)
5.1 方式1:创建索引时定义静态Mapping(生产首选)
在创建索引的同时,手动定义所有字段规则,最标准、最常用。
# 完整示例:创建商品索引+自定义Mapping
PUT /product_index
{
"settings": {
"number_of_shards": 3, // 主分片
"number_of_replicas": 1 // 副本
},
"mappings": {
"properties": {
"product_id": { "type": "keyword" }, // 商品ID,不分词
"product_name": { // 商品名称,分词
"type": "text",
"analyzer": "ik_max_word" // 使用IK分词器
},
"price": { "type": "double" }, // 价格
"create_time": { "type": "date" }, // 时间
"status": { "type": "keyword" } // 状态
}
}
}
5.2 方式2:动态映射(自动创建,仅测试)
无需提前定义,直接写入数据,ES自动推断Mapping:
# 直接写入数据,自动生成Mapping
POST /test_index/_doc/1
{ "name": "测试", "count": 100 }
5.3 方式3:新增字段(动态更新Mapping)
已创建的索引,可以新增字段,但不能修改原有字段类型:
# 给已有索引新增字段
PUT /product_index/_mapping
{
"properties": {
"brand": { "type": "keyword" } // 新增品牌字段
}
}
六、Mapping核心注意事项(必看,避坑指南)
6.1 核心规则(新手必背)
- 一旦定义为text,无法改为keyword,只能删除索引重建
- 动态添加新字段,不影响原有数据
- 需要聚合必须使用fielddata或搭配keyword子字段
- 否则自动映射失败,导致查询异常
6.2 生产最佳实践
七、查看与管理Mapping常用命令
7.1 查看索引Mapping
# 查看单个索引Mapping
GET /product_index/_mapping
# 查看所有索引Mapping
GET /*/_mapping
7.2 删除索引(修改Mapping必须删除重建)
DELETE /product_index
八、总结
- 动态映射:自动推断,适合测试
- 静态映射:手动定义,生产环境必用
- text:全文检索,支持分词
- keyword:精准查询、聚合、排序

|
🌺The End🌺点点关注,收藏不迷路🌺 |




