弹性 - 批量上传:索引 x 更新
Elastic - Bulk upload: index x update
我有 2 个不同的批量上传要执行,每个上传的顺序完全无法预测
在一次加载中,我将拥有以下字段:SERVER_NAME
、OS
和 PROD_1_VERSION
在另一个中,我会有以下字段:SERVER_NAME
、OS
和 PROD_2_VERSION
我的文件如下所示:
{"index":{"_index" : "myindex", "_id" : "MY_SERVER_1" }}
{"SERVER_NAME":"MY_SERVER_1","OS":"Ubuntu","PROD_1_VERSION":"1.0.0.5" }
{"index":{"_index" : "myindex", "_id" : "MY_SERVER_2" }}
{"SERVER_NAME":"MY_SERVER_2","OS":"Windows10","PROD_1_VERSION":"2.0.0.0" }
{"index":{"_index" : "myindex", "_id" : "MY_SERVER_3" }}
{"SERVER_NAME":"MY_SERVER_3","OS":"Fedora","PROD_1_VERSION":"2.5.0.1" }
和:
{"index":{"_index" : "myindex", "_id" : "MY_SERVER_1" }}
{"SERVER_NAME":"MY_SERVER_1","OS":"Ubuntu","PROD_2_VERSION":"6.0.0.5" }
{"index":{"_index" : "myindex", "_id" : "MY_SERVER_2" }}
{"SERVER_NAME":"MY_SERVER_2","OS":"Windows10","PROD_2_VERSION":"7.0.0.0" }
{"index":{"_index" : "myindex", "_id" : "MY_SERVER_3" }}
{"SERVER_NAME":"MY_SERVER_3","OS":"Fedora","PROD_2_VERSION":"8.5.0.1" }
- 如果我按给定的顺序执行加载,并使用
"index"
,将添加 属性 "PROD_2_VERSION"
,但 "PROD_1_VERSION"
将丢失
- 如果我修改它,并使用
"update"
而不是 "index"
(包括属性之前的 { "doc" : ... }
),第一次加载会失败,因为它会尝试更新不更新的内容还存在
- 如果第一个加载
"index"
并且第二个加载 "update"
它可以工作,但是,如前所述,无法控制每个加载的顺序。
有没有办法让它像这样工作:
if record exit,
use behave like 'index'
else
behave like 'update'
???
我不确定是否完全理解您的用例。但是要在弹性搜索中批量执行“upsert”(插入或更新),您必须添加
"doc_as_upsert" : true
在您的文档部分之后。
这里是official elasticsearch's documentation的例子:
{ "update" : {"_id" : "2", "_index" : "index1", "retry_on_conflict" : 3} }
{ "doc" : {"field" : "value"}, "doc_as_upsert" : true }
我有 2 个不同的批量上传要执行,每个上传的顺序完全无法预测
在一次加载中,我将拥有以下字段:SERVER_NAME
、OS
和 PROD_1_VERSION
在另一个中,我会有以下字段:SERVER_NAME
、OS
和 PROD_2_VERSION
我的文件如下所示:
{"index":{"_index" : "myindex", "_id" : "MY_SERVER_1" }}
{"SERVER_NAME":"MY_SERVER_1","OS":"Ubuntu","PROD_1_VERSION":"1.0.0.5" }
{"index":{"_index" : "myindex", "_id" : "MY_SERVER_2" }}
{"SERVER_NAME":"MY_SERVER_2","OS":"Windows10","PROD_1_VERSION":"2.0.0.0" }
{"index":{"_index" : "myindex", "_id" : "MY_SERVER_3" }}
{"SERVER_NAME":"MY_SERVER_3","OS":"Fedora","PROD_1_VERSION":"2.5.0.1" }
和:
{"index":{"_index" : "myindex", "_id" : "MY_SERVER_1" }}
{"SERVER_NAME":"MY_SERVER_1","OS":"Ubuntu","PROD_2_VERSION":"6.0.0.5" }
{"index":{"_index" : "myindex", "_id" : "MY_SERVER_2" }}
{"SERVER_NAME":"MY_SERVER_2","OS":"Windows10","PROD_2_VERSION":"7.0.0.0" }
{"index":{"_index" : "myindex", "_id" : "MY_SERVER_3" }}
{"SERVER_NAME":"MY_SERVER_3","OS":"Fedora","PROD_2_VERSION":"8.5.0.1" }
- 如果我按给定的顺序执行加载,并使用
"index"
,将添加 属性"PROD_2_VERSION"
,但"PROD_1_VERSION"
将丢失 - 如果我修改它,并使用
"update"
而不是"index"
(包括属性之前的{ "doc" : ... }
),第一次加载会失败,因为它会尝试更新不更新的内容还存在 - 如果第一个加载
"index"
并且第二个加载"update"
它可以工作,但是,如前所述,无法控制每个加载的顺序。
有没有办法让它像这样工作:
if record exit,
use behave like 'index'
else
behave like 'update'
???
我不确定是否完全理解您的用例。但是要在弹性搜索中批量执行“upsert”(插入或更新),您必须添加
"doc_as_upsert" : true
在您的文档部分之后。
这里是official elasticsearch's documentation的例子:
{ "update" : {"_id" : "2", "_index" : "index1", "retry_on_conflict" : 3} }
{ "doc" : {"field" : "value"}, "doc_as_upsert" : true }