ElasticSearch之-映射管理
es中的类型---->对应mysql中的表,也叫映射管理
在Elasticsearch 6.0.0或更高版本中创建的索引只包含一个mapping type。 在5.x中使用multiple mapping types创建的索引将继续像以前一样在Elasticsearch 6.x中运行(只能读,不能存)。 Mapping types将在Elasticsearch 7.0.0中完全删除(读都不能读了,从旧版导入都不行了)
在创建索引的时候,可以预先定义字段的类型及相关属性
Es会根据Json数据源的基础类型,猜测你想要映射的字段,将输入的数据转变成可以搜索的索引项。
Mapping是我们自己定义的字段数据类型,同时告诉es如何索引数据及是否可以被搜索。
作用:会让索引建立的更加细致和完善
string类型:text,keyword
数字类型:long(int64),integer(int32),short(int16),byte(int8),double,float 这些都是java的基础数据类型
日期类型:data
布尔类型:boolean
binary类型:binary 二进制类型,可以直接把文件以二进制的格式放进去,mysql也有二进制类型,一般不用
复杂类型:object(实体,对象,可以是字典也可以是列表),nested(列表)
geo类型:geo-point,geo-shape(地理位置)
专业类型:ip,competion(搜索建议)
属性 | 描述 | 适合类型 |
---|---|---|
store | 值为yes表示存储,no表示不存储,默认为no | all |
index | yes表示分析(分词),no表示不分析,默认为true | text |
null_value | 如果字段为空,可以设置一个默认值,比如"NA"(传过来为空,不能搜索,na可以搜索) | all |
analyzer | 可以设置索引和搜索时用的分析器,默认使用的是standard分析器,还可以使用whitespace,simple。都是英文分析器 | all |
include_in_all | 默认es为每个文档定义一个特殊域_all,它的作用是让每个字段都被搜索到,如果想让某个字段不被搜索到,可以设置为false | all |
format | 时间格式字符串模式 | date |
text类型会取出词做倒排索引, keyword不会被分词,原样存储,原样匹配
mapping类型一旦确定,以后就不能修改了
es 6.x版本及以前版本
PUT books
{
"mappings": {
"book":{ #表示类型(表名),6.x以前可以建多个表
"properties":{
"title":{
"type":"text",
"analyzer": "ik_max_word"
},
"price":{
"type":"integer"
},
"addr":{
"type":"keyword"
},
"company":{
"properties":{
"name":{"type":"text"},
"company_addr":{"type":"text"},
"employee_count":{"type":"integer"}
}
},
"publish_date":{"type":"date","format":"yyy-MM-dd"}
}
}
}
}
es 7.x版本以后
PUT books #创建索引和映射,创建后不会看到表的结构,新增文档后才能看到
{
"mappings": { #创建映射(创建表) 是一个复杂类型,字典/字典中再嵌套字典
"properties":{ #包在properties字典中
"title":{ #字段名
"type":"text", #字段属性,text类型
"analyzer": "ik_max_word" #字段属性,用ik_max_word做分词
},
"price":{ #字段名
"type":"integer"
},
"addr":{ #字段名
"type":"keyword" #keyword类型不做分词,直接建索引
},
"company":{ #字段名
"properties":{ #包在properties字典中
"name":{"type":"text"},
"company_addr":{"type":"text"},
"employee_count":{"type":"integer"}
}
},
"publish_date":{"type":"date","format":"yyy-MM-dd"} #日期类型有format属性,表示日期格式
}
}
}
插入数据测试:属于文档操作
# 朝books索引中的表插入数据,由于没有写映射名(表名),默认就是_doc, 1表示这条数据的id号
PUT books/_doc/1
{
"title":"大头儿子小偷爸爸",
"price":100,
"addr":"北京天安门",
"company":{
"name":"我爱北京天安门",
"company_addr":"我的家在东北松花江傻姑娘",
"employee_count":10
},
"publish_date":"2019-08-19"
}
#测试数据2
PUT books/_doc/2
{
"title":"白雪公主和十个小矮人",
"price":"99", #写字符串会自动转换成int类型
"addr":"黑暗森里",
"company":{
"name":"我的家乡在上海",
"company_addr":"朋友一生一起走",
"employee_count":10
},
"publish_date":"2018-05-19"
}
#测试数据3 因为是非关系型数据库,可以不考虑字段,测试数据3没有company字段,并且新增了name字段,也能插入进去
PUT books/_doc/3
{
"title":"白雪公主和十个小矮人",
"price":"99", #写字符串会自动转换
"addr":"黑暗森里",
"publish_date":"2018-05-19"
|"name":"lqz" # 注意: 新增的字段有缩进,不然报错
}
#查看books索引的mapping
# 1、创建索引时,如果没有创建映射(创建表)只要插入文档,会自动创建出字段。
# 2、甚至不用创建索引,只要插入文档,会自动创建索引、映射、字段,自动创建索引和映射后不能删除。
GET books/_mapping
#获取所有的mapping
GET _all/_mapping