Добавить новое поле во вложенный объект

Elasticsearch 2.3.3

Я не могу добавить новое поле в существующий документ через обновить API. Как я могу добавить это?

Ниже вы можете увидеть скрипт Elasticsearch Python API для обновления документа. Запрос на обновление назначается переменной query.

import pdb, json
from elasticsearch import Elasticsearch
from settings import *

def main():
    es = Elasticsearch(hosts = [{'host': es_hosts, 'port': es_port}], timeout = 60)

    query = {
        "script" : "ctx._source.Demographic_Details[0].Match = 1"
    }

    result = es.update(index = es_index, \
            id = "506GBBO25953J", doc_type = "User", body = query, refresh = "true")

    print(json.dumps(result, indent = 2))

if __name__ == "__main__":
    main()

Я использую вложенные объекты. Проблем с обновлением невложенных полей нет.

Фрагмент документа Elasticsearch:

{
  "hits": {
    "hits": [
      {
        "_score": 0.0, 
        "_type": "User", 
        "_id": "506GBBO25953J", 
        "_source": {
          ...
          "Demographic_Details": [
            {
              "comment": null,
              ... 
              "Occupation": ""
            }
          ], 
          ...
        }, 
        "_index": "logic"
      }
    ], 
    "total": 1, 
    "max_score": 0.0
  }, 
  ...
}

Часть отображений Elasticsearch:

{
  "logic" : {
    "mappings" : {
      "Patient" : {
        "_all" : {
          "analyzer" : "edge_ngram_analyzer",
          "search_analyzer" : "keyword_analyzer"
        },
        "properties" : {
          "ID" : {
            "type" : "string"
          },
          "Demographic_Details" : {
            "type" : "nested",
            "properties" : {
              ...
              "Occupation" : {
                "type" : "string",
                "analyzer" : "edge_ngram_analyzer",
                "search_analyzer" : "keyword_analyzer"
              },
              "comment" : {
                "type" : "string",
                "analyzer" : "edge_ngram_analyzer",
                "search_analyzer" : "keyword_analyzer"
              },
              "Match" : {
                "type" : "long"
              }
            }
          },
          ...
        }
      }
    }
  }
}

После запуска обновления появляется следующая ошибка:

Traceback (most recent call last):
  File "./update.py", line 26, in <module>
    main()
  File "./update.py", line 21, in main
    id = "506GBBO25953J", doc_type = "User", body = query, refresh = "true")
  File "/home/trex/Development/Sirius/new/project0/project0-venv/local/lib/python2.7/site-packages/elasticsearch/client/utils.py", line 69, in _wrapped
    return func(*args, params=params, **kwargs)
  File "/home/trex/Development/Sirius/new/project0/project0-venv/local/lib/python2.7/site-packages/elasticsearch/client/__init__.py", line 460, in update
    doc_type, id, '_update'), params=params, body=body)
  File "/home/trex/Development/Sirius/new/project0/project0-venv/local/lib/python2.7/site-packages/elasticsearch/transport.py", line 329, in perform_request
    status, headers, data = connection.perform_request(method, url, params, body, ignore=ignore, timeout=timeout)
  File "/home/trex/Development/Sirius/new/project0/project0-venv/local/lib/python2.7/site-packages/elasticsearch/connection/http_urllib3.py", line 109, in perform_request
    self._raise_error(response.status, raw_data)
  File "/home/trex/Development/Sirius/new/project0/project0-venv/local/lib/python2.7/site-packages/elasticsearch/connection/base.py", line 108, in _raise_error
    raise HTTP_EXCEPTIONS.get(status_code, TransportError)(status_code, error_message, additional_info)
elasticsearch.exceptions.RequestError: TransportError(400, u'illegal_argument_exception', u'[es2][192.168.1.10:9300][indices:data/write/update[s]]')

person srgbnd    schedule 25.10.2016    source источник
comment
это вложенный тип данных или тип данных объекта?   -  person ChintanShah25    schedule 25.10.2016
comment
@ ChintanShah25 Я не уверен, как мне найти его тип? В настоящее время я использую вложенные запросы для поиска, поэтому я предполагаю, что это вложенный тип.   -  person srgbnd    schedule 25.10.2016
comment
вложенный тип данных против тип данных объекта. Не могли бы вы предоставить вывод curl -XGET localhost:9200/your_index/_mapping?pretty   -  person ChintanShah25    schedule 25.10.2016
comment
@ ChintanShah25 Я добавил сопоставления к своему вопросу.   -  person srgbnd    schedule 25.10.2016
comment
Я запустил ваш код в своем индексе, который также имеет вложенные документы, и это сработало. Я также использую ES 2.3. Что печатает инструкция print? Вы получаете какую-либо ошибку?   -  person ChintanShah25    schedule 25.10.2016
comment
Извините, забыл ошибку. Я добавил это выше.   -  person srgbnd    schedule 25.10.2016
comment
Давайте продолжим обсуждение в чате.   -  person ChintanShah25    schedule 25.10.2016


Ответы (1)


Недавно столкнулся с этой проблемой,

Смог исправить это, удалив это

"тип": "вложенный

из данных, отправленных в elasticsearch

person Tosin    schedule 23.11.2017