web-dev-qa-db-fra.com

Supprimer des documents de type dans Elasticsearch

Je souhaite supprimer tous les documents indexés dans un type dans Elasticsearch à l'aide de l'API HTTP/REST, mais je ne souhaite pas supprimer le mappage de ce type.

Comment puis-je construire la requête dans l'URL pour le faire?

19
user2816801

Avant d'exécuter la commande, état index/mapping; (captures d'écran de plugin elasticsearch head interface web)

enter image description here

enter image description here

enter image description here

Commander;

curl -XDELETE 'http://localhost:9200/publishercategoryeu/autocomplete/_query' -d '
{
  "query": {
    "bool": {
      "must": [
        {
          "match_all": {}
        }
      ]
    }
  }
}
'

Résultat;

enter image description here

Après exécution de la commande, état index/mapping;

enter image description here

enter image description here

enter image description here

Comme nous pouvons le voir, nous avons supprimé tous les documents indexés dans un type (mappage) sans supprimer l’index ou le type (mappage).

16
csonuryilmaz

Une simple suppression par requête avec une requête match_all devrait faire l'affaire. Vous pouvez obtenir plus d’informations ici:

supprimer par requête api

Vous pouvez également supprimer le type complet et utiliser l’application template. Déposez simplement un fichier dans votre dossier config/templates/contenant votre modèle et vous ne le perdrez jamais. Le mappage sera en effet perdu lorsque vous supprimerez le mappage, mais le modèle sera réutilisé dès que vous indexez quelque chose à nouveau. Voici quelques informations supplémentaires:

template api

EDIT: new delete api: https://www.elastic.co/guide/fr/elasticsearch/reference/current/docs-delete.html

7
DeH

Avec la commande suivante dans le plugin elasticsearch head, j'ai pu supprimer tous les documents de type logs de l'index logstash sans supprimer le mappage:

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

Deleting documents with Elasticsearch head plugin

Pour libérer de l'espace sur le disque, vous devez également optimiser l'index (Actions-> Optimiser pour l'index logstash dans le plug-in head) après la suppression des documents.

4
asmaier

Les réponses précédentes ne fonctionneront pas avec la version la plus récente de Elasticsearch. "Delete by query" est obsolète de Elasticsearch 2.0. La documentation Elasticsearch indique que cela peut provoquer une erreur OutOfMemoryError lors de l'indexation simultanée et peut rendre incohérentes primaire et réplique. Si vous voulez suivre l'historique du problème dans Github .

Il faut maintenant plusieurs étapes pour supprimer tous les documents d'une type

  1. Trouvez tous les identifiants du document que vous devez supprimer. Le moyen le plus efficace d'effectuer cette opération consiste à utiliser l'API scroll/scan pour trouver tous les identifiants correspondants pour un type donné. 

  2. Émettez une demande en bloc pour supprimer les documents par identifiants. Un exemple fourni ci-dessous.

    curl -XPOST 'http://localhost:9200/_bulk' -d '
        { "delete": { "_index": "index", "_type": "type", "_id": "1"}
        { "delete": { "_index": "index", "_type": "type", "_id": "2"}'
    

Notez que si vous fournissez un fichier texte à curl, vous devez utiliser l’indicateur --data-binary au lieu de plain -d.

1
Jadiel de Armas
$ curl -XDELETE 'http://localhost:9200/Twitter/Tweet/_query?q=user:kimchy'

$ curl -XDELETE 'http://localhost:9200/Twitter/Tweet/_query' -d '{
    "query" : {
        "term" : { "user" : "kimchy" }
    }
}
0
Dahar Youssef

Si vous voulez faire cela en golang, en utilisant la bibliothèque " olviere/elastic ", vous pouvez utiliser ce code, en supposant que vous avez un client yourClient, et yourIndex et yourType:

    bq := elastic.NewBoolQuery()
    bq.Must(elastic.NewMatchAllQuery())
    _, err := elastic.NewDeleteByQueryService(yourClient).
        Index(yourIndex).
        Type(yourType).
        Query(bq).
        Do()
0
Darth Egregious