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?
Avant d'exécuter la commande, état index/mapping; (captures d'écran de plugin elasticsearch head interface web)
Commander;
curl -XDELETE 'http://localhost:9200/publishercategoryeu/autocomplete/_query' -d '
{
"query": {
"bool": {
"must": [
{
"match_all": {}
}
]
}
}
}
'
Résultat;
Après exécution de la commande, état index/mapping;
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).
Une simple suppression par requête avec une requête match_all devrait faire l'affaire. Vous pouvez obtenir plus d’informations ici:
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:
EDIT: new delete api: https://www.elastic.co/guide/fr/elasticsearch/reference/current/docs-delete.html
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":{}}}
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.
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
.
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é.
É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
.
$ curl -XDELETE 'http://localhost:9200/Twitter/Tweet/_query?q=user:kimchy'
$ curl -XDELETE 'http://localhost:9200/Twitter/Tweet/_query' -d '{
"query" : {
"term" : { "user" : "kimchy" }
}
}
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()