Löschen Sie alle Dokumente aus dem Index / Typ, ohne den Typ zu löschen

155

Ich weiß, dass man über deleteByQuery alle Dokumente eines bestimmten Typs löschen kann.

Beispiel:

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

Aber ich habe KEINEN Begriff und möchte einfach alle Dokumente dieses Typs löschen, egal welcher Begriff. Was ist die beste Vorgehensweise, um dies zu erreichen? Leerer Begriff funktioniert nicht.

Link zu deleteByQuery

Michael Leiss
quelle

Antworten:

175

Ich glaube, wenn Sie das Löschen durch Abfrage mit einer Übereinstimmung kombinieren, sollte alles das tun, wonach Sie suchen, so etwas (anhand Ihres Beispiels):

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

Oder Sie können einfach den Typ löschen:

curl -XDELETE http://localhost:9200/twitter/tweet
John Petrone
quelle
9
Wenn Sie benutzerdefinierte Zuordnungen haben; Beachten Sie, dass mit der zweiten Option der Typ und seine Zuordnungen gelöscht werden. Vergessen Sie also nicht, den Indextyp nach dem Löschen neu zuzuordnen. Sonst wirst du durcheinander sein.
Finny Abraham
24
Ftr: In Elasticsearch 2.0 wurde die API zum Löschen nach Abfrage aus dem Kern entfernt und befindet sich nun in einem Plugin .
dtk
2
Es wird nicht empfohlen, Datensätze auf diese Weise zu löschen. Hier die Aussage aus den Dokumenten: "Es ist problematisch, da eine Aktualisierung stillschweigend erzwungen wird, die bei gleichzeitiger Indizierung schnell zu OutOfMemoryError führen kann." Elastic.co/guide/en/elasticsearch/reference/1.7/ …
usef_ksa
3
Ftr: Das Plugin zum Löschen per Abfrage wird ab Version 5 wieder in ES Core verfügbar sein.
Val
11
Wenn der Fehler "Kein Handler für uri gefunden ..." angezeigt wird, verwenden Sie curl -XPOST 'localhost: 9200 / twitter / tweet / _delete_by_query? Conflicts = continue & pretty' -d '{"query": {"match_all": {}} } '
Iqbal
70

Das Plugin "Nach Abfrage löschen" wurde zugunsten einer neuen API-Implementierung "Nach Abfrage löschen" im Kern entfernt. Lies hier

curl -XPOST 'localhost:9200/twitter/tweet/_delete_by_query?conflicts=proceed&pretty' -d'
{
    "query": {
        "match_all": {}
    }
}'
Iqbal
quelle
1
Arbeitete für mich an es 5.4
jlunavtgrad
2
Arbeitete für mich an ES 6.1.1
Sebastian
7
Für ES 6+ benötigen Sie auch-H 'Content-Type: application/json'
OMRY VOLK
57

In ElasticSearch 5.x ist die API delete_by_query standardmäßig vorhanden

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

{
    "query": { 
        "match_all": {}
    }
}
Jay Shah
quelle
Dies ist schön, weil es für untergeordnete Knoten funktioniert (einige der anderen Antworten schlagen in diesem Fall aufgrund von "routing_missing_exception" fehl)
dnault
16

Torsten Engelbrechts Kommentar in der Antwort von John Petrones wurde erweitert:

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

(Ich wollte Johns Antwort nicht bearbeiten, da sie positiv bewertet wurde und als Antwort festgelegt ist und ich möglicherweise einen Fehler eingeführt habe.)

Brimstedt
quelle
1
@ChristopheRoussy Nein ohne zusätzliches Plugin, siehe Kommentare zu John Petrone Antwort
rsilva4
16

Sie können Dokumente mit der folgenden Abfrage aus dem Typ löschen:

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

Ich habe diese Abfrage in Kibana und Elastic 5.5.2 getestet

Luka Lopusina
quelle
13

Ab Elasticsearch 2.x ist das Löschen nicht mehr zulässig, da Dokumente im Index verbleiben und eine Indexbeschädigung verursachen.

Fabio Fumarola
quelle
1
Was ist die Lösung?
Christophe Roussy
1
Ich verwende eine auf Alias ​​basierende Lösung für den Index. Die Hauptidee besteht darin, jedes Mal einen neuen Index zu erstellen news1, news2 and so onund einen Alias ​​für den aktuell aktiven Index zum newsPfad einzurichten. Natürlich ist der Name des Index nur als Beispiel. Hier finden Sie ein vollständiges Beispiel für [Index-Alias] ( elastic.co/guide/en/elasticsearch/reference/current/… ) und einen Artikel, in dem eine Fallstudie erläutert wird.
Fabio Fumarola
10

