@@注意:本篇笔记使用的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"
|