2016-10-25 2 views
0

ElasticSearch 2.3.3Ajouter un champ à un objet imbriqué

Je ne peux pas ajouter un nouveau champ dans un document existant via update API. Comment puis-je l'ajouter?

Ci-dessous vous pouvez voir Elasticsearch Python API script pour la mise à jour du document. La requête de mise à jour est affectée à la variable 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() 

J'utilise des objets imbriqués. Il n'y a aucun problème avec la mise à jour des champs non imbriqués.

Un morceau de documents ElasticSearch:

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

Un morceau de cartographies 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" 
       } 
      } 
      }, 
      ... 
     } 
     } 
    } 
    } 
} 

L'erreur suivante apparaît après l'exécution de la mise à jour:

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

est-il imbriqué type de données ou d'un objet type de données? – ChintanShah25

+0

@ ChintanShah25 Je ne suis pas sûr, comment puis-je trouver son type? Actuellement, j'utilise des requêtes imbriquées pour la recherche, donc je suppose que c'est un type imbriqué. – trex

+0

[type de données imbriqué] (https://www.elastic.co/guide/en/elasticsearch/reference/2.4/nested.html) vs [type de données objet] (https://www.elastic.co/guide/en/ elasticsearch/reference/2.4/object.html). Seriez-vous capable de fournir la sortie de 'curl -XGET localhost: 9200/your_index/_mapping? Pretty' – ChintanShah25

Répondre

0

face à ce problème récemment,

a été en mesure de le réparer en enlevant ce

« type »: « niché

des données envoyées à ElasticSearch