Eliminar todos los documentos del índice / tipo sin eliminar el tipo


156

Sé que uno puede eliminar todos los documentos de un determinado tipo a través de deleteByQuery.

Ejemplo:

curl -XDELETE 'http://localhost:9200/twitter/tweet/_query' -d '{
    "query" : {
        "term" : { "user" : "kimchy" }
    }
}'

Pero no tengo término y simplemente quiero eliminar todos los documentos de ese tipo, sin importar el término. ¿Cuál es la mejor práctica para lograr esto? El término vacío no funciona.

Enlace a deleteByQuery

Respuestas:


175

Creo que si combina la eliminación por consulta con una coincidencia, todo debería hacer lo que está buscando, algo como esto (usando su ejemplo):

curl -XDELETE 'http://localhost:9200/twitter/tweet/_query' -d '{
    "query" : { 
        "match_all" : {}
    }
}'

O simplemente puede eliminar el tipo:

curl -XDELETE http://localhost:9200/twitter/tweet

9
Si tiene asignaciones personalizadas; tenga en cuenta que la segunda opción eliminará el tipo y sus asignaciones. Así que no olvides reasignar el tipo de índice después de eliminarlo. O de lo contrario estarás en mal estado.
Finny Abraham

24
Ftr: en Elasticsearch 2.0 la eliminación por API de consulta se ha eliminado del núcleo y ahora vive en un complemento .
dtk

2
No se recomienda eliminar registros de esta manera. Aquí la declaración de los documentos: "es problemático ya que silenciosamente fuerza una actualización que puede causar rápidamente OutOfMemoryError durante la indexación concurrente" elastic.co/guide/en/elasticsearch/reference/1.7/ ...
usef_ksa

3
Ftr: El complemento Eliminar por consulta volverá al núcleo ES a partir de la versión 5.
Val

11
Si obtiene el error "No se encontró un controlador para uri ...", use curl -XPOST 'localhost: 9200 / twitter / tweet / _delete_by_query? Conflictos = proceder y bonita' -d '{"consulta": {"match_all": {}} } '
Iqbal

71

El complemento Eliminar por consulta se ha eliminado en favor de una nueva implementación de la API Eliminar por consulta en el núcleo. Leer aquí

curl -XPOST 'localhost:9200/twitter/tweet/_delete_by_query?conflicts=proceed&pretty' -d'
{
    "query": {
        "match_all": {}
    }
}'

1
Trabajó para mí en es 5.4
jlunavtgrad

2
Trabajó para mí en ES 6.1.1
Sebastian

77
Para ES 6+ también necesita-H 'Content-Type: application/json'
OMRY VOLK

57

Desde ElasticSearch 5.x, la API delete_by_query está allí por defecto

POST: http://localhost:9200/index/type/_delete_by_query

{
    "query": { 
        "match_all": {}
    }
}

Esto es bueno porque funciona para nodos secundarios (algunas de las otras respuestas fallan en ese caso debido a "routing_missing_exception")
dnault

16

El comentario de Torsten Engelbrecht en la respuesta de John Petrones se expandió:

curl -XDELETE 'http://localhost:9200/twitter/tweet/_query' -d 
  '{
      "query": 
      {
          "match_all": {}
      }
   }'

(No quería editar la respuesta de John, ya que recibió votos positivos y está configurada como respuesta, y podría haber introducido un error)


1
@ChristopheRoussy No sin un complemento adicional, vea los comentarios sobre la respuesta de John Petrone
rsilva4

16

Puede eliminar documentos del tipo con la siguiente consulta:

POST /index/type/_delete_by_query
{
    "query" : { 
        "match_all" : {}
    }
}

Probé esta consulta en Kibana y Elastic 5.5.2


13

A partir de Elasticsearch 2.x, la eliminación ya no está permitida, ya que los documentos permanecen en el índice causando daños en el índice.


1
Entonces, cuál es la solución ?
Christophe Roussy

1
Yo uso una solución basada en alias para el índice. La idea principal es crear un nuevo índice cada vez news1, news2 and so ony configurar un alias para el índice activo actual de la newsruta. Por supuesto, el nombre del índice es solo un ejemplo. Aquí puede encontrar un ejemplo completo de [alias de índice] ( elastic.co/guide/en/elasticsearch/reference/current/… ) y un artículo que explica un estudio de caso.
Fabio Fumarola


6

En la consola Kibana :

POST calls-xin-test-2/_delete_by_query
{
  "query": { 
    "match_all": {}
  }
}

6

Tienes estas alternativas:

1) Eliminar un índice completo:

