Supprimer tous les documents de l'index / du type sans supprimer le type

156

Je sais que l'on peut supprimer tous les documents d'un certain type via deleteByQuery.

Exemple:

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

Mais je n'ai AUCUN terme et je veux simplement supprimer tous les documents de ce type, quel que soit le terme. Quelle est la meilleure pratique pour y parvenir? Le terme vide ne fonctionne pas.

Lien vers deleteByQuery

Michael Leiss
la source

Réponses:

175

Je crois que si vous combinez la suppression par requête avec une correspondance tout ce que vous recherchez, quelque chose comme ça (en utilisant votre exemple):

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

Ou vous pouvez simplement supprimer le type:

curl -XDELETE http://localhost:9200/twitter/tweet
John Petrone
la source
9
Si vous avez des mappages personnalisés; notez que la deuxième option supprimera le type et ses mappages. N'oubliez donc pas de remapper le type d'index après la suppression. Sinon, vous serez foiré.
Finny Abraham
24
Ftr: dans Elasticsearch 2.0, l' API de suppression par requête a été supprimée du noyau et réside désormais dans un plugin .
dtk
2
Il n'est pas recommandé de supprimer les enregistrements de cette manière. Voici une déclaration de la documentation: "c'est problématique car cela force silencieusement une actualisation qui peut rapidement provoquer une erreur OutOfMemoryError lors de l'indexation simultanée" élastique.co
usef_ksa
3
Ftr: Le plugin de suppression par requête sera de retour dans le noyau ES à partir de la version 5.
Val
11
Si vous obtenez l'erreur "Aucun gestionnaire trouvé pour uri ...", utilisez curl -XPOST 'localhost: 9200 / twitter / tweet / _delete_by_query? Conflits = continue & pretty' -d '{"query": {"match_all": {}} } '
Iqbal
71

Le plugin Delete-By-Query a été supprimé au profit d'une nouvelle implémentation d'API Delete By Query dans le core. Lisez ici

curl -XPOST 'localhost:9200/twitter/tweet/_delete_by_query?conflicts=proceed&pretty' -d'
{
    "query": {
        "match_all": {}
    }
}'
Iqbal
la source
1
A travaillé pour moi sur es 5.4
jlunavtgrad
2
A travaillé pour moi sur ES 6.1.1
Sebastian
7
Pour ES 6+, vous avez également besoin -H 'Content-Type: application/json'
OMRY VOLK
57

Depuis ElasticSearch 5.x, l'API delete_by_query est là par défaut

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

{
    "query": { 
        "match_all": {}
    }
}
Jay Shah
la source
C'est bien car cela fonctionne pour les nœuds enfants (certaines des autres réponses échouent dans ce cas en raison de "routing_missing_exception")
dnault
16

Le commentaire de Torsten Engelbrecht dans la réponse de John Petrones s'est élargi:

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

(Je ne voulais pas modifier la réponse de John, car elle a reçu des votes positifs et est définie comme réponse, et j'ai peut-être introduit une erreur)

Brimstedt
la source
1
@ChristopheRoussy Non sans plugin supplémentaire, voir les commentaires sur la réponse de John Petrone
rsilva4
16

Vous pouvez supprimer des documents du type avec la requête suivante:

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

J'ai testé cette requête dans Kibana et Elastic 5.5.2

Luka Lopusina
la source
13

À partir d'Elasticsearch 2.x, la suppression n'est plus autorisée, car les documents restent dans l'index, provoquant une corruption de l'index.

Fabio Fumarola
la source
1
Alors, quelle est la solution ?
Christophe Roussy
1
J'utilise une solution basée sur un alias pour l'index. L'idée principale est de créer un nouvel index à chaque fois news1, news2 and so onet de configurer un alias pour l'index actif actuel du newschemin. Bien sûr, le nom de l'index n'est qu'à titre d'exemple. Ici vous pouvez trouver un exemple complet pour [alias d'index] ( élastique.co / guide/en / elasticsearch / reference / current / ) et un article qui explique une étude de cas.
Fabio Fumarola
10

Les réponses ci-dessus ne fonctionnent plus avec ES 6.2.2 en raison de la vérification stricte du type de contenu pour les requêtes REST Elasticsearch . La curlcommande que j'ai fini par utiliser est la suivante:

curl -H'Content-Type: application/json' -XPOST 'localhost:9200/yourindex/_doc/_delete_by_query?conflicts=proceed' -d' { "query": { "match_all": {} }}'
mindas
la source
1
Selon les documents officiels, j'ai dû supprimer la partie _doc de l'URL.
Mark Schäfer
6

Dans la console Kibana :

POST calls-xin-test-2/_delete_by_query
{
  "query": { 
    "match_all": {}
  }
}
Xin
la source
6

Vous avez ces alternatives:

1) Supprimer un index entier:

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

exemple:

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

Pour plus de détails, vous pouvez trouver ici - https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-delete-index.html

2) Supprimer par requête à ceux qui correspondent:

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

