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

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

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

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

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)


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


13

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


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


6

W konsoli Kibana :

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

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


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 .


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.


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

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

-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"
                              }
                        }
                  }
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.