Причина ошибки Illegal list shortcut value


#1

Помогите понять причину ошибки Illegal list shortcut value

Ошибка
{
  "error": {
    "root_cause": [
      {
        "type": "script_exception",
        "reason": "runtime error",
        "script_stack": [
          "ctx._source.user.contact.id = 5;",
          "                ^---- HERE"
        ],
        "script": "ctx._source.user.contact.id = 5;",
        "lang": "painless"
      }
    ],
    "type": "script_exception",
    "reason": "runtime error",
    "script_stack": [
      "ctx._source.user.contact.id = 5;",
      "                ^---- HERE"
    ],
    "script": "ctx._source.user.contact.id = 5;",
    "lang": "painless",
    "caused_by": {
      "type": "illegal_argument_exception",
      "reason": "Illegal list shortcut value [contact]."
    }
  },
  "status": 500
}
Индекс
PUT my_index
{
  "mappings": {
    "doc": {
      "properties": {
        "user": {
          "type": "nested",
          "properties": {
            "contact": {
              "properties": {
                "id": {
                  "type": "integer"
                }
              }
            }
          }
        }
      }
    }
  }
}
Документ
PUT my_index/doc/1
{
  "user" : [
    {
      "contact" : {
        "id" : 1
      }
    }
  ]
}
Поиск и обновление
POST my_index/_update_by_query
{
  "script": {
    "lang": "painless",
    "source": "ctx._source.user.contact.id = 5;"
  },
  "query": {
    "nested": {
      "path": "user",
      "ignore_unmapped": true,
      "query": {
        "terms": {
          "user.contact.id": [
            1
          ]
        }
      }
    }
  }
}

(Igor Motov) #2

user - это массив, попробуйте так ctx._source.user[0].contact.id = 5


#3

Сработало.
Получается, что перед записью придётся сначало индекс узнать. Для индекса придётся пускать цикл.
В некоторых случаях может быть более глубокая вложенность(nested -> inner object -> nested), может есть более универсальный способ ?


(Igor Motov) #4

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

PUT my_index/doc/1
{
  "user": {
    "contact": {
      "id": 1
    }
  }
}

#5

Я думал, что эластик или java(которую я к сожалению не знаю) как-то сами разруливают ситуацию с массивами :slight_smile:
В моём случае, особеность в том, что у меня есть информация только о полном пути до конечного объекта. Хотел обойтись без циклов, а без них не получается :slight_smile:


(Igor Motov) #6

Во время операции updated, Json преобразуется в HashMap, но все массивы внутри него преобразуются в ArrayList. То есть с точки зрения индексации, разницы между

{
  "user": {
    "contact": {
      "id": 1
    }
  }
}

и

{
  "user" : [
    {
      "contact" : {
        "id" : 1
      }
    }
  ]
}

нет. Но для update, который работает на уровне исходного source, user в первом случае - HashMap, а во втором случае ArrayList.


(system) #7

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.