ES作为一个检索、存储、分析的引擎,其将所有的操作都以restful api的方式实现
1._cat查询ES的信息
http://192.168.254.128:9200/_cat/nodes | 查看所有节点 | ![]() |
http://192.168.254.128:9200/_cat/health | 查看健康状况 | ![]() |
http://192.168.254.128:9200/_cat/master | 查看主节点 | ![]() |
http://192.168.254.128:9200/_cat/indices | 查看所有索引 | ![]() |
2.向ES中索引(保存)一个文档
相当于关系型数据库的insert操作,在向ES保存数据时,我们需要指定保存在哪个索引的哪个类型下,指定用哪个唯一标识
例如:在customer索引下的external保存1号数据
PUT customer/external/1 |
{ "name":"bigbear" } |
PUT和POST都可以,区别在于: POST新增时,如果不指定id,会自动生成id,指定id就会修改这个数据,并且新增版本号。 PUT可以新增可以修改,PUT必须指定id,由于PUT必须要指定id,我们一般用来做修改操作,不指定id会报错。 |
可以看到数据的result为create(新增),当再发送这个请求时,result将会变为update,且版本号有叠加,当PUT请求我们不带id,ES返回405
当使用POST请求时,我们未指定id,id为自动生成
3.查询文档
当我们查询正确的索引的类型的id时,found字段为true,并给我们返回了数据,但是当我们查询不存在的id时,found字段为false,如果不带id去查询,则返回405
查询返回字段说明:
{
"_index": "customer", // 在哪个索引
"_type": "external", // 在哪个类型
"_id": "1", // 记录id
"_version": 2, // 版本号
"_seq_no": 1, // 并发控制字段,每次更新会+1,用来做乐观锁
"_primary_term": 1, // 同上,主分片重新分配,如重启,就会变化
"found": true,
"_source": {
"name": "bigbear"
}
}
当A、B、C都向ES发送请求要修改数据时,修改时,我们可以根据_seq_no看是否满足修改条件,比如3个请求都想修改_seq_no为1时的数据,如果ES先处理了某个请求,这时候的_seq_no就会叠加,当别的请求再想修改数据时,_seq_no已经不是1了,所以不会修改数据,这样就能达到并发控制效果。
我们模拟多个请求修改数据,当_seq_no为1时修改数据
现在_seq_no是1,满足修改条件
发起请求修改数据http://192.168.254.128:9200/customer/external/1?if_seq_no=1&if_primary_term=1,修改成功后,_seq_no叠加
当再次发起请求,则会返回异常,因为上一个请求修改成功后,_seq_no已经叠加
4.更新文档
POST /customer/external/1/_update { |
或者 POST /customer/external/1 {"name":"tingting"}
或者 PUT /customer/external/1 |
_update的形式更新时,参数必须要doc属性,修改成功时,result为updated
当我们再次以POST _update方式更新文档时,result为noop(即无操作)。_update方式更新时,会对比原数据,如果修改数据与原数据一样,则ES不做操作,_version和_seq_no不会叠加
当以POST或PUT请求更新文档时,不会比对原数据,每次都会时update操作,_seq_no和_version都会叠加
5.删除文档或索引
DELETE /customer/external/1 |
DELETE /customer |
ES只有删除文档或索引操作,未提供删除类型操作,当我们删除了文档之后,result为deleted,再发送请求去删除文档时,result为not_found。再查询文档时,会返回404状态码。
删除索引后,如果再查询文档,则会返回404状态码,且返回异常信息
6.批量操作
POST /customer/external/_bulk {"index":{"_id":1}} {"name":"Jony"}
{"index":{"_id":2}} {"name":"candy"} |
复杂实例 POST /_bulk |
由于批量操作用postman不太好测试,我们将使用kibana的dev tools测试
ES批量添加数据,数据的添加是独立的,即使失败也不会影响其他数据的添加,这与关系型数据库的事务有区别
这里添加了两个文档,所以items数组有两个对象
复杂操作我们做了4个操作,因此items有4个对象
ES官方给出一份测试数据
https://github.com/elastic/elasticsearch/edit/master/docs/src/test/resources/accounts.json
我们可以copy出来做学习使用