update query elasticsearch

elasticsearch - query - ¿Puedo crear un documento con la API de actualización si el documento aún no existe?



update by query document elasticsearch (4)

AFAIK cuando indexa los documentos (con una llamada PUT), la versión existente se reemplaza con la versión más nueva. Si el documento no existió, se crea. No es necesario hacer una distinción entre INSERT y UPDATE en ElasticSearch.

ACTUALIZACIÓN: de acuerdo con la documentación , si utiliza op_type = create, o una versión especial _create de la llamada de indexación, cualquier llamada para un documento que ya existe fallará.

Cita de la documentación:

Here is an example of using the op_type parameter: $ curl -XPUT ''http://localhost:9200/twitter/tweet/1?op_type=create'' -d ''{ "user" : "kimchy", "post_date" : "2009-11-15T14:12:12", "message" : "trying out Elasticsearch" }'' Another option to specify create is to use the following uri: $ curl -XPUT ''http://localhost:9200/twitter/tweet/1/_create'' -d ''{ "user" : "kimchy", "post_date" : "2009-11-15T14:12:12", "message" : "trying out Elasticsearch" }''

Tengo una pregunta muy simple:

Quiero actualizar varios documentos en elasticsearch. Algunas veces el documento ya existe pero a veces no. No deseo utilizar una solicitud de obtención para verificar la existencia del documento (esto está disminuyendo mi rendimiento). Deseo utilizar directamente mi solicitud de actualización para indexar el documento directamente si aún no existe.

Sé que podemos usar upsert para crear un campo no existente al actualizar un documento, pero esto no es lo que quiero. Quiero indexar el documento si no existe. No sé si upsert puede hacer esto.

¿Me puede dar alguna explicación?

¡Gracias por adelantado!


A partir de elasticsearch -model v0.1.4, los upserts no son compatibles. Pude solucionar esto creando una devolución de llamada personalizada .

after_commit on: :update do begin __elasticsearch__.update_document rescue Elasticsearch::Transport::Transport::Errors::NotFound __elasticsearch__.index_document end end


Esto es posible usando la API de actualización. Requiere que usted defina la identificación de cada documento, ya que la API de actualización requiere la identificación del documento para determinar su presencia.

Dado un índice creado con los siguientes documentos:

PUT /cars/car/1 { "color": "blue", "brand": "mercedes" } PUT /cars/car/2 { "color": "blue", "brand": "toyota" }

Podemos obtener la funcionalidad de actualización que desee utilizando la API de actualización con la siguiente llamada de API.

POST /cars/car/3/_update { "doc": { "color" : "brown", "brand" : "ford" }, "doc_as_upsert" : true }

Esta llamada de API agregará el documento al índice ya que no existe.

Al ejecutar la llamada por segunda vez después de cambiar el color del automóvil, se actualizará el documento, en lugar de crear un nuevo documento.

POST /cars/car/3/_update { "doc": { "color" : "black", "brand" : "ford" }, "doc_as_upsert" : true }


Para el uso de API a granel

bulks.push({ update: { _index: ''index'', _type: ''type'', _id: id } }); bulks.push({"doc_as_upsert":true, "doc": your_doc});