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元数据
- 先新建一个库
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}
]
}'
- 如果需要的文档在同一个_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}]
}'
- 如果所有的文档拥有相同的_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
.