@@注意:本篇笔记使用的ElasticSearch7.5
1.介绍
1.1 什么是Mapping?
Mapping 类似MYSQL中的表结构(schema) ,其作用如下
- 定义索引中的字段的名称
- 定义字段的数据类型,例如
字符串(text、keyword)、数值型(integer,float..)等
- 字段,倒排索引的相关配置,比如设置某个字段为不被索引、记录 position 等
从ElasticSearch7.0 之后的版本,一个索引只有一个Type(_doc),7.0 开始,不需要在 Mapping 定义中指定 type信息。
1.2 都有哪些类型?
| 描述 |
类型 |
| 字符串 |
text, keyword |
| 数值型 |
long, integer, short, byte, double, float, half_float, scaled_float |
| 布尔型 |
boolean |
| 日期型 |
date, date_nanos |
| 二进制 |
binary |
| 范围型 |
integer_range, float_range, long_range, double_range, date_range |
| 对象类型 |
object |
| 嵌套类型 |
nested |
| 地理坐标类型 |
geo_point |
| 地理形状类型 |
geo_shape |
| IP地址类型 |
IP |
| 父/子关系 |
Join:为同一索引中的文档定义父/子关系 |
| 数组类型 |
字符型数组: ["one", "two"] |
|
整型数组:[1, 2] |
|
数组型数组:[1, [2, 3]] 等同于 [1, 2, 3] |
|
对象数组:[{"name": "Mary", "age": 12}, {"name": "John", "age": 10}] |
es不需要显示定义数组类型,只需要在插入数据时用[]表示即可。
2.自动创建
如果没有手动设置Mapping,Elasticsearch默认会自动解析出类型,且每个字段以第一次出现的为准。以下是示例:
2.1 创建语法
curl -XPOST "http://elasticsearch:9200/test_mapping/_doc" -H 'Content-Type: application/json' -d'{ "name":"张三", "age":18, "height":1.75}'
|
2.2 查看类型

curl -XGET "http://elasticsearch:9200/test_mapping/_mapping"
|
2.3 类型识别
ES 类型的自动识别是基于 JSON 的格式,具体映射关系如下所示:
| JSON类型 |
ElasticSearch类型 |
| 字符串 |
1.当匹配日期格式时,设置Date;如:2020-01-01 2.当设置数字时,设置float或者long; 3.当设置为Text时,自动增加keyword子字段 |
| 布尔值 |
boolean |
| 浮点数 |
float |
| 整数 |
long |
| 对象 |
Object |
| 数组 |
由第一个非空数值类型决定 |
| 空值 |
忽略 |
一旦Mapping字段对应的类型定下来之后,后续添加时必须要符合其类型,否则会报错。
3.手动创建
3.1定义语法
{ "settings":{ "index.max_result_window":20000 , "index.merge.scheduler.max_thread_count": 2 , "index.routing.allocation.total_shards_per_node":10 , "index.refresh_interval":"-1" , "index.translog.durability":"async" , "index.translog.flush_threshold_size":"1024mb" , "index.translog.sync_interval":"120s" , "index.unassigned.node_left.delayed_timeout":"1d" , "index.search.slowlog.threshold.query.info":"1s" , "index.store.type":"niofs" , "index.number_of_replicas":0 , "index.number_of_shards":8 , "index.codec":"best_compression" , }, "mappings":{ "properties":{ "字段名":{ "type":"类型名", "analyzer":"ik_max_word", "index":true, "fields":{ "keyword":{ "type":"keyword", "ignore_above":3, }, } } } } }
|
ES6.3以后 index属性支持false和true,false不能搜索相当于no,true可以索引。默认使用standar分词
3.2 创建示例
curl -XPUT "http://elasticsearch:9200/test_mapping" -H 'Content-Type: application/json' -d'{ "settings":{ "index.max_result_window":3, "index.routing.allocation.total_shards_per_node":2, "index.number_of_shards":2, "index.codec":"best_compression" }, "mappings":{ "properties":{ "name":{ "type":"keyword" }, "address":{ "type":"text", "fields":{ "keyword":{ "type":"keyword", "ignore_above":10 } } }, "phone":{ "type":"text", "index":false }, "age":{ "type":"byte" }, "score":{ "type":"short" } } } }'
|
4.查看映射
查询语法整理如下
curl -XGET "http://elasticsearch:9200/test_mapping"
curl -XGET "http://elasticsearch:9200/test_mapping/_alias"
curl -XGET "http://elasticsearch:9200/test_mapping/_mapping"
curl -XGET "http://elasticsearch:9200/test_mapping/_settings"
curl -XGET "http://elasticsearch:9200/test_mapping/_mapping/field/name,age"
|
5.更新
5.1 新增字段
➜ ~ curl -XPUT "http://elasticsearch:9200/test_mapping/_mappings" -H 'Content-Type: application/json' -d'{ "properties":{ "desc":{ "type":"text" } } }'
{"acknowledged":true}
|
6.删除映射
➜ ~ curl -XDELETE "http://elasticsearch:9200/test_mapping"
|