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

Michael Leiss
fuente

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
John Petrone
fuente
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": {}
    }
}'
Iqbal
fuente
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": {}
    }
}
Jay Shah
fuente
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)

Brimstedt
fuente
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

Luka Lopusina
fuente
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.

Fabio Fumarola
fuente
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
10

Las respuestas anteriores ya no funcionan con ES 6.2.2 debido a la estricta verificación de tipo de contenido para solicitudes REST de Elasticsearch . El curlcomando que terminé usando es este:

curl -H'Content-Type: application/json' -XPOST 'localhost:9200/yourindex/_doc/_delete_by_query?conflicts=proceed' -d' { "query": { "match_all": {} }}'
mindas
fuente
1
De acuerdo con los documentos oficiales, tuve que eliminar la parte _doc de la URL.
Mark Schäfer el
6

En la consola Kibana :

POST calls-xin-test-2/_delete_by_query
{
  "query": { 
    "match_all": {}
  }
}
Xin
fuente
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

NeeruKSingh
fuente
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í .

Dekel
fuente
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.

Emmy R
fuente
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" : [ ]
}
Kris Roofe
fuente
Esto funciona para mí en 6.7.2.
rooch84
2

Solo para agregar un par de centavos a esto.

El "delete_by_query" mencionado en la parte superior todavía está disponible como un complemento en elasticsearch 2.x.

Aunque en la última versión 5.x próxima será reemplazada por "eliminar por API de consulta"

Walaitki
fuente
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
JANSAN
fuente
-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"
                              }
                        }
                  }
}
SerefAltindal
fuente