2016-10-25 3 views
0

Elasticsearch 2.3.3Добавить новое поле вложенного объекта

Я не могу добавить новое поле в существующий документ с помощью update 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]]') 
+0

является его вложенным тип данных или объект типа данных? – ChintanShah25

+0

@ ChintanShah25 Я не уверен, как я могу найти его тип? В настоящее время я использую вложенные запросы для поиска, поэтому я предполагаю, что это вложенный тип. – trex

+0

[вложенный тип данных] (https://www.elastic.co/guide/en/elasticsearch/reference/2.4/nested.html) vs [object datatype] (https://www.elastic.co/guide/en/ elasticsearch/ссылка/2,4/object.html). Вы могли бы предоставить вывод «curl -XGET localhost: 9200/your_index/_mapping? Pretty» – ChintanShah25

ответ

0

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

был в состоянии исправить ее, удалив эту

«типа»: «вложенной

из данных, посылаемых elasticsearch

Смежные вопросы