映射定义索引中有什么字段、字段的类型等结构信息。相当于数据库中表结构定义,或 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。
(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定义一个多重字段raw
PUT 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等。