在使用 Elasticsearch 的时候,一定会遇到这种场景——希望批量的导入数据,而不是一条一条的手动导入。那么此时,就一定会需要 bulk 命令!
bulk 批量导入
批量导入可以合并多个操作,比如 index,delete,update,create 等等。也可以帮助从一个索引导入到另一个索引。
语法大致如下;
- action_and_meta_data\noptional_source\naction_and_meta_data\noptional_source\n....action_and_meta_data\noptional_source\n
需要注意的是,每一条数据都由两行构成(delete 除外),其他的命令比如 index 和 create 都是由元信息行和数据行组成,update 比较特殊它的数据行可能是 doc 也可能是 upsert 或者 script, 如果不了解的朋友可以参考前面的 update 的翻译。
注意,每一行都是通过 \ n 回车符来判断结束,因此如果你自己定义了 json,千万不要使用回车符。不然_bulk 命令会报错的!
一个小例子
比如我们现在有这样一个文件,data.json:
- {
- "index": {
- "_index": "test",
- "_type": "type1",
- "_id": "1"
- }
- } {
- "field1": "value1"
- }
它的第一行定义了_index,_type,_id 等信息;第二行定义了字段的信息。
然后执行命令:
- curl -XPOST localhost:9200/_bulk --data-binary @data.json
然后可以在 ElasticSearch 中查看是否导入成功.
对于其他的 index,delete,create,update 等操作也可以参考下面的格式:
- {
- "index": {
- "_index": "test",
- "_type": "type1",
- "_id": "1"
- }
- } {
- "field1": "value1"
- } {
- "delete": {
- "_index": "test",
- "_type": "type1",
- "_id": "2"
- }
- } {
- "create": {
- "_index": "test",
- "_type": "type1",
- "_id": "3"
- }
- } {
- "field1": "value3"
- } {
- "update": {
- "_id": "1",
- "_type": "type1",
- "_index": "index1"
- }
- } {
- "doc": {
- "field2": "value2"
- }
- }
在 Url 中设置默认的 index 和 type
如果在路径中设置了 index 或者 type,那么在 JSON 中就不需要设置了。如果在 JSON 中设置,会覆盖掉路径中的配置。
比如上面的例子中,文件中定义了索引为 test, 类型为 type1;而我们在路径中定义了默认的选项,索引为 test333, 类型为 type333。执行命令后,发现文件中的配置会覆盖掉路径中的配置。这样也提供了统一的默认配置以及个性化的特殊配置的需求。
其他
由于 bulk 是一次性提交很多的命令,它会把这些数据都发送到一个节点,然后这个节点解析元数据(index 或者 type 或者 id 之类的),然后分发给其他的节点的分片,进行操作。
由于很多命令执行后,统一的返回结果,因此数据量可能会比较大。这个时候如果使用的是 chunk 编码的方式,分段进行传输,可能会造成一定的延迟。因此还是对条件在客户端进行一定的缓冲,虽然 bulk 提供了批处理的方法,但是也不能给太大的压力!
最后要说一点的是,Bulk 中的操作执行成功与否是不影响其他的操作的。而且也没有具体的参数统计,一次 bulk 操作,有多少成功多少失败。
就爱阅读 www.92to.com 网友整理上传, 为您提供最全的知识大全, 期待您的分享,转载请注明出处。
来源: