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]]')
est-il imbriqué type de données ou d'un objet type de données? – ChintanShah25
@ 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
[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