curl -XDELETE 'http://localhost:9200/indexName'             

ejemplo:

curl -XDELETE 'http://localhost:9200/mentorz'

Para más detalles puedes encontrar aquí - https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-delete-index.html

2) Eliminar por consulta a los que coinciden:

curl -XDELETE 'http://localhost:9200/mentorz/users/_query' -d                
    '{
        "query":
            {
                "match_all": {}
            }
    }'

* Aquí mentorz es un nombre de índice y usuarios es un tipo


5

Nota para ES2 +

A partir de ES 1.5.3, la API de eliminación por consulta está en desuso y se elimina por completo desde ES 2.0

En lugar de la API, Eliminar por consulta ahora es un complemento .

Para utilizar el complemento Eliminar por consulta, debe instalar el complemento en todos los nodos del clúster:

sudo bin/plugin install delete-by-query

Todos los nodos deben reiniciarse después de la instalación.


El uso del complemento es el mismo que el de la API anterior. No necesita cambiar nada en sus consultas: este complemento solo hará que funcionen.


* Para obtener información completa sobre POR QUÉ se eliminó la API, puede leer más aquí .


Desde mi experiencia, el complemento DeleteByQuery funciona muy mal con una gran cantidad de documentos. Probado con ES 2.3.2.
ibai

1
@ibai, lo usé con ES 2.2.0 en un índice que contiene varios millones de documentos y no tardó mucho (casi al mismo tiempo con la eliminación original por API de consulta que estaba en 1.7). De todos modos, supongo que no hay muchas opciones aquí, ya que la API ya no es válida.
Dekel

4

(La reputación no es lo suficientemente alta como para comentar) La segunda parte de la respuesta de John Petrone funciona: no se necesita consulta. Eliminará el tipo y todos los documentos contenidos en ese tipo, pero eso solo se puede volver a crear cada vez que indexe un nuevo documento a ese tipo.

Solo para aclarar: $ curl -XDELETE 'http://localhost:9200/twitter/tweet'

Nota: esto no elimina el mapeo! Pero como se mencionó anteriormente, se puede reasignar fácilmente creando un nuevo documento.


2
Sin embargo, se eliminan todos los mapeos cuál es la configuración que tenga, no es recomendable cuando se tiene una configuración específica para cualquier asignación, debido a que las asignaciones dinámicas sólo crean campos básicos como cuerda, larga, etc ...
Carlos Rodríguez

1
@CarlosRodriguez, pero cualquier mapeo sofisticado que tengas seguramente debería estar en control de fuente, y muy fácil de volver a aplicar automáticamente, como parte del mismo script que está haciendo la eliminación.
Jonathan Hartley

Esta respuesta contradice directamente la pregunta: "Eliminar todos los documentos ... SIN eliminar el tipo". No haga suposiciones sobre lo fácil que es recrear el mapeo basado en SU ​​proyecto. Otros proyectos pueden tener procedimientos más complejos para mapear versiones / migración / etc.
VeganHunter

3

Estoy usando elasticsearch 7.5 y cuando uso

curl -XPOST 'localhost:9200/materials/_delete_by_query?conflicts=proceed&pretty' -d'
{
    "query": {
        "match_all": {}
    }
}'

que arrojará debajo del error.

{
  "error" : "Content-Type header [application/x-www-form-urlencoded] is not supported",
  "status" : 406
}

También necesito agregar un -H 'Content-Type: application/json'encabezado adicional en la solicitud para que funcione.

curl -XPOST 'localhost:9200/materials/_delete_by_query?conflicts=proceed&pretty'  -H 'Content-Type: application/json' -d'
{
    "query": {
        "match_all": {}
    }
}'
{
  "took" : 465,
  "timed_out" : false,
  "total" : 2275,
  "deleted" : 2275,
  "batches" : 3,
  "version_conflicts" : 0,
  "noops" : 0,
  "retries" : {
    "bulk" : 0,
    "search" : 0
  },
  "throttled_millis" : 0,
  "requests_per_second" : -1.0,
  "throttled_until_millis" : 0,
  "failures" : [ ]
}

Esto funciona para mí en 6.7.2.
rooch84


0

Elasticsearch 2.3 la opción

    action.destructive_requires_name: true

en elasticsearch.yml hacer el viaje

    curl -XDELETE http://localhost:9200/twitter/tweet

-1

Si desea eliminar el documento de acuerdo con una fecha. Puedes usar la consola kibana (v.6.1.2)

POST index_name/_delete_by_query
{
      "query" : {
              "range" : {
                 "sendDate" : {
                     "lte" : "2018-03-06"
                              }
                        }
                  }
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.