简介
有了索引库
,等于有了数据库中的database
。
接下来就需要索引库中的类型
了,也就是数据库中的表
。
但是在es7中,映射类型已经被移除,但是映射约束还在,
创建数据库表需要设置字段约束,索引库也一样,在创建索引库的类型时,需要知道这个类型下有哪些字段,每个字段有哪些约束信息,这就叫做字段映射(mapping)
映射是定义文档的过程,文档包含哪些字段,字段是否store, 是否index, 是什么类型的数据, 是否分词等信息;
eg:
PUT /wql
{
"mappings": {
"properties": {
"address": {
"type": "text",
"analyzer": "ik_max_word"
},
"userName": {
"type": "keyword"
},
"userPhone": {
"type": "text",
"analyzer": "ik_max_word"
}
}
}
}
当然也可以同时设置settings 和 aliases,我就采用系统默认了
分两步执行,先创建索引库,再创建字段映射
eg:
PUT /wql
PUT /wql/_mapping
{
"properties": {
"address": {
"type": "text",
"analyzer": "ik_max_word"
},
"userName": {
"type": "keyword"
},
"userPhone": {
"type": "text",
"analyzer": "ik_max_word"
}
}
}
PUT /索引库名/_mapping
{
"properties": {
"字段名1": {
"type": "类型",
"index": true,
"store": true,
"analyzer": "分词器"
},
"字段名2": {
"type": "类型",
"index": true,
"store": true,
"analyzer": "分词器"
},
...
}
}
字段名:任意填写,下面指定许多属性,例如:
ik_max_word
即使用ik分词器使用PUT方法,后面跟随我们的索引名称,再接上_mapping,请求体中是我们新添加的映射字段,我们指定了字段的类型为keyword,index索引为false,说明这个字段只用于存储,不会用于搜索,搜索这个字段是搜索不到的。
我们在更新字段时候,是不能修改字段的类型的
。如果我们要修改字段的类型,最好是新建一个新的字段,指定正确的类型,然后再更新索引,以后我们只需要查询这个新增的字段就可以了。
注意:
es7 开始类型名称已经被弃用
在关系型数据库中,不同的表中,包含相同的字段名是很常见的,而且它们可以做到互不干扰。
在ElasticSearch中,不同的type,如果包含相同的字段名,它们是一样的,es会认为是一个字段,模糊掉不同type的概念。
所以在es里边,type这个概念没必要存在,所以es7就废弃了
。
在同一个index中,不同的type,创建一个同名的字段,但是类型不要弄成一样的,看能否成功创建。
答案是不可以,它会提示你,不可以将这个字段的类型更改为这个类型。所以,结论就是,es确实把不同type中的同名字段,当成了一个字段。在设计索引库的时候,同名问题一定要注意,最简单的方法就是一个index,一个type,想要其他类型,另外创建index,当然你可以用别的字段名。
注意:ES7废弃,但还在用,ES8才真正的去掉了type。
比如这样玩,在7以下可以,7之后不行,会报错;
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个字段:
并且给这些字段设置了一些属性,至于这些属性对应的含义,我们在后续会详细介绍。
查看映射关系
语法: 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
}
}
}
}
}
映射属性详解
type(数据类型)
Elasticsearch中支持的数据类型非常丰富:
我们说几个关键的:
String类型,又分两种:
可分词,不可参与聚合
不可分词,数据会作为完整字段进行匹配,可以参与聚合
Numerical:数值类型,分两类
Date:日期类型
elasticsearch可以对日期格式化为字符串存储,但是建议我们存储为毫秒值,存储为long,节省空间。
{
name:"Jack",
age:21,
girl:{
name: "Rose",
age:21
}
}
如果存储到索引库的是对象类型,例如上面的girl,会把girl处理成两个字段:girl.name和girl.age
index
:index影响字段的索引情况。
store
:是否将数据进行额外存储。
在学习lucene和solr时,我们知道如果一个字段的store设置为false,那么在文档列表中就不会有这个字段的值,用户的搜索结果中不会显示出来。
但是在Elasticsearch中,即便store设置为false,也可以搜索到结果。
原因是Elasticsearch在创建文档索引时,会将文档中的原始数据备份,保存到一个叫做_source
的属性中。而且我们可以通过过滤_source
来选择哪些要显示,哪些不显示。
而如果设置store为true,就会在_source
以外额外存储一份数据,多余,因此一般我们都会将store设置为false,事实上,store的默认值就是false。
小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"
}
}
}
}