1. 初步检索
1.1 _cat查看节点信息
_cat请求都为GET请求
1)/_cat/nodes:查看所有节点
2)/_cat/health:查看es健康状况
3)/_cat/master:查看主节点
4)/_cat/indices:查看所有索引 。类似mysql中的show databases
1.2 索引一个文档(保存数据)
要保存一条记录,就需要告诉ES要“保存在哪个索引的哪个类型下,指定用哪个唯一标识”
1)请求方式:PUT/POST
2)例如:给customer索引(数据库名)下的external类型(表名)下保存1(唯一标识)号数据为{"name":" Jone Deon "}
http://192.168.56.10:9200/customer/external/1
注意:返回的带 _ 的key称之为元数据
{
"_index": "customer", // 索引
"_type": "external", // 类型
"_id": "1", // 唯一标识
"_version": 1, // 版本
"result": "created", // 类型为创建
"_shards": { // 分片信息 集群的时候需要用到
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 0,
"_primary_term": 1
}
用相同的URL,再次发送,如图:
类型就是updated更新了。因为1号数据已经存在了,所以是更新操作
注意:
1)POST新增。如果不指定id,会自动生成id,指定id就会修改这个数据,并新增版本号,如果指定的id不存在,那么类型就是created,_version值为1,再次用同样的URL发送,那么result就是updated,同时,_version+1
2)PUT可以新增可以修改,PUT必须指定id。由于PUT需要指定id,我们一般都用来做修改操作,不指定id会报错
1.3 查询文档(数据)
查询数据,只需要将POST/PUT改成GET即可,
例如:查询customer索引下的external类型下id为1的数据
{
"_index": "customer", // 在哪个索引
"_type": "external", // 在哪个类型
"_id": "1", // 记录id
"_version": 2, // 版本号
"_seq_no": 1, // 并发控制字段,每次更新就会+1,用来做乐观锁
"_primary_term": 1, // 同上,主分片重新分配,如重启,就会变化
"found": true, // 表示可以找到数据
"_source": { // 表示数据内容
"name": " Jone Deon "
}
}
注意:_seq_no与_primary_term可以用于并发控制,格式为
?if_seq_no=1&if_primary_term=1
例如:
用户A发送请求,修改数据,如图,修改成功
用户B用相同的URL访问,修改数据,修改不成功,如图:
1.4 更新文档(数据)
1.4.1 指定 _update 参数更新
发送POST请求,并指定 _update
注意:注意请求体JSON格式
例如:http://192.168.56.10:9200/customer/external/1/_update
查询:
注意:该方式的更新,如果待更新的数据跟原数据一模一样,那么result=noop,且版本号_version不会+1,序列号_seq_no也不会改变
例如:
1.4.2 不带 _update 的更新
直接发送POST请求,例如:http://192.168.56.10:9200/customer/external/1
查询:
注意:该方式的更新,每一次更新都会让版本号与序列号+1
例如:
1.4.3 PUT更新
例如:http://192.168.56.10:9200/customer/external/1
1.4.4 更新的同时新增属性
更新的同时新增属性,使用 _update 更新,也可以使用不带_update的POST和PUT请求
例如:带_update的post请求
查询:
例如:不带 _update 的POST请求
注意:PUT更新与不到_update的post更新请求效果一样
总结:
1)POST请求带 _update 的更新,会对比元数据,如果没变化,就不进行操作
2)POST不带 _update 的更新与PUT更新,总会将数据重新保存并增加version版本
3)对于大并发更新,用不带_update的请求
4)对于大并发查询偶尔更新,用带_update的请求;对比更新,重新计算分配规则
1.5 删除文档&索引
删除需要使用DELETE请求
1.5.1 删除某一条数据
http://192.168.56.10:9200/customer/external/1
查询
1.5.2 删除文档(索引)
http://192.168.56.10:9200/customer
查询:
因为,索引已经删除了,所以,查询的时候,就会直接报错了
1.6 bulk批量API
1.6.1 在某个索引下 的某个类型下批量操作
请求:POST
语法格式:
{action:{metadata}}
{request body }
{action:{metadata}}
{request body }
一个大括号代表了一个操作
例如:http://192.168.56.10:9200/customer/external/_bulk
请求体:
{"index":{"_id":"1"}}
{"name":"Jone"}
{"index":{"_id":"2"}}
{"name":"Jack"}
1){"index":{"_id":"1"}}:index表示动作action,这里表示索引,索引就是保存操作,_id:1,表示给该条数据指定id
注意:action也可以是delete(删除)、create(创建)等
2){"name":"Jone"}:name表示要保存的数据
两行确定一条数据
注意:因为这里是多行数据,在postman中没办法测试,所以需要使用kibana
例如:
使用kibana批量操作
1)点击左下角的展开按钮,如图:
2)选择Dev Tools
3)在工具中输入命令,如图:
POST 表示发送的是post请求 后面紧跟着请求URI
下面跟着批量数据
4)点击绿色的三角,执行命令
如图:
注意:
took:表示花费了125ms
items:表示创建的数据集合,每一条数据都是独立操作存在的,某一条数据的失败,不会影响到其他数据的成功与否
1.6.2 对整个ES进行批量操作
请求:POST
URL:/_bulk
语法格式:
{action:{metadata}}
{request body }
{action:{metadata}}
{request body }
例如:http://192.168.56.10:9200/_bulk
// 删除操作:删除索引为website 类型为blog id为123的数据
{"delete":{"_index":"website","_type":"blog","_id":"123"}}
// 创建操作:创建索引为website 类型为blog id为123的数据
{"create":{"_index":"website","_type":"blog","_id":"123"}}
{"title": "My first blog post"} // 这里是创建操作真正的类型
// 也是保存记录
{"index":{"_index":"website","_type":"blog"}}
{"title": "My second blog post"} // 这里是创建操作真正的类型
// 更新记录
{"update":{"_index":"website","_type":"blog","_id":"123"}}
{"doc":{"title":"My updated blog post"}} // 更新的真正的内容
在Kibana上执行如下图:
在上面的批量操作中,第一条语句是delete删除动作,但是,es中无此数据,所以bulk会返回该动作会失败,如图:
结论:bulk API 依次按顺序执行所有的action(动作),如果一个单个的动作因任何原因而失败,它将继续处理它后面剩余的动作。当bulk API返回时,它将提供每个动作的状态(与发送的顺序相同),所以,我们可以检查是否一个指定的动作是不是失败了