索引Mapping
索引的结构化约束
- Mapping类同数据表的schema定义表结构,与ES定义索引内的结构
- ES的Mapping提供类比数据表Schema更多的多选择与灵活性
Mapping用途
- Mapping用来规范ES索引结构与行为,也是性能优化的重要一环
- 应用场景不同,Mapping的设置运用也不同,如日志与业务系统

创建mapping:
PUT test-01{"mappings": {"properties": {"name":{"type": "text"},"email":{"type": "text"},"old":{"type": "integer"}}}}
修改mapping
PUT test-01/_mapping{"properties": {"name":{"type": "text"},"email":{"type": "text"},"old":{"type": "integer"},"company":{"type": "text"}}}
Mapping映射
- Dynamic设置为true时,如果有新增字段的文档写入,Mapping会更新,相应的对新增字段定义类型。
- Dynamic设置为false,Mapping不会被更新,并且新增字段的数据无法被索引,但是,信息会出现在_source中。
- Dynamic设置为Strict,文档会写入失败!
- 设置为true时:文档可索引、字段可索引、mapping允许被更新。
设置为false时:文档可索引、字段不可索引、mapping不允许被更新。
设置为true时:文档不可索引、字段不可索引、mapping不允许被更新。
常用字段类型应用
Text:文本
文本类型:
按规则分词,分成至少1个词,默认粉刺器standard
应用场景:
text,用于需要分词检索的场景
DELETE test-001PUT test-01/_mapping{"properties": {"name":{"type": "text"}}}PUT test-01/_doc/1{"name":"liwenjun,hunan,ChangSha"}POST _analyze{"analyzer": "standard","text": ["liwenjun,hunan,ChangSha"]}
keyword:关键词
概念说明:
- 严格意义上就是不分词,仅仅分一个词
- 包括3中:
keyworld:一个单词
constant _keworld:默认插入一个固定值
wildcard:通配符的检索场景
应用场景
- 固定文本信息,无需全文检索场景
- 姓名,省份,商品类目
- 替代传统数据库字段检索,用于多条件检索
- 特殊场景下查询

测试:
PUT test-006{"mappings": {"dynamic": false,"properties": {"name01":{"type": "keyword"},"name02":{"type": "constant_keyword","value": "liwenjun001"},"name03":{"type": "wildcard"}}}}
插入数据:
PUT test-006/_doc/1{"name01":"liwenjun,hunan,ChangSha","name03":"liwenjun,hunan,ChangSha"}PUT test-006/_doc/2{"name01":"liwenjun,hunan,ChangSha","name02":"liwenjun001","name03":"liwenjun,hunan,ChangSha"}PUT test-006/_doc/3{"name01":"liwenjun,hunan,ChangSha","name02":"liwenjun001","name03":"liwenjun,sanya,ChangSha"}GET test-006/_search{"query": {"wildcard": {"name03": "*ny*"}}}
整数:
Long类型:空间占用:64bit
Integer类型:空间占用:32bit
short类型:空间占用:16bit
Byte类型:空间占用:8bit
浮点
浮点类型:
Double
Float
Half_float
Scaled_float: 缩放浮点类型,背后基于Long类型实现,会出现精度问题;
应用注意:
浮点类型精确统计会出现精确性问题
Java底层实现问题;
如何避免?使用整数类型来处理
date日期类型:
1.date
2.date_nano
日期格式化
format,支持多种自定义格式,注意,建议使用UTC时间格式,一定要使用UTC
字符类型背后算法
Text,keyword类型
倒排索引:Inverted index
数值类型背后算法:
复合字段类型的应用
object
表现形式
Json对象形式,可以嵌套多种子对象
内部存储实现
内部存储实际非json,通过分隔符建立嵌套关系,字段命名不可以采用分隔符;
PUT test-006{"mappings": {"dynamic": false,"properties": {"name01":{"type": "keyword"},"name02":{"type": "constant_keyword","value": "liwenjun001"},"name03":{"type": "wildcard"},"address":{"properties": {"pro":{"type":"text"},"city":{"type":"text"}}}}}}PUT test-006/_doc/1{"name01":"liwenjun,hunan,ChangSha","name03":"liwenjun,hunan,ChangSha","address":{"pro":"hunan","city":"changsha"}}
array:数组
- 注意说明
ES未定义数组类型,仅仅是支持,类似object方式支持的,但无需设置,填充数据设时设定数据样本即可
- 支持类型
一维数组
多位数组
对象数组
PUT test-006/_doc/1{"name01":"liwenjun,hunan,ChangSha","name03":"liwenjun,hunan,ChangSha","address":[{"pro":"hunan","city":"changsha"},{"pro":"hebei","city":"baoding"}]}GET test-006/_search{}{"took" : 106,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 1,"relation" : "eq"},"max_score" : 1.0,"hits" : [{"_index" : "test-006","_type" : "_doc","_id" : "1","_score" : 1.0,"_source" : {"name01" : "liwenjun,hunan,ChangSha","name03" : "liwenjun,hunan,ChangSha","address" : [{"pro" : "hunan","city" : "changsha"},{"pro" : "hebei","city" : "baoding"}]}}]}}
范围类型:
- 范围类型
整型范围
浮点范围
日期范围
IP范围
- 应用场景:
复杂对象单一化类型
flattened:单一化类型
概念定义:
将复杂对象下的字段归属到单一类型,避免索引mapping字段数量限制引起的错误
应用场景:
日志混合场景,可以避免接入不确定字段数量过多,避免错误;
避免字段膨胀:
- dynamic 设置为 strict
设置 “address02”:{
"type": "flattened"<br /> }<br />
索引字段类型设计限制
字段设置限制默认1024个字段,但是可以修改
对象对象深度限制20层,Mapping源码解读
