1.简介
有了索引库
,等于有了数据库中的database
。
接下来就需要索引库中的类型
了,也就是数据库中的表
。
但是在es7中,映射类型已经被移除,但是映射约束还在,
创建数据库表需要设置字段约束,索引库也一样,在创建索引库的类型时,需要知道这个类型下有哪些字段,每个字段有哪些约束信息,这就叫做字段映射(mapping)
映射是定义文档的过程,文档包含哪些字段,字段是否store, 是否index, 是什么类型的数据, 是否分词等信息;
2. 索引库和索引映射一起创建
eg:
PUT /wql
{
"mappings": {
"properties": {
"address": {
"type": "text",
"analyzer": "ik_max_word"
},
"userName": {
"type": "keyword"
},
"userPhone": {
"type": "text",
"analyzer": "ik_max_word"
}
}
}
}
当然也可以同时设置settings 和 aliases,我就采用系统默认了
3. 索引库和索引映射分开创建
分两步执行,先创建索引库,再创建字段映射
eg:
PUT /wql
PUT /wql/_mapping
{
"properties": {
"address": {
"type": "text",
"analyzer": "ik_max_word"
},
"userName": {
"type": "keyword"
},
"userPhone": {
"type": "text",
"analyzer": "ik_max_word"
}
}
}
4. 字段映射解释
PUT /索引库名/_mapping
{
"properties": {
"字段名1": {
"type": "类型",
"index": true,
"store": true,
"analyzer": "分词器"
},
"字段名2": {
"type": "类型",
"index": true,
"store": true,
"analyzer": "分词器"
},
...
}
}
字段名:任意填写,下面指定许多属性,例如:
- type:类型,可以是text、long、short、date、integer、object等
- index:是否索引,默认为true
- store:是否存储,默认为false
- analyzer:分词器,这里的
ik_max_word
即使用ik分词器
使用PUT方法,后面跟随我们的索引名称,再接上_mapping,请求体中是我们新添加的映射字段,我们指定了字段的类型为keyword,index索引为false,说明这个字段只用于存储,不会用于搜索,搜索这个字段是搜索不到的。
我们在更新字段时候,是不能修改字段的类型的
。如果我们要修改字段的类型,最好是新建一个新的字段,指定正确的类型,然后再更新索引,以后我们只需要查询这个新增的字段就可以了。
注意:
在关系型数据库中,不同的表中,包含相同的字段名是很常见的,而且它们可以做到互不干扰。
在ElasticSearch中,不同的type,如果包含相同的字段名,它们是一样的,es会认为是一个字段,模糊掉不同type的概念。
所以在es里边,type这个概念没必要存在,所以es7就废弃了
。
在同一个index中,不同的type,创建一个同名的字段,但是类型不要弄成一样的,看能否成功创建。
答案是不可以,它会提示你,不可以将这个字段的类型更改为这个类型。所以,结论就是,es确实把不同type中的同名字段,当成了一个字段。在设计索引库的时候,同名问题一定要注意,最简单的方法就是一个index,一个type,想要其他类型,另外创建index,当然你可以用别的字段名。
注意:ES7废弃,但还在用,ES8才真正的去掉了type。
比如这样玩,在7以下可以,7之后不行,会报错;
- es7之后版本需要在索引库后面拼接一个参数
include_type_name
参数,值为true
PUT /wql/_mapping/wang-01?include_type_name=true
{
"properties": {
"id": {
"type": "text",
"analyzer": "ik_max_word"
},
"userName": {
"type": "text",
"index": "false"
},
"userPhone": {
"type": "keyword",
"index": "false"
}
}
}
响应结果:
#! Elasticsearch built-in security features are not enabled. Without authentication, your cluster could be accessible to anyone. See https://www.elastic.co/guide/en/elasticsearch/reference/7.15/security-minimal-setup.html to enable security.
#! [types removal] Using include_type_name in put mapping requests is deprecated. The parameter will be removed in the next major version.
{
"acknowledged" : true
}
上述案例中,就给wql这个索引库添加了一个名为wang-01的类型,并且在类型中设置了3个字段:
- id:id
- userName:用户名
- userPhone:用户电话
并且给这些字段设置了一些属性,至于这些属性对应的含义,我们在后续会详细介绍。
5.查看映射关系
语法: GET /索引库名/_mapping
查看某个索引库中的所有类型的映射。如果要查看某个类型映射,可以再路径后面跟上类型名称。即:
GET /索引库名/_mapping/映射名
GET /索引库名/_mapping/
GET /索引库名/_mapping/?pretty
示例: GET /索引库名/_mapping/
响应:
{
"wql" : {
"mappings" : {
"properties" : {
"id" : {
"type" : "text",
"analyzer" : "ik_max_word"
},
"userName" : {
"type" : "text",
"index" : false
},
"userPhone" : {
"type" : "keyword",
"index" : false
}
}
}
}
}
6.映射属性详解
{
name:"Jack",
age:21,
girl:{
name: "Rose",
age:21
}
}
如果存储到索引库的是对象类型,例如上面的girl,会把girl处理成两个字段:girl.name和girl.age
小tip:
Elasticsearch之settings和mappings的意义:
简单的说,就是
- settings是修改分片和副本数的。
- mappings是修改字段和类型的。
ES的mapping如何用?什么时候需要手动,什么时候需要自动?
- Mapping,就是对索引库中索引的字段名称及其数据类型进行定义,类似于mysql中的表结构信息。不过es的mapping比数据库灵活很多,它可以动态识别字段。
一般不需要指定mapping都可以,因为es会自动根据数据格式识别它的类型,如果你需要对某些字段添加特殊属性(如:定义使用其它分词器、是否分词、是否存储等),就必须手动添加mapping
。
- 我们在es中添加索引数据时不需要指定数据类型,es中有自动影射机制,字符串映射为string,数字映射为long。通过mappings可以指定数据类型是否存储等属性。
PUT /wql
{
"mappings": {
"properties": {
"userName": {
"type": "text",
"analyzer": "ik_max_word"
},
"userPhone": {
"type": "text"
},
"address": {
"type": "text"
}
}
}
}