Usuń wszystkie dokumenty z indeksu / typu bez usuwania typu

155

Wiem, że można usunąć wszystkie dokumenty określonego typu za pomocą funkcji deleteByQuery.

Przykład:

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

Ale NIE mam terminu i po prostu chcę usunąć wszystkie dokumenty tego typu, bez względu na termin. Jaka jest najlepsza praktyka, aby to osiągnąć? Pusty termin nie działa.

Link do deleteByQuery

Michael Leiss
źródło

Odpowiedzi:

175

Uważam, że jeśli połączysz usuwanie przez zapytanie z dopasowaniem, wszystko powinno zrobić to, czego szukasz, coś takiego (na przykładzie):

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

Lub możesz po prostu usunąć typ:

curl -XDELETE http://localhost:9200/twitter/tweet
John Petrone
źródło
9
Jeśli masz niestandardowe mapowania; zwróć uwagę, że druga opcja usunie typ i jego mapowania. Więc nie zapomnij zmienić typu indeksu po usunięciu. Albo będziesz pomieszany.
Finny Abraham
24
Ftr: w Elasticsearch 2.0 interfejs API usuwania przez zapytanie został usunięty z rdzenia i obecnie znajduje się we wtyczce .
dtk
2
Nie zaleca się usuwania rekordów w ten sposób. Oto oświadczenie z dokumentacji: "jest to problematyczne, ponieważ po cichu wymusza odświeżenie, które może szybko spowodować błąd OutOfMemoryError podczas jednoczesnego indeksowania" flexible.co/guide/en/elasticsearch/reference/1.7/ …
usef_ksa
3
Ftr: Wtyczka usuwania przez zapytanie powróci do rdzenia ES od wersji 5.
Val
11
Jeśli pojawi się błąd „Nie znaleziono modułu obsługi dla uri ...”, użyj curl -XPOST 'localhost: 9200 / twitter / tweet / _delete_by_query? Conseilts = kontynuuj & całkiem' -d '{"query": {"match_all": {}} } '
Iqbal
70

Wtyczka Usuń według zapytania została usunięta na rzecz nowej implementacji interfejsu API Usuń według zapytania w rdzeniu. Przeczytaj tutaj

curl -XPOST 'localhost:9200/twitter/tweet/_delete_by_query?conflicts=proceed&pretty' -d'
{
    "query": {
        "match_all": {}
    }
}'
Iqbal
źródło
1
Pracował dla mnie na es 5.4
jlunavtgrad
2
Pracował dla mnie w ES 6.1.1
Sebastian
7
W przypadku ES 6+ potrzebujesz również-H 'Content-Type: application/json'
OMRY VOLK
57

Od ElasticSearch 5.x interfejs API delete_by_query jest dostępny domyślnie

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

{
    "query": { 
        "match_all": {}
    }
}
Jay Shah
źródło
To fajne, ponieważ działa dla węzłów potomnych (niektóre inne odpowiedzi zawodzą w tym przypadku z powodu „routing_missing_exception”)
dnault
16

Komentarz Torstena Engelbrechta w odpowiedzi Johna Petronesa rozszerzony:

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

(Nie chciałem edytować odpowiedzi Johna, ponieważ otrzymała głosy za i została ustawiona jako odpowiedź, a mogłem wprowadzić błąd)

Brimstedt
źródło
1
@ChristopheRoussy Nie bez dodatkowej wtyczki, zobacz komentarze do odpowiedzi Johna Petrone
rsilva4
16

Możesz usunąć dokumenty z typu za pomocą następującego zapytania:

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

Przetestowałem to zapytanie w Kibanie i Elastic 5.5.2

Luka Lopusina
źródło
13

Rozpoczynanie od Elasticsearch 2.x usuwanie nie jest już dozwolone, ponieważ dokumenty pozostają w indeksie, powodując uszkodzenie indeksu.

Fabio Fumarola
źródło
1
Więc jakie jest rozwiązanie?
Christophe Roussy
1
Korzystam z rozwiązania opartego na aliasie dla indeksu. Główną ideą jest tworzenie nowego indeksu za każdym razem jak news1, news2 and so oni ustawianie aliasu dla bieżącego aktywnego indeksu do newsścieżki. Oczywiście nazwa indeksu jest tylko przykładem. Tutaj znajdziesz kompletny przykład dla [alias indeksu] ( elast.co/guide/en/elasticsearch/reference/current/… ) oraz artykuł wyjaśniający studium przypadku.
Fabio Fumarola
10

Powyższe odpowiedzi nie działają już z ES 6.2.2 z powodu Ścisłego sprawdzania typu zawartości dla żądań REST Elasticsearch . curlPoleceń, które skończyło się przy użyciu to:

