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 核心定义
- Mapping:可以理解为ES索引的结构化定义规则,相当于关系型数据库的表结构(Schema)。
- 它的核心作用是:告诉ES如何索引和存储数据,定义索引中字段的名称、数据类型、分词规则、是否可索引等规则。
- 简单总结:Mapping = 索引的数据结构说明书。
2.2 Mapping核心作用
- 定义索引中字段的数据类型(text、keyword、date等)
- 定义字段是否需要分词、索引、存储
- 控制字段的查询、聚合、排序能力
- 提升数据写入和查询的性能与准确性
2.3 Mapping工作流程图
三、Elasticsearch Mapping的两种类型
ES提供动态映射和静态映射两种方式,适用不同业务场景。
3.1 类型1:动态映射(Dynamic Mapping)
3.1.1 原理
ES根据自动写入的数据,自动推断字段类型,无需手动定义。
- 写入数据 → ES自动识别字段 → 自动创建Mapping
- 开箱即用,适合快速开发、测试环境
3.1.2 自动类型推断规则
- JSON字符串 → 匹配
text+keyword类型 - JSON数字 → 匹配
long/integer类型 - JSON布尔值 → 匹配
boolean类型 - JSON日期字符串 → 匹配
date类型 - JSON对象 → 嵌套类型
3.1.3 优缺点
- 优点:无需手动配置,使用简单
- 缺点:容易推断错误(如数字被识别为文本、日期识别失败),生产环境不推荐
3.1.4 动态映射演示(自动创建)
# 直接写入数据,ES自动创建Mapping POST /user_index/_doc/1 { "name": "张三", "age": 20, "birthday": "2000-01-01" } # 查看自动生成的Mapping GET /user_index/_mapping3.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 核心字段类型清单
- text:文本类型,支持分词,用于全文检索(商品标题、文章内容)
- keyword:关键字类型,不分词,用于精准匹配、聚合、排序(手机号、状态、地址)
- integer/long:数字整型(年龄、ID、数量)
- double/float:浮点型(价格、经纬度)
- date:日期类型(创建时间、生日)
- boolean:布尔类型(是否启用、是否删除)
- object:对象类型(嵌套数据)
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,只能删除索引重建
- 可以随时新增字段
- 动态添加新字段,不影响原有数据
- text类型默认不支持聚合和排序
- 需要聚合必须使用
fielddata或搭配keyword子字段
- 需要聚合必须使用
- 日期格式必须规范
- 否则自动映射失败,导致查询异常
6.2 生产最佳实践
- 禁止自动创建索引,提前手动定义静态Mapping
- 文本字段统一使用:text + keyword组合类型
- 所有需要聚合、排序、精准查询的字段,必须用
keyword - 提前规划字段,避免后期修改类型
七、查看与管理Mapping常用命令
7.1 查看索引Mapping
# 查看单个索引Mapping GET /product_index/_mapping # 查看所有索引Mapping GET /*/_mapping7.2 删除索引(修改Mapping必须删除重建)
DELETE /product_index八、总结
- Mapping:ES索引的数据结构定义规则,相当于数据库表结构,决定数据如何存储和查询。
- 两种类型:
- 动态映射:自动推断,适合测试
- 静态映射:手动定义,生产环境必用
- 核心字段:
text:全文检索,支持分词keyword:精准查询、聚合、排序
- 黄金规则:字段类型创建后不可修改,提前规划,静态定义。
🌺The End🌺点点关注,收藏不迷路🌺 |