Как сохранить вложенные объекты с динамическими c свойствами в Elasti c Поиск? - PullRequest
0 голосов
/ 06 февраля 2020

У меня есть документ вasticsearch, который выглядит следующим образом:

{
    "_index": "stats",
    "_type": "_doc",
    "_id": "1",
    "_score": 1.0,
    "_source": {
        "publishTime": {
            "lastUpdate": 1580991095131,
            "h0_4": 0,
            "h4_8": 0,
            "h8_12": 3,
            "h12_16": 5,
            "h16_20": 2,
            "h20_24": 1
        },
        "postCategories": {
             "lastUpdate": 1580991095131,
             "tech": 56,
             "lifestyle": 63,
             "healthcare": 49,
             "finances": 25,
         }
     }
 }

Обновление / Увеличение существующих значений свойств путем отправки запроса POST на /stats/_update/1 отлично работает! Однако, если я пытаюсь сохранить несуществующее имя свойства в postCategories, я получаю Bad Request (400) ошибку типа remote_transport_exception/illegal_argument_exception:

"ctx._source.postCategories.relationships += params.postCategories.relationships",
                                                                  ^---- HERE"

Upsert

{
    "script": {
        "source": "ctx._source.postCategories.relationships += params.postCategories.relationships",
        "lang": "painless",
        "params": {
            "postCategories": {
                "relationships": 2
            }
        }
    },
    "upsert": {
       "postCategories": {
            "relationships": 2
        }
    }
}

Я также попробовал метод Scripted Upsert, следуя документации здесь , однако возникает та же ошибка:

Scripted Upsert

{
    "scripted_upsert":true,
    "script": {
        "source": "ctx._source.postCategories.relationships += params.postCategories.relationships",
        "params": {
            "postCategories": {
                "relationships": 2
            }
        }
    },
    "upsert": {}
}

Может кто-нибудь сказать мне, как правильно добавить / вставить новые имена свойств в объект postCategories, пожалуйста?

Спасибо!

1 Ответ

1 голос
/ 06 февраля 2020

По сути, это говорит о том, что вы пытаетесь присвоить значение несуществующему полю. Я думаю, что ниже должно работать (не проверено).

Попробуйте проверить, существует ли поле - продолжите работу, если оно существует. Еще добавьте новое поле и присвойте значение.

"if (ctx._source.postCategories.containsKey(\"relationships\")) { ctx._source.postCategories.relationships += params.postCategories.relationships} else { ctx._source.postCategories[\"relationships\"] = params.postCategories.relationships}",
...