Die obigen Antworten funktionieren mit ES 6.2.2 aufgrund der strengen Überprüfung des Inhaltstyps für Elasticsearch-REST-Anforderungen nicht mehr . Der curlBefehl, den ich letztendlich verwendet habe, ist folgender:

curl -H'Content-Type: application/json' -XPOST 'localhost:9200/yourindex/_doc/_delete_by_query?conflicts=proceed' -d' { "query": { "match_all": {} }}'
mindas
quelle
1
Laut den offiziellen Dokumenten musste ich den _doc-Teil der URL entfernen.
Mark Schäfer
6

In der Kibana- Konsole:

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

Sie haben diese Alternativen:

1) Löschen Sie einen ganzen Index:

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

Beispiel:

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

Weitere Details finden Sie hier - https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-delete-index.html

2) Löschen Sie per Abfrage diejenigen, die übereinstimmen:

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

* Hier ist Mentorz ein Indexname und Benutzer ein Typ

NeeruKSingh
quelle
5

Hinweis für ES2 +

Ab ES 1.5.3 ist die API zum Löschen nach Abfrage veraltet und seit ES 2.0 vollständig entfernt

Anstelle der API ist das Löschen nach Abfrage jetzt ein Plugin .

Um das Plugin "Nach Abfrage löschen" verwenden zu können, müssen Sie das Plugin auf allen Knoten des Clusters installieren:

sudo bin/plugin install delete-by-query

Alle Knoten müssen nach der Installation neu gestartet werden.


Die Verwendung des Plugins entspricht der alten API. Sie müssen nichts an Ihren Abfragen ändern - dieses Plugin lässt sie einfach funktionieren.


* Vollständige Informationen darüber, WARUM die API entfernt wurde, finden Sie hier .

Dekel
quelle
Nach meiner Erfahrung funktioniert das DeleteByQuery-Plugin bei einer großen Anzahl von Dokumenten sehr schlecht. Getestet mit ES 2.3.2.
Ibai
1
@ibai, ich habe es mit ES 2.2.0 für einen Index verwendet, der mehrere Millionen Dokumente enthält, und es hat nicht lange gedauert (ungefähr zur gleichen Zeit mit der ursprünglichen API zum Löschen per Abfrage in Version 1.7). Wie auch immer - ich denke, hier gibt es keine große Auswahl, da die API nicht mehr gültig ist.
Dekel
4

(Der Ruf ist nicht hoch genug, um einen Kommentar abzugeben.) Der zweite Teil von John Petrones Antwort funktioniert - keine Abfrage erforderlich. Der Typ und alle in diesem Typ enthaltenen Dokumente werden gelöscht. Sie können jedoch einfach neu erstellt werden, wenn Sie ein neues Dokument für diesen Typ indizieren.

Nur um klarzustellen: $ curl -XDELETE 'http://localhost:9200/twitter/tweet'

Hinweis: Dies ist die Zuordnung löschen! Wie bereits erwähnt, kann es jedoch einfach neu erstellt werden, indem ein neues Dokument erstellt wird.

Emmy R.
quelle
2
Sie löschen jedoch alle Zuordnungskonfigurationen, die Sie haben. Es wird nicht empfohlen, wenn Sie eine bestimmte Konfiguration für eine Zuordnung haben, da die dynamischen Zuordnungen nur grundlegende Felder wie Zeichenfolge, Lang usw. erstellen.
Carlos Rodriguez
1
@CarlosRodriguez, aber jedes ausgefallene Mapping, das Sie haben, sollte sich sicherlich in der Quellcodeverwaltung befinden und sehr einfach automatisch erneut anzuwenden sein, als Teil desselben Skripts, das das Löschen durchführt.
Jonathan Hartley
Diese Antwort widerspricht direkt der Frage: "Alle Dokumente löschen ... OHNE Typ löschen". Bitte machen Sie keine Annahmen darüber, wie einfach es ist, Mapping basierend auf IHREM Projekt neu zu erstellen. Andere Projekte verfügen möglicherweise über komplexere Verfahren zum Zuordnen von Versionierung / Migration / etc.
VeganHunter
3

Ich benutze Elasticsearch 7.5 und wenn ich es benutze

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

das wird unter Fehler werfen.

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

Ich muss -H 'Content-Type: application/json'der Anfrage auch einen zusätzlichen Header hinzufügen , damit es funktioniert.

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
quelle
Das funktioniert bei mir am 6.7.2.
Rooch84
0

Elasticsearch 2.3 die Option

    action.destructive_requires_name: true

in elasticsearch.yml mache die Reise

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

Wenn Sie ein Dokument nach einem Datum löschen möchten. Sie können die Kibana-Konsole verwenden (v.6.1.2).

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