update query index apis elasticsearch upsert

query - massive update elasticsearch



Elasticsearch upserting y se agrega a la matriz (1)

Intento escribir un script que respalde un nuevo registro de usuario en ElasticSearch, actualice cualquier información si el usuario ya existe y agregue un nuevo objeto PaymentInfo a la matriz de pagos del usuario, si existe en el objeto de actualización. Aquí hay una versión simplificada de lo que estoy trabajando hasta ahora:

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" } } }''

Esto casi hace lo que quiero porque inserta el documento correctamente o actualiza el documento si existe un usuario con el mismo ID, pero le falta el aspecto para agregar este paymentInfo a la matriz de pagoInters del usuario si el usuario ya existe. Tal como está ahora, simplemente anula el objeto paymentInfo. Intenté agregar este script a la actualización JSON:

"script": "if (ctx._source.containsKey(/"paymentInfos/")) {ctx._source.paymentInfos += paymentInfo;} else {ctx._source.paymentInfos = paymentInfo}"

pero elasticsearch ignora los elementos doc cuando se especifica el elemento script .

Siento que me estoy perdiendo algo tonto aquí, pero no estoy seguro. ¿Puede alguien aquí ayudarme?

Editar: He intentado lo siguiente también:

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" } } }''

Lo cual también hace casi lo que yo quiero, en el sentido de que agrega los objetos paymentInfo cuando ejecuto el script varias veces, pero de lo contrario no actualiza el documento en sí (es decir, si ejecuto el script de nuevo, cambiando Mark a Mindy, no se actualiza porque los elementos de upsert solo se usan si el documento ya no existe).


querrá agregar algunos corchetes de la matriz a la parte de inserción de la secuencia de comandos.

"script": "if (ctx._source.containsKey(/"paymentInfos/")) {ctx._source.paymentInfos += paymentInfo;} else {ctx._source.paymentInfos = [paymentInfo]}"

la propiedad ''paymentInfos'' en la primera sección se define como un objeto, por lo que también puede estar causando su caída.