本文主要是介绍 ElasticSearch 的文档增删改查和批量操做,同时会介绍一些 REST API 返回状态码的具体含义。html
咱们先来看下这个表:网络
这个表包含了 Index、Create、Read、Update、Delete 这五种方法,咱们先来看下 CRUD 操做的 HTTP 请求都长什么样子?elasticsearch
首先是提供一个 HTTP 的 method,后面是索引名字,在 7.0 以后因此的 Type 都用 _doc
表示,后面是文档 id。ide
再简单了解了 CURD 操做的 HTTP 请求后,那么让咱们先来了解下如何建立文档:函数
Create 支持两种方式,一种是指定文档 id 建立文档,像上面这张图就是;另外一种是经过调用 post /users/_doc
去让 ES 自动生成文档 id。post
本身指定文档 id建立文档,须要考虑 id 的均衡性,避免产生分配不均衡的问题。 ES 的 hash 函数会确保文档 id 被均匀分配到不一样的分片。性能
当咱们执行刚才的命令,能够返回以下结果:ui
其中 _version
每一次操做,都会 + 1,它是一个锁的机制,当并行修改文档的时候,更新的版本号比文档当前的版本号小时就会报错,不容许作修改。3d
建立文档时,若是索引不存在,ES 会自动建立对应的 index 和 type。code
接下来看下另外一种建立文档的方式,不指定 id 建立文档,HTTP 请求也变为了 POST,具体的请求以下:
返回的结果以下:
Index 和 Create 区别为:若是文档不存在,就索引新的文档,不然现有文档就会被删除,新的文档被索引,版本信息 _version
+ 1。
Get 方法比较简单,只须要 Get 索引名称/_doc/文档 id
,经过执行这个命令就能够知道文档的具体信息了。
当执行这条语句后会返回 HTTP 200,具体返回结果以下:
其中 _index
为索引,_type
为类型,_id
为文档 id,_version
为版本信息,_source
存储了文档的完整原始数据。
当查询的文档 id 不存在的时候,会返回 HTTP 404,且 found
为 false
,具体结果以下:
Update 方法采用 HTTP POST,在请求体中必须指明 doc,在把具体文档提供在 HTTP 的 body 里。Update 和 Index 方法不一样,Update 方法不会删除原来的文档,而是实现真正的数据更新。
好比在原来的文档 id 为 1 的文档上增长字段,具体请求以下:
执行后,版本信息 _version
+ 1,让咱们再去查询下该文档:
能够看到,新增字段已经成功了。
Delete 方法也很简单,Delete 索引名称/_doc/文档 id
就能够了,再这里就再也不作代码演示了。
在介绍完文档的基本 CRUD 操做后,让咱们来看看批量操做吧:
在一个 REST 请求中,从新创建网络开销是十分损耗性能的,所以 ES 提供 Bulk API,支持在一次 API 调用中,对不一样的索引进行操做,从而减小网络传输开销,提高写入速率。
它支持 Index
、Create
、Update
、Delete
四种类型操做,能够在 URI 中指定索引,也能够在请求的方法体中进行。
同时多条操做中若是其中有一条失败,也不会影响其余的操做,而且返回的结果包括每一条操做执行的结果。
好比输入以下代码:
当咱们执行命令后,结果以下:
took
表示消耗了 93 毫秒,errors
为 true
表示在这些操做中错误发生,发现是 update 操做发生了错误,id 为 2 的文档不存在,因此报错了。
在使用 Bulk API 的时候,当 errors
为 true
时,须要把错误的操做修改掉,防止存到 ES 的数据有缺失。
批量查询须要指明要查询文档的 id,能够在一个 _mget
操做里查询不一样索引的数据,能够减小网络链接所产生的开销,提升性能。
下面咱们来实际操做下,输入如下代码执行,就能够获得文档 id 为 1,3 的数据。
运行结果以下:
在介绍完文档的一些操做,最后让咱们看下 REST API 常见错误返回有哪些吧!
刚才在演示中,当查询文档 id 不存在的时候就会报 404 错误,并且 ES 还有各类各样的返回,下面经过一个表格了解下:
本文主要介绍了文档的 CRUD 操做,还有 Bulk API、_mget API,这些批量操做能够提升 API 调用性能,可是不要一次发送过多数据,也有可能会对 ES 集群产生过大的压力,致使性能有所降低。通常建议是 1000-5000 个文档,若是你的文档很大,能够适当减小队列,大小建议是 5-15 MB,默认不能超过 100 M。
参考文献
Elastic Stack从入门到实践
Elasticsearch顶尖高手系列
Elasticsearch核心技术与实战
https://www.elastic.co/guide/en/elasticsearch/reference/7.1/docs-index_.html