не удается разрешить символ [строка] при использовании updateByQuery с ElasticSearch

У меня следующая установка:

отображение:

      esClient.indices.putMapping({
  index: 'tests',
  body: {
    properties: {
      name: {
        type: 'text',
      },
      lastName: {
        type: 'text',
      },
    },
  },
});

это результат, когда я публикую запись:

это результат, когда я запрашиваю записи:

      curl -X GET "localhost:9200/tests/_search?pretty" -H 'Content-Type: application/json' -d'       
{
"size": 1000,
"query" : {
    "match_all" : {}
  }
}
'
{
  "took" : 18,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "tests",
        "_type" : "_doc",
        "_id" : "KJbtj3kBRlqnip7VJLLI",
        "_score" : 1.0,
        "_source" : {
          "lastName" : 1,
          "name" : "lucas"
        }
      }
    ]
  }
}

Я попытался обновить фамилию записи следующим завитком:

      curl -X POST "localhost:9200/tests/_update_by_query?pretty" -H 'Content-Type: application/json' -d'
{
  "script": {
    "source": "ctx._source.lastName='johnson'",
    "lang": "painless"
  },
  "query": {
    "term": {
      "name": "lucas"
    }
  }
}
'

И ЭТО ОШИБКА, КОТОРАЯ ПОЛУЧИЛА:

          {
  "error" : {
    "root_cause" : [
      {
        "type" : "script_exception",
        "reason" : "compile error",
        "script_stack" : [
          "ctx._source.lastName=johnson",
          "                     ^---- HERE"
        ],
        "script" : "ctx._source.lastName=johnson",
        "lang" : "painless",
        "position" : {
          "offset" : 21,
          "start" : 0,
          "end" : 28
        }
      }
    ],
    "type" : "script_exception",
    "reason" : "compile error",
    "script_stack" : [
      "ctx._source.lastName=johnson",
      "                     ^---- HERE"
    ],
    "script" : "ctx._source.lastName=johnson",
    "lang" : "painless",
    "position" : {
      "offset" : 21,
      "start" : 0,
      "end" : 28
    },
    "caused_by" : {
      "type" : "illegal_argument_exception",
      "reason" : "cannot resolve symbol [johnson]"
    }
  },
  "status" : 400
}

Если я помещаю целое число вместо строки, оно обновляется, в противном случае я продолжаю получать эту ошибку.

Большое спасибо за твою помощь.

2 ответа

Вам нужно окружить новое значение поля lastName с помощью .

Я столкнулся с аналогичной проблемой, и я решил, добавив" "вместо' '. Моя версия ES 8.4.

ЗАПРОС.

       

    curl -X POST "localhost:9200/tests/_update_by_query?pretty" -H 'Content-Type: application/json' -d'
    {
      "script": {
        "source": "ctx._source.lastName=\"johnson\"",
        "lang": "painless"
      },
      "query": {
        "term": {
          "name": "lucas"
        }
      }
    }
    '

Вам нужно окружить новое lastName значение поля с ' '.

Добавление рабочего примера

Данные индекса:

      {
    "name":"lucas",
    "lastName":"erla"
}

Запрос:

      POST _update_by_query
{
  "script": {
    "source": "ctx._source.lastName='johnson'",
    "lang": "painless"
  },
  "query": {
    "term": {
      "name": "lucas"
    }
  }
}

После обновления по API запроса документ будет обновлен до

      GET /_doc/1

{
  "_index": "67641538",
  "_type": "_doc",
  "_id": "1",
  "_version": 3,
  "_seq_no": 2,
  "_primary_term": 1,
  "found": true,
  "_source": {
    "lastName": "johnson",
    "name": "lucas"
  }
}
Другие вопросы по тегам