Elasticsearch upserting et l'ajout de tableau
Je suis en train d'écrire un script qui va upsert un nouvel enregistrement de l'utilisateur pour ElasticSearch, la mise à jour des informations si l'utilisateur existe déjà, et à ajouter une nouvelle PaymentInfo objet à l'utilisateur de Paiements du tableau s'il existe dans la mise à jour de l'objet. Voici une version simplifiée de ce que je suis en train de travailler avec un si loin:
curl -XPOST 'http://localhost:9200/usrtest/usr/1/_update' -d '
{
"doc_as_upsert": true,
"doc": {
"customerId": "1",
"firstName": "Mark",
"lastName": "Z",
"emailAddress": "[email protected]",
"paymentInfo": {
"pid": "1",
"amt": "10"
}
}
}'
Cela ne fait presque ce que je veux en ce qu'il insère le doc correctement, ou des mises à jour de la doc si un utilisateur existe avec le même ID, mais il manque l'aspect d'ajouter cette paymentInfo à l'utilisateur paymentInfos tableau si l'utilisateur existe déjà. Comme il est maintenant, c'est juste remplace la paymentInfo objet. J'ai essayé d'ajouter ce script à la mise à jour de JSON:
"script": "if (ctx._source.containsKey(\"paymentInfos\")) {ctx._source.paymentInfos += paymentInfo;} else {ctx._source.paymentInfos = paymentInfo}"
mais elasticsearch ignore doc
éléments lors de la script
élément est spécifié.
J'ai l'impression que je suis absent quelque chose de stupide, mais je ne suis pas sûr. Quelqu'un sait-il m'aider?
Edit:
J'ai essayé également que:
curl -XPOST 'http://localhost:9200/usrtest/usr/1/_update' -d '
{
"script": "if (ctx._source.containsKey(\"paymentInfos\")) {ctx._source.paymentInfos += paymentInfo;} else {ctx._source.paymentInfos = paymentInfo}",
"upsert": {
"customerId": "1",
"firstName": "Mark",
"lastName": "Z",
"emailAddress": "[email protected]",
"paymentInfo": {
"pid": "1",
"amt": "10"
}
},
"params": {
"paymentInfo": {
"pid": "1",
"amt": "10"
}
}
}'
Qui a également presque fait ce que je veux, en ce qu'il ajoute le paymentInfo objets lorsque je lance le script plusieurs fois, mais sinon, il ne met pas à jour le document lui-même (c'est à dire si je lance le script à nouveau, en changeant de Marque de Mindy, elle n'est pas mise à jour depuis upsert
éléments ne sont utilisés que si le doc n'existe pas déjà).
- discuter.élastiques.co/t/ajout-à-existant-champ/16423
- Avez-vous été en mesure de mettre à jour le document en entier avec une condition? j'.e.g utiliser un script et un doc ensemble? J'ai une erreur de script et le doc ne peut pas être utilisée.
Vous devez vous connecter pour publier un commentaire.
vous aurez envie d'ajouter un peu de tableau crochets à l'insertion d'une partie du script.
le " paymentInfos la propriété dans la première section est définie comme un objet, de sorte que peut aussi vous causer des chutes.
"script": "ctx._source.paymentInfos = (ctx._source.paymentInfos) ? ctx._source.paymentInfos + paymentInfo : [paymentInfo]"