Обновление индекса с помощью скрипта в ElasticSearch Bulk JavaScript API - PullRequest
0 голосов
/ 20 ноября 2018

Я использую 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 для одного или нескольких элементов?

1 Ответ

0 голосов
/ 18 апреля 2019

Правильно, документы говорят :

Если вы хотите, чтобы ваш скрипт запускался независимо от того, существует документ или нет - [...] - затем установитеscripted_upsert в true

Таким образом, наличие разделов "upsert" и "script" - это путь, но вы должны сохранить "scripted_upsert":true (который отсутствует в последнем фрагменте).

Использование библиотекиasticsearch-js lib выглядит следующим образом:

await client.bulk({
  index: 'myIndex',
  type: 'myType',
  body [
    { update: { _id: docId } },
    { script: { source, params }, scripted_upsert: true, upsert: docItem },
  ],
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...