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

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

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": {}
    }
}'

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": {}
    }
}

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)


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


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.


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


6

Dans la console Kibana :

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

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


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 .


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.


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

Cela fonctionne pour moi sur 6.7.2.
rooch84


0

Elasticsearch 2.3 l'option

    action.destructive_requires_name: true

dans elasticsearch.yml faire le voyage

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

-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"
                              }
                        }
                  }
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.