Elimina tutti i documenti dall'indice / tipo senza eliminare il tipo


155

So che uno può eliminare tutti i documenti da un certo tipo tramite deleteByQuery.

Esempio:

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

Ma non ho un termine e voglio semplicemente eliminare tutti i documenti da quel tipo, non importa quale termine. Qual è la migliore pratica per raggiungere questo obiettivo? Il termine vuoto non funziona.

Link per eliminareByQuery

Risposte:


175

Credo che se si combina l'eliminazione per query con una corrispondenza, tutto dovrebbe fare quello che stai cercando, qualcosa del genere (usando il tuo esempio):

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

Oppure potresti semplicemente eliminare il tipo:

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

9
Se si dispone di mapping personalizzati; si noti che la seconda opzione eliminerà il tipo e i relativi mapping. Quindi non dimenticare di rimappare il tipo di indice dopo l'eliminazione. Altrimenti sarai incasinato.
Finny Abraham,

24
Ftr: in Elasticsearch 2.0 l' API di eliminazione per query è stata rimossa dal core e ora risiede in un plug-in .
dtk,

2
Non è consigliabile eliminare i record in questo modo. Ecco una dichiarazione dai documenti: "è problematico in quanto forza silenziosamente un aggiornamento che può causare rapidamente OutOfMemoryError durante l'indicizzazione simultanea" elastic.co/guide/en/elasticsearch/reference/1.7/ ...
usef_ksa,

3
Ftr: il plug-in di eliminazione per query tornerà al core ES dalla versione 5.
Val

11
Se ricevi l'errore "Nessun gestore trovato per uri ...", usa curl -XPOST 'localhost: 9200 / twitter / tweet / _delete_by_query? Conflitti = procedi e piuttosto' -d '{"query": {"match_all": {}} } "
Iqbal,

70

Il plug-in Elimina per query è stato rimosso a favore di una nuova implementazione dell'API Elimina per query nel core. Leggi qui

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

1
Ha funzionato per me su es 5.4
jlunavtgrad

2
Ha funzionato per me su ES 6.1.1
Sebastian,

7
Per ES 6+ è necessario anche-H 'Content-Type: application/json'
OMRY VOLK,

57

Da ElasticSearch 5.x, l'API delete_by_query è presente per impostazione predefinita

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

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

Questo è carino perché funziona per i nodi figlio (alcune delle altre risposte falliscono in quel caso a causa di "routing_missing_exception")
dnault

16

Il commento di Torsten Engelbrecht nella risposta di John Petrones ampliato:

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

(Non volevo modificare la risposta di John, dal momento che ha ottenuto voti positivi ed è impostato come risposta, e avrei potuto introdurre un errore)


1
@ChristopheRoussy No senza plug-in aggiuntivo, vedere i commenti sulla risposta di John Petrone
rsilva4,

16

È possibile eliminare i documenti dal tipo con la seguente query:

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

Ho testato questa query in Kibana ed Elastic 5.5.2


13

A partire da Elasticsearch 2.x la cancellazione non è più consentita, poiché i documenti rimangono nell'indice causando la corruzione dell'indice.


1
Quindi qual è la soluzione?
Christophe Roussy,

1
Uso una soluzione basata sull'alias per l'indice. L'idea principale è quella di creare ogni volta un nuovo indice news1, news2 and so one impostare un alias per l'indice attivo corrente sul newspercorso. Naturalmente il nome dell'indice è solo come esempio. Qui puoi trovare un esempio completo di [indice alias] ( elastic.co/guide/en/elasticsearch/reference/current/… ) e un articolo che spiega un caso di studio.
Fabio Fumarola,


6

Nella console di Kibana :

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

6

Hai queste alternative:

1) Elimina un intero indice:

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

esempio:

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

Per maggiori dettagli puoi trovare qui - https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-delete-index.html

2) Elimina per query a quelli corrispondenti:

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

* Qui mentorz è un nome indice e gli utenti è un tipo


5

Nota per ES2 +

A partire da ES 1.5.3 l'API di eliminazione per query è obsoleta e viene completamente rimossa da ES 2.0

Invece dell'API, Elimina per query ora è un plug-in .

Per utilizzare il plug-in Elimina per query è necessario installare il plug-in su tutti i nodi del cluster:

sudo bin/plugin install delete-by-query

Tutti i nodi devono essere riavviati dopo l'installazione.


L'utilizzo del plug-in è lo stesso della vecchia API. Non è necessario modificare nulla nelle tue query: questo plugin le farà semplicemente funzionare.


* Per informazioni complete sul PERCHÉ l'API è stata rimossa, puoi leggere di più qui .


Dalla mia esperienza, il plug-in DeleteByQuery ha prestazioni scarse con una grande quantità di documenti. Testato con ES 2.3.2.
ibai,

1
@ibai, l'ho usato con ES 2.2.0 su un indice contenente diversi milioni di documenti e non ci è voluto molto tempo (all'incirca nello stesso tempo con l'API di eliminazione originale per query che era in 1.7). Comunque - suppongo che non ci sia molta scelta qui, poiché l'API non è più valida.
Dekel,

4

(Reputazione non abbastanza elevata da commentare) La seconda parte della risposta di John Petrone funziona: non sono necessarie query. Elimina il tipo e tutti i documenti contenuti in quel tipo, ma può essere ricreato ogni volta che indicizzi un nuovo documento su quel tipo.

Tanto per chiarire: $ curl -XDELETE 'http://localhost:9200/twitter/tweet'

Nota: questo non elimina il mapping! Ma come accennato in precedenza, può essere facilmente mappato nuovamente creando un nuovo documento.


2
Ma elimini tutte le configurazioni dei mapping che hai, non è consigliabile quando hai una configurazione specifica per qualsiasi mapping, perché i mapping dinamici creano solo campi di base come stringa, long, ecc ...
Carlos Rodriguez,

1
@CarlosRodriguez ma qualsiasi mappatura di fantasia che hai dovrebbe sicuramente essere nel controllo del codice sorgente e molto facile da riapplicare automaticamente, come parte dello stesso script che sta eseguendo l'eliminazione.
Jonathan Hartley,

Questa risposta contraddice direttamente la domanda: "Elimina tutti i documenti ... SENZA eliminazione del tipo". Non fare ipotesi su quanto sia facile ricreare la mappatura basata sul TUO progetto. Altri progetti possono avere procedure più complesse per la mappatura di versioning / migrazione / ecc.
VeganHunter,

3

Sto usando elasticsearch 7.5 e quando lo uso

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

che getterà sotto l'errore.

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

Ho anche bisogno di aggiungere -H 'Content-Type: application/json'un'intestazione aggiuntiva nella richiesta per farlo funzionare.

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" : [ ]
}

Questo funziona per me il 6.7.2.
rooch84,


0

Elasticsearch 2.3 l'opzione

    action.destructive_requires_name: true

in elasticsearch.yml fai il viaggio

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

-1

Se si desidera eliminare il documento in base a una data. Puoi usare la console di kibana (v.6.1.2)

POST index_name/_delete_by_query
{
      "query" : {
              "range" : {
                 "sendDate" : {
                     "lte" : "2018-03-06"
                              }
                        }
                  }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.