目录
一、ElasticSearch 索引库操作
1.1、mapping 属性
1.2、索引库相关操作
1.2.1、创建索引库
1.2.2、增加和删除索引库
1.2.3、修改索引库
1.3、文档操作
1.3.1、添加文档
1.3.2、文档的查询和删除
1.3.3、修改文档
1.全量修改:会先删除旧文档,添加新文档.
2. 增量修改:修改执行字段值.
如果通过 PUT 进行全量修改的文档和原来的文档不一样,会发生什么?
一、ElasticSearch 索引库操作
1.1、mapping 属性
mappinig 是对索引库中文档的约束,常见的 mapping 属性如下:
- type:表示字段数据类型,常见的类型如下
- 字符串:text(可以进行分词的文本)、keyword(精确值,不用进行分词的文本. 例如:国家名、品牌、公司名、ip 地址......).
- 数值:long、integer、short、byte、double、float
- 布尔:boolean
- 日期 date
- 对象:object
- index:是否创建索引。默认 true.
- analyzer:使用那种分词器进行分词(比如之前所说的 IK 分词器).
- properties:该字段的子字段.
例如如下:
PUT /heima
{
"mappings": {
"properties": {
//这里是自定义的 info 信息
"info":{
"type": "text", //表示 info 中的信息可以进行分词.
"analyzer": "ik_smart" //使用 IK 分词器分词
//这里没有定义 index ,表示默认为词条创建索引
},
"email":{
"type": "keyword", //表示 email 不需要分词,是一个关键字
"index": "false" //不创建索引
},
"name":{
"properties": {
"firstName": {
"type": "keyword"
}
}
},
// ......
}
}
}
1.2、索引库相关操作
1.2.1、创建索引库
ES 中通过 Restful 请求操作索引库、文档. 请求的内容用 DSL 语句来表示.
创建 索引库 和 mapping 的语法如下:
PUT /索引库名称
{
"mappings": {
"properties": {
"字段名":{
"type": "text",
"analyzer": "ik_smart"
},
"字段名2":{
"type": "keyword",
"index": "false"
},
"字段名3":{
"properties": {
"子字段": {
"type": "keyword"
}
}
},
// ...略
}
}
}
假设创建以下索引库
PUT /userinfo
{
"mappings": {
"properties": {
"info":{
"type": "text",
"analyzer": "ik_smart"
},
"email":{
"type": "keyword",
"index": "false"
},
"name":{
"properties": {
"firstName": {
"type": "keyword"
}
}
}
}
}
}
1.2.2、增加和删除索引库
查看索引库语法:
GET/索引库名
示例:
GET /userinfo
删除索引库的语法:
DELETE /索引库名
示例:
DELETE /userinfo
删除后再 GET 就会发现找不到该索引库,如下
1.2.3、修改索引库
索引库和 mapping 一旦创建就无法修改,只可以再原来的基础上新增字段.
语法如下:
PUT /索引库名/_mapping
{
"properties": {
"新字段名":{
"type": "integer"
}
}
}
实例如下:
PUT /userinfo/_mapping
{
"properties": {
"age":{
"type": "integer"
}
}
}
例如这里我先创建 userinfo 索引库.
接着新增 age 字段:
接着查询 userinfo 索引库
如果是 PUT 的是存在的字段呢,比如 age,将 type 改为 keyword,他就会告诉你 mapper 中 integer 类型不可以修改成 keyword.
1.3、文档操作
1.3.1、添加文档
这里就类似于 mysql 中向表中添加数据一样,需要先创建表,后向添加数据.
文档操作也是如此,需要先创建索引库,然后才能添加文档.
添加文档语法如下:
POST /索引库名/_doc/文档id
{
"字段1": "值1",
"字段2": "值2",
"字段3": {
"子属性1": "值3",
"子属性2": "值4"
},
// ...
}
示例如下:
POST /userinfo/_doc/1
{
"info": "大家好,我是练习了两年半的偶像练习生",
"email": "cxk@itcast.cn",
"name": {
"firstName": "c",
"lastName": "xk"
}
}
假设创建以下索引库:
下面添加文档:
- _index:表示你是向哪个索引库添加文档.
- _type:表示类型添加的是什么类型,_doc 表示文档.
- _id:是添加文档的指定的 id.
- version:这是一个版本号,基于自旋锁实现的版本号,这个每对这个文档进行一次操作,版本号 就会 + 1.
- result:created 表示创建成功.
1.3.2、文档的查询和删除
查询文档语法:
GET /索引库名/_doc/文档id
示例:
GET /userinfo/_doc/1
删除文档语法:
DELETE /索引库名/_doc/文档id
示例:
DELETE /userinfo/_doc/1
1.3.3、修改文档
修改文档有两种方式
1.全量修改:会先删除旧文档,添加新文档.
语法如下:
PUT /索引库名/_doc/文档id
{
"字段1": "值1",
"字段2": "值2",
// ... 略
}
示例如下:
PUT /userinfo/_doc/1
{
"info": "我是练习两年半的偶像练习生",
"email": "cxk@itcast.cn",
"name": {
"firstName": "c",
"lastName": "xk"
}
}
例如原来存在以下文档
现在 PUT 以下操作
然后 GET 查询就是修改后的文档
2. 增量修改:修改执行字段值.
主要注意 索引名后面是 _update
语法如下:
POST /索引库名/_update/文档id
{
"doc": {
"字段名": "新的值",
}
}
示例如下:
POST /userinfo/_update/1
{
"doc": {
"email": "ZhaoYun@itcast.cn"
}
}
假设原本有文档如下
修改 info 字段的值,如下
通过 GET 获取文档
如果通过 PUT 进行全量修改的文档和原来的文档不一样,会发生什么?
例如存在以下文档
这里新增字段 age ,结果如下
实际上,这里 es 的处理方式,就是按照 “删除旧文档,新增新文档” 的操作来修改文档的.