delete - Eliminar un campo de un documento de Elasticsearch
consultas en elasticsearch (3)
Necesito eliminar un campo en todos los documentos indexados a Elasticsearch. Cómo puedo hacerlo. ¿Alguna de las consultas de eliminación me ayudará a lograr esto?
Lo que @backtrack dijo es cierto, pero luego hay una manera muy conveniente de hacerlo en Elasticsearch. Elasticsearch abstraerá la complejidad interna de la eliminación. Necesitas usar la API de actualización para lograr esto -
curl -XPOST ''localhost:9200/test/type1/1/_update'' -d ''{
"script" : "ctx._source.remove(/"name_of_field/")"
}''
Puedes encontrar más documentación here .
Nota: a partir de Elastic Search 6 debe incluir un encabezado de tipo de contenido:
-H ''Content-Type: application/json''
Por defecto no es posible, porque ahora Lucene no admite eso. Básicamente, solo puede colocar o eliminar documentos completos de Lucene de los índices de Lucene.
- Consigue la primera versión de tu doc.
- quitar el campo
- Empuja esta nueva versión de tu doc.
update_by_query
agregó update_by_query
en 2.3. Esta interfaz experimental le permite realizar la actualización de todos los documentos que coinciden con una consulta.
Internamente, elasticsearch realiza un escaneo / desplazamiento para recopilar lotes de documentos y luego actualizarlos como la interfaz de actualización masiva. Esto es más rápido que hacerlo manualmente con su propia interfaz de escaneo / desplazamiento debido a que no tiene la sobrecarga de la red y la serialización. Cada registro debe ser cargado en el ram, modificado y luego escrito.
Ayer eliminé un campo grande de mi cluster ES. Vi un rendimiento sostenido de 10,000 registros por segundo durante el update_by_query, restringido por CPU en lugar de IO.
Mire la configuración de conflict=proceed
si el clúster tiene otro tráfico de actualización, o todo el trabajo se detendrá cuando llegue a ConflictError
cuando uno de los registros se actualice debajo de uno de los lotes.
La configuración similar de wait_for_completion=false
hará que update_by_query se ejecute a través de la interfaz de tasks . De lo contrario, el trabajo terminará si se cierra la conexión.
url
http://localhost:9200/type/_update_by_query?wait_for_completion=false&conflict=proceed
Cuerpo POST:
{
"script": ctx._source.remove("name_of_field"),
"query": {
"bool": {
"must": [
{
"exists": {
"field": "name_of_field"
}
}
]
}
}
}
A partir de Elasticsearch 1.43, las secuencias de comandos en línea están deshabilitadas de forma predeterminada . Deberá habilitarlo para que funcione un script en línea como este agregando script.inline: true
a su archivo de configuración.
O cargue el groovy como un script y use el formato "script": { "file": "scriptname", "lang": "groovy"}
.