Я использую ElasticSearch Обновить действие с Upserts , чтобы создать или обновить существующий документ в текущем индексе, когда выполняю в массовых API, как это
{
index: myIndex,
type: '_doc',
body: [
{ index: {_id: docItemID1 } },
docItem1,
{ index: {_id: docItemID2 } },
docItem2
]
}
Это работает нормально.Теперь я хотел бы обновить / добавить новое значение в поле tag
в элементе документа, используя флаг scripted_upsert
и действие обновления script
, примерно так:
{
"scripted_upsert":true,
"script" : {
"source": "if ( !ctx._source.tags.contains(params.tag) ) ctx._source.tag.concat( params.tag)",
"lang": "painless",
"params" : {
"tag" : "blue"
}
},
"upsert" : {
"tag" : ["red","green"]
}
}
Теперь яхочу использовать scripted_upsert
, чтобы взять лучшее из двух миров, поэтому я представляю что-то вроде этого - если это правильно (это мой вопрос)
{
"script" : {
"source": "if ( !ctx._source.tags.contains(params.tag) ) ctx._source.tag.concat( params.tag)",
"lang": "painless",
"params" : {
"tag" : myNewTag
}
},
"upsert" : docItem
}
, где docItem
будет содержать tag
элемент для обновления.Этот тег представляет собой список тегов через запятую, например red,green
.
Правильный ли этот подход?Если да, то каково правильное тело для API bulk
, то есть при использовании body
в качестве []
действий, имеющих обновление script
с флагом плюс scripted_upsert
для одного или нескольких элементов?