* Ici, mentorz est un nom d'index et les utilisateurs est un type

NeeruKSingh
la source
5

Remarque pour ES2 +

À partir de ES 1.5.3, l'API de suppression par requête est obsolète et est complètement supprimée depuis ES 2.0

Au lieu de l'API, la suppression par requête est désormais un plugin .

Pour utiliser le plugin Delete By Query, vous devez installer le plugin sur tous les nœuds du cluster:

sudo bin/plugin install delete-by-query

Tous les nœuds doivent être redémarrés après l'installation.


L'utilisation du plugin est la même que l'ancienne API. Vous n'avez pas besoin de changer quoi que ce soit dans vos requêtes - ce plugin les fera simplement fonctionner.


* Pour obtenir des informations complètes sur pourquoi l'API a été supprimée, vous pouvez en savoir plus ici .

Dekel
la source
D'après mon expérience, le plugin DeleteByQuery fonctionne très mal avec une grande quantité de documents. Testé avec ES 2.3.2.
ibai
1
@ibai, je l'ai utilisé avec ES 2.2.0 sur un index contenant plusieurs millions de documents et cela n'a pas pris longtemps (à peu près en même temps avec l'API de suppression par requête d'origine qui était en 1.7). Quoi qu'il en soit - je suppose qu'il n'y a pas beaucoup de choix ici, car l'API n'est plus valide.
Dekel
4

(Réputation pas assez élevée pour commenter) La deuxième partie de la réponse de John Petrone fonctionne - aucune requête n'est nécessaire. Il supprimera le type et tous les documents contenus dans ce type, mais cela peut simplement être recréé chaque fois que vous indexez un nouveau document dans ce type.

Juste pour clarifier: $ curl -XDELETE 'http://localhost:9200/twitter/tweet'

Remarque: ce ne supprimer le mappage! Mais comme mentionné précédemment, il peut être facilement reconfiguré en créant un nouveau document.

Emmy R
la source
2
Mais vous supprimez toutes les configurations de mappages que vous avez, ce n'est pas recommandé lorsque vous avez une configuration spécifique pour tout mappage, car les mappages dynamiques ne créent que des champs de base comme string, long, etc ...
Carlos Rodriguez
1
@CarlosRodriguez mais tout mappage sophistiqué que vous avez devrait sûrement être dans le contrôle de code source et très facile à réappliquer automatiquement, dans le cadre du même script qui effectue la suppression.
Jonathan Hartley
Cette réponse contredit directement la question: "Supprimer tous les documents ... SANS supprimer le type". Veuillez ne pas supposer à quel point il est facile de recréer la cartographie en fonction de VOTRE projet. D'autres projets peuvent avoir des procédures plus complexes pour mapper les versions / migration / etc.
VeganHunter
3

J'utilise elasticsearch 7.5 et quand j'utilise

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

qui jettera ci-dessous l'erreur.

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

Je dois également ajouter un en- -H 'Content-Type: application/json'tête supplémentaire dans la demande pour que cela fonctionne.

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
la source
Cela fonctionne pour moi sur 6.7.2.
rooch84
2

Juste pour ajouter quelques centimes à cela.

Le "delete_by_query" mentionné en haut est toujours disponible en tant que plugin dans elasticsearch 2.x.

Bien que dans la dernière version à venir 5.x, il sera remplacé par "supprimer par requête api"

Walaitki
la source
0

Elasticsearch 2.3 l'option

    action.destructive_requires_name: true

dans elasticsearch.yml faire le voyage

    curl -XDELETE http://localhost:9200/twitter/tweet
JJANSSEN
la source
-1

Si vous souhaitez supprimer le document en fonction d'une date. Vous pouvez utiliser la console kibana (v.6.1.2)

POST index_name/_delete_by_query
{
      "query" : {
              "range" : {
                 "sendDate" : {
                     "lte" : "2018-03-06"
                              }
                        }
                  }
}
SerefAltindal
la source