ElasticSearch文档批量操作

批量查询 - msearch

POST users/_msearch
{}
{"query": {"match_all" : {}}, "from" : 0,"size" : 10}
{}
{"query" : {"match_all" : {}}}
{"index" : "twitter2"}
{"query" : {"match_all" : {}}}

常见错误返回

问题 原因
无法连接 网络故障或集群挂了
连接无法关闭 网络故障或节点出错
429 集群过于繁忙
4xx 请求体格式有错
500 集群内部错误

批量获取 - MGET

为了更快更迅速的同时检索多个文档,可以减少网络连接所产生的开销,提高性能

mget api参数是一个docs数组,数组的每个节点定义一个文档的_index _type _id元数据

  1. 先新建一个库
curl -XPUT 'http://master:9200/test2/'
curl -H "Content-Type: application/json" -XPOST http://10.135.73.73:9201/test2/user/1 -d \
'{
    "name" : "marry",
    "age" : 16
 }'
 curl -H "Content-Type: application/json" -XGET http://10.135.73.73:9201/_mget?pretty -d \
 '{
      "docs":[
          {"_index":"test","_type":"user","_id":2,"_source":"name"},
          {"_index":"test2","_type":"user","_id":1}
      ]
 }'
  1. 如果需要的文档在同一个_index或者同一个_type中, 你就可以在URL中指定一个默认的/_index或者/_index/_type。
curl -H "Content-Type: application/json" -XGET http://10.135.73.73:9201/test/user/_mget?pretty -d \
'{
    "docs":[{"_id":3},{"_id":4}] 
}'
  1. 如果所有的文档拥有相同的_index 以及 _type, 直接在请求中添加ids的数组即可。
curl -H "Content-Type: application/json" -XGET http://10.135.73.73:9201/test/user/_mget?pretty -d \
'{
    "ids":["3","4"]
 }'

ES批量操作 - bulk

es 中通过 Bulk API 可以执行批量索引、批量删除、批量更新等操作。

  • 支持在一次API调用中,对不同的索引进行操作
  • bulk API可以帮助我们同时执行多个请求, 为了实现多个文档的create、index、update或delete
  • 可以在URI中指定Index,也可以在请求的Payload中进行
  • 操作中单条操作失败,并不会影响其他操作
  • 返回结果包含了每一条操作执行的结果

格式

action: index/create/update/delete
metadata: _index,_type,_id
request body: _source(删除操作不需要)
                { action: { metadata }}
                { request body }
                { action: { metadata }}
                { request body }
action(行为) 解释
create 当文档不存在时创建
index 创建新文档或替换已有文档
update 局部更新文档
delete 删除一个文档

首先需要将所有的批量操作写入一个 JSON 文件中,然后通过 POST 请求将该 JSON 文件上传并执行。

例如新建一个名为 aaa.json 的文件,内容如下:

{"index":{"_index":"user","_id":"666"}}
{"name":"javaboy"}
{"update":{"_index":"user","_id":"666"}}
{"doc":{"name":"javeboy666"}}

首先第一行:index 表示要执行一个索引操作(这个表示一个 action,其他的 action 还有 create,delete,update)。_index 定义了索引名称,这里表示要创建一个名为 user 的索引,_id 表示新建文档的 id 为 666。

第二行是第一行操作的参数。

第三行的 update 则表示要更新。

第四行是第三行的参数。

注意,结尾要空出一行。

aaa.json 文件创建成功后,在该目录下,执行请求命令,如下:

curl -XPOST "http://localhost:9200/user/_bulk" -H "content-type:application/json" --data-binary @aaa.json

执行完成后,就会创建一个名为 user 的索引,同时向该索引中添加一条记录,再修改该记录,最终结果如下:

GET user/_doc/_search

# 结果
{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "user",
        "_type" : "_doc",
        "_id" : "666",
        "_score" : 1.0,
        "_source" : {
          "name" : "javeboy666"
        }
      }
    ]
  }
}
1. create 和index的区别

如果数据存在, 使用create操作失败, 会提示文档已经存在, 使用index则可以成功执行。

使用文件的方式,新建一个requests文件

vi requests
{"index":{"_index":"test","_type":"user","_id":"6"}}
{"name":"mayun","age":51}
{"update":{"_index":"test","_type":"user","_id":"6"}}
{"doc":{"age":52}}

执行批量操作

curl -H "Content-Type: application/json" -XPOST http://master:9200/_bulk --data-binary @requests;
curl -XGET http://master:9200/test/user/6?pretty
2. bulk请求可以在URL中声明/_index 或者/_index/_type.
3. bulk一次最大处理多少数据量
  • bulk会把将要处理的数据载入内存中, 所以数据量是有限制的.

  • 最佳的数据量不是一个确定的数值, 它取决于你的硬件,你的文档大小以及复杂性, 你的索引以及搜索的负载.

  • 一般建议是 1000-5000 个文档, 如果你的文档很大, 可以适当减少队列, 大小建议是 5-15MB, 默认不能超过 100M, 可以在es的配置文件中修改这个值http.max_content_length: 100mb.

posted @ 2021-04-08 09:19  临江仙我亦是行人  阅读(342)  评论(0编辑  收藏  举报