elasticsearch的bulk(批量)操作

水深无声 2024-02-19 18:36 183阅读 0赞

在es中我们可能会有这么一种需求,即有时需要批量向es中插入或更新或删除数据,如果一条一条数据的操作,那么速度必然很慢,那么es的bulk api就可以派上用场。

delete 删除操作,只需要写一个json即可
create 创建操作,如果需要创建的文档已经存在,那么创建失败
index 创建或替换操作,如果要创建的文档不存在则执行创建操作,如果已经存在则执行替换操作
update 更新操作 执行文档的更新

需求:
1、使用create创建编号为21、22、23的文档
2、使用create再次创建编号为22的文档,此时会失败,因为编号为22的文档已经存在
3、使用index创建编号为24、25的文档
4、使用index替换编号为25的文档
5、修改编号为21的文档的数据
6、删除编号为23的文档

  1. curl -XPOST "http://192.168.99.1:9200/_bulk" -d'
  2. {"create":{"_index":"productindex","_type":"product","_id":21}}
  3. {"name":"21 name","price":21}
  4. {"create":{"_index":"productindex","_type":"product","_id":22}}
  5. {"name":"22 name","price":22}
  6. {"create":{"_index":"productindex","_type":"product","_id":23}}
  7. {"name":"23 name","price":23}
  8. {"create":{"_index":"productindex","_type":"product","_id":22}}
  9. {"name":"id为22的文档已经存在,创建失败","price":22}
  10. {"index":{"_index":"productindex","_type":"product","_id":24}}
  11. {"name":"文档不存在,被创建","price":24}
  12. {"index":{"_index":"productindex","_type":"product","_id":25}}
  13. {"name":"21 name","price":25}
  14. {"index":{"_index":"productindex","_type":"product","_id":25}}
  15. {"name":"由于编号为25的文档已经存在,执行替换操作,price字段的值没有了"}
  16. {"update":{"_index":"productindex","_type":"product","_id":21}}
  17. {"doc":{"name":"修改编号为21的文档的数据,price字段的值还在"}}
  18. {"delete":{"_index":"productindex","_type":"product","_id":23}}
  19. '

执行结果,部分。
aHR0cDovL2RsMi5pdGV5ZS5jb20vdXBsb2FkL2F0dGFjaG1lbnQvMDEyNi81ODE4LzM5YzM5MWI2LTYzOWItMzM0Ni05M2FlLTJlNTJiODFhNDljOS5wbmc

批量执行完成之后,es会返回每个命令的执行的结果,其中一个命令报错,是不会影响其余的命令继续往下执行的。

在批量执行api下,每个json串需要占据一行,不可将json字符串格式化,否则执行不了。

bulk请求的请求体不建议太大,太大会影响性能。建议不要超过几十兆。如果出现索引队列不够用的时候,就需要调整threadpool.index.queue_size 的值。

发表评论

表情:
评论列表 (有 0 条评论,183人围观)

还没有评论,来说两句吧...

相关阅读