curl -H'Content-Type: application/json' -XPOST 'localhost:9200/yourindex/_doc/_delete_by_query?conflicts=proceed' -d' { "query": { "match_all": {} }}'
mindas
źródło
1
Zgodnie z oficjalną dokumentacją musiałem usunąć część _doc adresu URL.
Mark Schäfer
6

W konsoli Kibana :

POST calls-xin-test-2/_delete_by_query
{
  "query": { 
    "match_all": {}
  }
}
Xin
źródło
6

Masz te alternatywy:

1) Usuń cały indeks:

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

przykład:

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

Więcej informacji można znaleźć tutaj - https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-delete-index.html

2) Usuń według zapytania do tych, które pasują:

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

* Tutaj mentorz to nazwa indeksu, a użytkownicy to typ

NeeruKSingh
źródło
5

Uwaga dotycząca ES2 +

Począwszy od wersji ES 1.5.3, interfejs API usuwania przez zapytanie jest przestarzały i został całkowicie usunięty od wersji ES 2.0

Zamiast API, Delete By Query jest teraz wtyczką .

Aby skorzystać z wtyczki Delete By Query, musisz zainstalować wtyczkę na wszystkich węzłach klastra:

sudo bin/plugin install delete-by-query

Po instalacji wszystkie węzły muszą zostać ponownie uruchomione.


Korzystanie z wtyczki jest takie samo jak w starym API. Nie musisz niczego zmieniać w zapytaniach - ta wtyczka sprawi, że będą działać.


* Aby uzyskać pełne informacje dotyczące DLACZEGO usunięto API, możesz przeczytać więcej tutaj .

Dekel
źródło
Z mojego doświadczenia wynika, że ​​wtyczka DeleteByQuery działa bardzo słabo z dużą ilością dokumentów. Testowane z ES 2.3.2.
ibai
1
@ibai, użyłem go z ES 2.2.0 w indeksie zawierającym kilka milionów dokumentów i nie zajęło to dużo czasu (mniej więcej w tym samym czasie z oryginalnym interfejsem API usuwania przez zapytanie, które było w 1.7). W każdym razie - wydaje mi się, że nie ma tu dużego wyboru, ponieważ API jest już nieaktualne.
Dekel
4

(Reputacja nie jest wystarczająco wysoka, aby móc komentować) Druga część odpowiedzi Johna Petrone działa - nie jest potrzebne żadne zapytanie. Spowoduje to usunięcie typu i wszystkich dokumentów zawartych w tym typie, ale można je po prostu ponownie utworzyć za każdym razem, gdy indeksujesz nowy dokument do tego typu.

Aby wyjaśnic: $ curl -XDELETE 'http://localhost:9200/twitter/tweet'

Uwaga: to nie usunąć mapowanie! Ale jak wspomniano wcześniej, można go łatwo odwzorować, tworząc nowy dokument.

Emmy R.
źródło
2
Ale usuwasz całą konfigurację mapowania, co masz, nie jest to zalecane, gdy masz określoną konfigurację dla dowolnego mapowania, ponieważ dynamiczne mapowania tworzą tylko podstawowe pola, takie jak ciąg, długie itp.
Carlos Rodriguez
1
@CarlosRodriguez, ale wszelkie wymyślne mapowania, które masz, z pewnością powinny znajdować się w kontroli źródła i bardzo łatwe do automatycznego ponownego zastosowania, jako część tego samego skryptu, który wykonuje usuwanie.
Jonathan Hartley
Ta odpowiedź bezpośrednio zaprzecza pytaniu: „Usuń wszystkie dokumenty ... BEZ usuwania typu”. Nie zakładaj, jak łatwo jest odtworzyć mapowanie na podstawie TWOJEGO projektu. Inne projekty mogą mieć bardziej złożone procedury mapowania wersji / migracji / itp.
VeganHunter,
3

Używam Flexiblesearch 7.5 i kiedy używam

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

który wyrzuci poniżej błąd.

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

Muszę również dodać dodatkowy -H 'Content-Type: application/json'nagłówek w żądaniu, aby działało.

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
źródło
To działa dla mnie na 6.7.2.
rooch84
0

Elasticsearch 2.3 opcja

    action.destructive_requires_name: true

w elasticsearch.yml wybierz się w podróż

    curl -XDELETE http://localhost:9200/twitter/tweet
JJANSSEN
źródło
-1

Jeśli chcesz usunąć dokument według daty. Możesz użyć konsoli Kibana (wersja 6.1.2)

POST index_name/_delete_by_query
{
      "query" : {
              "range" : {
                 "sendDate" : {
                     "lte" : "2018-03-06"
                              }
                        }
                  }
}
SerefAltindal
źródło