ElasticSearch, добавление значения в поле, но сначала проверьте, существует ли поле, если не создать поле, затем добавьте

Я пытаюсь динамически добавлять новое поле типа массива в документы по мере необходимости. Если поле уже существует (т. Е. Кто-то уже добавил элемент в массив), добавьте мой элемент. Если он не существует, мне нужно создать поле, а затем добавить мой элемент.

В настоящее время я могу добавить только в том случае, если я сначала создам поле, но то, как я его написал, перезаписывает существующие значения поля, если они есть.

# Create the field, not ideal as it wipes the field if it existed already

        es.update(
            index='index_name',
            id='doc_id_987324bhashjgbasf',
            body = {"doc": {
                'notes': []}})

# Append my value
    es.update(index='index_name', id='doc_id_987324bhashjgbasf',
              body = {
                  "script": {
                      "source": "ctx._source.notes.addAll(params.new_note)",
                      "lang": "painless",
                      "params": {
                          "new_note": [{'note': 'Hello I am a note', 'user':'Ari'}]
                      }
                  }
              })

В идеале процесс, который я хотел бы,

  1. Проверьте, существует ли поле «примечания»
  2. Если он существует, добавьте новое значение к существующим значениям.
  3. Если его не существует, создайте поле, а затем добавьте мое значение
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
955
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

журнал:

if [notes] {
    notes.add("NewItem");
} else {
   notes = new ArrayList();
   notes.add("NewItem");
}

эластичный поиск:

"script": "if (ctx._source.containsKey(\"notes\")) {ctx._source.notes += value;} else {ctx._source.notes = [value]}"

Другие вопросы по теме