Вставьте отсутствующий документ во время _update_by_query - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть отображение с 2 полями: сообщение + вес.
«Сообщение» уникально для каждого документа.
Я должен увеличивать «вес» каждый раз при получении документа.
Если не найдено, я должен вставить новый документ со значениями по умолчанию.

Есть ли способ автоматически вставить документ, если он не найден, во время выполнения _update_by_query?

POST /testindex/_update_by_query?conflicts=proceed
{
    "script": {
        "inline": "ctx._source.weight++",
        "lang": "painless"
    },
    "query": {
        "match": {
            "message": "iphone"
        }
    }
}

Мне нужно, чтобы он работал как SQL: INSERT… ON DUPLICATE KEY UPDATE

1 Ответ

0 голосов
/ 06 сентября 2018

Поскольку ваше поле message уникально для всех документов, вы можете использовать его в качестве идентификатора документа. Это позволит вам использовать Update API и, в частности, функцию upsert.

По сути, вы можете обновить документ (с шагом weight) и, если он не существует, он будет создан (с помощью weight: 1):

POST testindex/_doc/iphone/_update
{
    "script" : {
        "source": "ctx._source.weight++",
        "lang": "painless"
    },
    "upsert" : {
        "weight" : 1
    }
}
...