@@注意:本篇笔记使用的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.自动创建

如果没有手动设置MappingElasticsearch默认会自动解析出类型,且每个字段以第一次出现的为准。以下是示例:

2.1 创建语法

image-20210315160213089
curl -XPOST "http://elasticsearch:9200/test_mapping/_doc" -H 'Content-Type: application/json' -d'{  "name":"张三",  "age":18,  "height":1.75}'

2.2 查看类型

image-20210315160654768

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 ,
//segment段合并时可使用的最大线程数,为避免过度的io操作,该值一般不超过2
"index.merge.scheduler.max_thread_count": 2 ,
//分配到单个节点的最大分片数
"index.routing.allocation.total_shards_per_node":10 ,
//index刷新频率,频繁刷新会降低性能,一般设置为30s-60s;-1表示禁用刷新
"index.refresh_interval":"-1" ,
//translog刷新方式,如果对数据安全性要求不算太高,可设置为async以提升性能
"index.translog.durability":"async" ,
//translog刷新字节条件,超过1g才会刷新
"index.translog.flush_threshold_size":"1024mb" ,
//translog刷新时间条件,超过120s才会刷新
"index.translog.sync_interval":"120s" ,
//当有节点宕机后索引库多久触发副本balance操作
"index.unassigned.node_left.delayed_timeout":"1d" ,
//超过1s的查询会被记录到慢查询日志里
"index.search.slowlog.threshold.query.info":"1s" ,
//网络通信协议
"index.store.type":"niofs" ,
//index分片的副本数
"index.number_of_replicas":0 ,
//index分片数,需要注意的是es7.0默认索引分片数调整为1了
"index.number_of_shards":8 ,
//index数据的压缩方式,best_compression压缩可节省4-8倍的存储空间
"index.codec":"best_compression" ,
},
"mappings":{
"properties":{
"字段名":{
"type":"类型名",
//指定分词器,ik_max_word、standard(默认)
"analyzer":"ik_max_word",
//该字段是否会被索引和可查询 默认true
"index":true,
//可以对一个字段提供多种索引模式,使用text类型做全文检索,也可使用keyword类型做聚合和排序
"fields":{
"keyword":{
"type":"keyword",
//指定字段索引和存储的长度最大值,超过最大值的会被忽略
"ignore_above":3,
},
}
}
}
}
}

ES6.3以后 index属性支持false和true,false不能搜索相当于no,true可以索引。默认使用standar分词

3.2 创建示例

image-20210317151432391
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.查看映射

查询语法整理如下

# 返回 aliases、mappings、settings
curl -XGET "http://elasticsearch:9200/test_mapping"
# 只查询别名
curl -XGET "http://elasticsearch:9200/test_mapping/_alias"
# 只查询mapping
curl -XGET "http://elasticsearch:9200/test_mapping/_mapping"
# 只查询settings
curl -XGET "http://elasticsearch:9200/test_mapping/_settings"
# 查询mapping中指定的几个字段(name,age)多个用逗号隔开
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"