_cat
以下所有请求使用GET方式发送
/_cat/nodes
查看所有节点
http://192.168.2.190:9200/_cat/nodes

/_cat/health
查看ES健康状况
http://192.168.2.190:9200/_cat/health

/_cat/master
查看主节点信息
http://192.168.2.190:9200/_cat/master
/_cat/indicies
查看所有索引,也就是mysql中的show databases
http://192.168.2.190:9200/_cat/indices

索引一个文档
保存一条数据,保存在哪个索引的哪个类型下,指定用哪个唯一标识。
PUT 请求
请求方式:PUT
http://192.168.2.190:9200/customer/external/1

带_的这些字段,我们称为元数据,反映了一些当前的基本信息
结果分析
// 返回的这些结果,是当前数据的一些基本信息{"_index": "customer", // 哪个索引(数据库)下"_type": "external", // 哪个类型(表)下"_id": "1", // id"_version": 1, // 版本,第一次是1,每执行一次版本就会+1"result": "created", // 保存的结果,第一次是created,以后再执行就会变成updated"_shards": { // 分片,集群的时候会用到"total": 2,"successful": 1,"failed": 0},"_seq_no": 0,"_primary_term": 1}
- PUT方式,必须要带id,不带id会报错
- 第一次是新增操作,再往后则是更新
POST 请求
请求方式:POST
http://192.168.2.190:9200/customer/external/

- POST方式,可以携带id,也可以不携带id
- 不携带id的话,每一次都是新增,系统会自动为其指定一个唯一id
- 携带id的话,它的作用与PUT一样,第一次是新增,再往后则是更新
查看文档
/index/type/id
请求方式:GET
http://192.168.2.190:9200/customer/external/1
结果分析
{"_index": "customer","_type": "external","_id": "1","_version": 3,"_seq_no": 2, // 并发控制的字段,用来做乐观锁操作,只要这个数据有变化,这个值就会往上加"_primary_term": 1, // 用来做乐观锁操作,分片发生变化,集群的时候会用到"found": true, // 表示找到了这个数据"_source": { // 这个数据的真正内容"name": "John Doe"}}
乐观锁
携带?if_seq_no=当前的值&if_primary_term=当前的值
假设有A、B两个请求,A要将id为1的数据修改为”AAA”,B要将id为1的数据修改为”BBB”,如果不加乐观锁的话,即使有一方先修改成功了,那么后执行的另一方也会覆盖掉它的修改,为了解决这个问题,Elasticsearch推荐使用乐观锁字段,来对更新操作进行控制。
发送请求时,只要提前获取到_seq_no的值,然后让两个请求都带着判断条件进行请求,就可以避免并发修改时的重复修改。
以上述结果为例,假设现在的_seq_no为2,如果A、B要修改id为1的值,就需要发送这样的请求
A:
请求:http://192.168.2.190:9200/customer/external/1?if_seq_no=2&if_primary_term=1
携带数据:
{"name": "AAA"}
B:
请求:http://192.168.2.190:9200/customer/external/1?if_seq_no=2&if_primary_term=1
携带数据:
{"name": "BBB"}
无论是A还是B谁先修改成功,都会使_seq_no发生变化,那么当另一个请求再次修改时,就会修改失败,因为_seq_no的值已经不再是之前的那个值了,如果另一个请求还想修改成功的话,就必须携带最新的_seq_no重新请求。
更新文档
/index/type/id/_update
请求方式:POST
请求地址:http://192.168.2.190:9200/customer/external/1/_update
请求体:
{"doc":{"name": "CCC"}}
结果分析
第一次执行
{"_index": "customer","_type": "external","_id": "1","_version": 13,"result": "updated","_shards": {"total": 0,"successful": 0,"failed": 0},"_seq_no": 19,"_primary_term": 1}
_version、_seq_no相较更新之前,都发生了变化,result更新成功
第二次执行
{"_index": "customer","_type": "external","_id": "1","_version": 13,"result": "noop","_shards": {"total": 0,"successful": 0,"failed": 0},"_seq_no": 19,"_primary_term": 1}
result的值变成了noop,而它的意思是没有做任何操作,其它值都没有发生变化
主要是因为POST这种更新方式,会对比原来的数据,如果与原来的一样,则不会进行任何操作。
几种更新文档的区别
携带_update,使用POST方式发送请求
- 请求体需要放到
doc里面 - 每次修改,都会对比原来的数据,如果与原来的一样,则不会进行任何操作,不一样,则进行修改。
不携带_update,使用POST、PUT方式请求
- 会直接修改
删除文档&索引
删除文档
请求方式:DELETE
请求地址:http://192.168.2.190:9200/customer/external/1
结果:
{"_index": "customer","_type": "external","_id": "1","_version": 16,"result": "deleted", # 已删除"_shards": {"total": 2,"successful": 1,"failed": 0},"_seq_no": 22,"_primary_term": 1}
删除索引
请求方式:DELETE
请求地址:http://192.168.2.190:9200/customer
结果:
{"acknowledged": true}
bulk-批量操作数据
语法格式:
{action:{metadata}} // 例如index保存记录,update更新{request body }{action:{metadata}}{request body }
指定索引和类型的批量操作
POST /customer/external/_bulk{"index":{"_id":"1"}}{"name":"John Doe"}{"index":{"_id":"2"}}{"name":"John Doe"}
在Kibana中使用dev-tools测试批量操作数据:

对所有索引执行批量操作
POST /_bulk{"delete":{"_index":"website","_type":"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"}}
分别进行了:删除、创建、保存、更新的操作
结果:
结论
- 这里的批量操作,即使某一个操作执行失败,也不会影响其他操作,它们彼此之间是独立的。
