前面介绍说,Elasticsearch 都是通过 REST API 接口来操作数据的,那么下面接通过几个接口的请求来演示它的使用。(当前虚拟机IP为192.168.163.131)

_cat

1. /_cat/nodes:查看所有节点

接口:GET http://192.168.163.131:9200/_cat/nodes
image.png

2. /_cat/health:查看ES健康状况

接口:GET http://192.168.163.131:9200/_cat/health
image.png

3. /_cat/master:查看主节点信息

接口:GET http://192.168.163.131:9200/_cat/master
image.png

4. /_cat/indicies:查看所有索引

等价于 mysql 数据库的 show databases;

接口:GET http://192.168.163.131:9200/_cat/indices
image.png

索引一个文档

即保存一条数据,保存在哪个索引的哪个类型下,指定用哪个唯一标识。

1. PUT 请求

接口:PUT http://192.168.163.131:9200/customer/external/1
image.png

2. POST 请求

接口:POST http://192.168.163.131:9200/customer/external/
image.png
PUT和POST都可以

  • POST新增,如果不指定id,会自动生成id。指定id就会修改这个数据,并新增版本号;
  • PUT可以新增也可以修改。PUT必须指定id;由于PUT需要指定id,我们一般用来做修改操作,不指定id会报错。

    查看文档

    /index/type/id

    接口:GET http://192.168.163.131:9200/customer/external/1
    image.png ```json { “_index”: “customer”, # 在哪个索引(库) “_type”: “external”, # 在哪个类型(表) “_id”: “1”, # 文档id(记录) “_version”: 5, # 版本号 “_seq_no”: 4, # 并发控制字段,每次更新都会+1,用来做乐观锁 “_primary_term”: 1, # 同上,主分片重新分配,如重启,就会变化 “found”: true, “_source”: { # 数据
    1. "name": "zhangsan"
    } }

乐观锁更新时携带 ?_seq_no=0&_primary_term=1 当携带数据与实际值不匹配时更新失败

  1. <a name="rsHWh"></a>
  2. # 更新文档
  3. <a name="wXVQE"></a>
  4. ## /index/type/id/_update
  5. 接口:`POST http://192.168.163.131:9200/customer/external/1/_update`<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/12568777/1615345823323-a4869fd9-d54d-461a-bcf2-77046a9f1970.png?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_39%2Ctext_RXDmtYHoi48%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10#height=638&id=hC4LU&margin=%5Bobject%20Object%5D&name=image.png&originHeight=1275&originWidth=1373&originalType=binary&ratio=1&size=131084&status=done&style=none&width=686.5)
  6. <a name="6xvF1"></a>
  7. ## 几种更新文档的区别
  8. 在上面索引文档即保存文档的时候介绍,还有两种更新文档的方式:
  9. - 当PUT请求带id,且有该id数据存在时,会更新文档;
  10. - 当POST请求带id,与PUT相同,该id数据已经存在时,会更新文档;
  11. 这两种请求类似,即带id,且数据存在,就会执行更新操作。<br />类比:
  12. - 请求体的报文格式不同,_update方式要修改的数据要包裹在 doc 键下
  13. - _update方式不会重复更新,数据已存在不会更新,版本号不会改变,另两种方式会重复更新(覆盖原来数据),版本号会改变
  14. - 这几种方式在更新时都可以增加属性,PUT请求带id更新和POST请求带id更新,会直接覆盖原来的数据,不会在原来的属性里面新增属性
  15. <a name="8KuBb"></a>
  16. # 删除文档&索引
  17. <a name="XeBCt"></a>
  18. ## 删除文档
  19. 接口:`DELETE http://192.168.163.131:9200/customer/external/1`<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/12568777/1615355451681-013af65f-aa49-43bb-94e9-1e6fdad42791.png?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_38%2Ctext_RXDmtYHoi48%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10#height=471&id=YyvUs&margin=%5Bobject%20Object%5D&name=image.png&originHeight=942&originWidth=1342&originalType=binary&ratio=1&size=105008&status=done&style=none&width=671)
  20. <a name="jJFsr"></a>
  21. ## 删除索引
  22. 接口:`DELETE http://192.168.163.131:9200/customer`<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/12568777/1615355541689-70478b27-b1ec-4c06-a16c-f23b5b6552f1.png?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_39%2Ctext_RXDmtYHoi48%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10#height=281&id=HM9j5&margin=%5Bobject%20Object%5D&name=image.png&originHeight=561&originWidth=1361&originalType=binary&ratio=1&size=68919&status=done&style=none&width=680.5)
  23. <a name="Bk7yi"></a>
  24. # bulk-批量操作数据
  25. 语法格式:
  26. ```json
  27. {action:{metadata}}\n // 例如index保存记录,update更新
  28. {request body }\n
  29. {action:{metadata}}\n
  30. {request body }\n

1. 指定索引和类型的批量操作

接口:POST /customer/external/_bulk
参数:

  1. {"index":{"_id":"1"}}
  2. {"name":"John Doe"}
  3. {"index":{"_id":"2"}}
  4. {"name":"John Doe"}

在Kibana中使用dev-tools测试批量:
image.png

2. 对所有索引执行批量操作

接口:POST /_bulk
参数:

  1. {"delete":{"_index":"website","_type":"blog","_id":"123"}}
  2. {"create":{"_index":"website","_type":"blog","_id":"123"}}
  3. {"title":"my first blog post"}
  4. {"index":{"_index":"website","_type":"blog"}}
  5. {"title":"my second blog post"}
  6. {"update":{"_index":"website","_type":"blog","_id":"123"}}
  7. {"doc":{"title":"my updated blog post"}}

image.png

  • 这里的批量操作,当发生某一条执行发生失败时,其他的数据仍然能够接着执行,也就是说彼此之间是独立的。
  • bulk api以此按顺序执行所有的action(动作)。如果一个单个的动作因任何原因失败,它将继续处理它后面剩余的动作。
  • 当bulk api返回时,它将提供每个动作的状态(与发送的顺序相同),所以您可以检查是否一个指定的动作是否失败了。