转自:https://blog.csdn.net/u013089490/article/details/84316852
映射定义索引中有什么字段、字段的类型等结构信息。相当于数据库中表结构定义,或 solr中的schema。因为lucene索引文档时需要知道该如何来索引存储文档的字段。
【官网中映射类别Mapping type废除说明】
ES最先的设计是用索引类比关系型数据库的数据库,用mapping type 来类比表,一个索引中可以包含多个映射类别。这个类比存在一个严重的问题,就是当多个mapping type中存在同名字段时(特别是同名字段还是不同类型的),在一个索引中不好处理,因为搜索引擎中只有 索引-文档的结构,不同映射类别的数据都是一个一个的文档(只是包含的字段不一样而已)。
从6.0.0开始限定仅包含一个映射类别定义( “index.mapping.single_type”: true ),兼容5.x中的多映射类别。从7.0开始将移除映射类别。为了与未来的规划匹配,请现在将这个唯一的映射类别名定义为“_doc”,因为索引的请求地址将规范为:PUT {index}/_doc/{id} and POST {index}/_doc。
1、创建索引
【创建索引语法】
PUT /索引库名/_mapping/_doc{"properties": {"字段名": {"type": "类型","index": true,"store": true,"analyzer": "分词器"}}}
注意,映射类型这里没写,因为现在6.x版本还兼容但是在以后的7.x将不再兼容,这里统一要求写成_doc。
PUT wzy{"settings": {"number_of_replicas": 0},"mappings": {"_doc": {"properties": {"type": { "type": "keyword" },"name": { "type": "text" },"user_name": { "type": "keyword" },"email": { "type": "keyword" },"content": { "type": "text" },"tweeted_at": { "type": "date" }}}}}#执行返回结果{"acknowledged": true,"shards_acknowledged": true,"index": "wzy"}
【必看说明】
(1)type类型:可以是text,long,short,date,integer,object等;
(2)index:是否索引,默认值为true;
(3)store:是否存储,默认为false;
(4)analyzer:分词器,这里是ik_max_word,即使用ik分词器;
2、查看映射关系
【查看索引映射语法】
GET /索引名称/_mapping
#kibana中执行GET /wzy/_mapping#返回结果{"wzy": {"mappings": {"_doc": {"properties": {"content": {"type": "text"},"email": {"type": "keyword"},"name": {"type": "text"},"tweeted_at": {"type": "date"},"type": {"type": "keyword"},"user_name": {"type": "keyword"}}}}}}
3、字段属性
3.1、字段类型type
字段类型定义了该如何索引存储字段值。ES中提供了丰富的字段类型定义,请查看官网链接详细了解每种类型的特点:官网地址[https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-types.html](https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-types.html)。
(1)String类型,该类型又分为两种
- text:可分词,不可参与聚合;
keyword:不可分词,数据会作为完整字段进行匹配,可以参与聚合。
(2)Numerical数值类型,又分为两类:
基本数值类型:long、integer、short、byte、double、float、half_float等;
浮点数的高精度类型:scaled_float,需要指定一个精度因子,比如10或者100。ES会把真实值乘以这个因子后存储,取出时再还原。
(3)Date日期类型
ES可以对日期格式化为字符串存储,但是建议我们存储为毫秒值,存储为long,节省空间。
PUT my_index{"mappings": {"_doc": {"properties": {"date": {"type": "date","format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"}}}}}
3.2、index属性
字段的index属性会影响索引情况:
true:字段会被索引,则可以用来进行搜索,默认值就是true;
- false:字段不会索引,不能用来进行搜索。
index属性的默认值就是true,也就是说不进行任何设置,所有字段都会被索引。但是有些字段我们不希望被索引,就需要手动设置index属性为false。
3.3、store存储属性
是否将数据进行额外存储。
知道如果一个字段的store设置为false,那么在文档列表中就不会有这个字段的值,用户的搜索结果中不会显示出来。但是在Elasticsearch中,即便store设置为false,也可以搜索到结果。原因是Elasticsearch在创建文档索引时,会将文档中的原始数据备份,保存到一个叫做_source的属性中。而且我们可以通过过滤_source来选择哪些要显示,哪些不显示。
而如果设置store为true,就会在_source以外额外存储一份数据,多余,因此一般我们都会将store设置为false,事实上,store的默认值就是false。
3.4、Multi Field 多重字段
当我们需要对一个字段进行多种不同方式的索引时,可以使用**fields多重字段定义**。如一个字符串字段即需要进行text分词索引,也需要进行keyword 关键字索引来支持排序、聚合;或需要用不同的分词器进行分词索引。
#1、定义索引,给字段city定义一个多重字段rawPUT my_index{"mappings": {"_doc": {"properties": {"city": {"type": "text","fields": {"raw": { #raw是一个多重版本名"type": "keyword"}}}}}}}#2、插入两条记录PUT my_index/_doc/1{"city": "New York"}PUT my_index/_doc/2{"city": "York"}#3、多重字段的查询GET my_index/_search{"query": {"match": {"city": "york"}},"sort": {"city.raw": "asc"},"aggs": {"Cities": {"terms": {"field": "city.raw"}}}}
3.5、元字段
元字段是ES中定义的文档字段。常见的元字段有_index、_type、_id、_version等。
