Hapus semua dokumen dari indeks / tipe tanpa menghapus tipe

155

Saya tahu seseorang dapat menghapus semua dokumen dari jenis tertentu melalui deleteByQuery.

Contoh:

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

Tapi saya tidak punya istilah dan hanya ingin menghapus semua dokumen dari jenis itu, apa pun istilahnya. Apa praktik terbaik untuk mencapai ini? Istilah kosong tidak berfungsi.

Tautan ke deleteByQuery

Michael Leiss
sumber

Jawaban:

175

Saya percaya jika Anda menggabungkan penghapusan dengan permintaan dengan kecocokan semua itu harus melakukan apa yang Anda cari, sesuatu seperti ini (menggunakan contoh Anda):

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

Atau Anda bisa menghapus jenisnya:

curl -XDELETE http://localhost:9200/twitter/tweet
John Petrone
sumber
9
Jika Anda memiliki pemetaan khusus; harap dicatat bahwa opsi kedua akan menghapus jenis dan pemetaannya. Jadi jangan lupa untuk memetakan ulang tipe indeks setelah menghapus. Atau kalau tidak Anda akan kacau.
Finny Abraham
24
Ftr: di Elasticsearch 2.0 penghapusan dengan API permintaan telah dihapus dari inti dan sekarang tinggal di sebuah plugin .
dtk
2
Tidak disarankan untuk menghapus catatan dengan cara ini. Berikut adalah pernyataan dari dokumen: "itu bermasalah karena secara diam-diam memaksa penyegaran yang dapat dengan cepat menyebabkan OutOfMemoryError selama pengindeksan bersamaan" elastic.co/guide/en/elasticsearch/reference/1.7/ ...
usef_ksa
3
Ftr: Plugin delete by query akan kembali ke inti ES pada versi 5.
Val
11
Jika Anda mendapatkan kesalahan "Tidak ada penangan yang ditemukan untuk uri ...", gunakan curl -XPOST 'localhost: 9200 / twitter / tweet / _delete_by_query? Konflik = lanjutkan & cantik' -d '{"permintaan": {"match_all": {}} } '
Iqbal
70

Plugin Delete-By-Query telah dihapus demi implementasi API Delete By Query baru pada intinya. Baca di sini

curl -XPOST 'localhost:9200/twitter/tweet/_delete_by_query?conflicts=proceed&pretty' -d'
{
    "query": {
        "match_all": {}
    }
}'
Iqbal
sumber
1
Bekerja untuk saya di es 5.4
jlunavtgrad
2
Bekerja untuk saya di ES 6.1.1
Sebastian
7
Untuk ES 6+, Anda juga perlu-H 'Content-Type: application/json'
OMRY VOLK
57

Dari ElasticSearch 5.x, API delete_by_query ada secara default

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

{
    "query": { 
        "match_all": {}
    }
}
Jay Shah
sumber
Ini bagus karena berfungsi untuk simpul anak (beberapa jawaban lain gagal dalam kasus itu karena "routing_missing_exception")
dnault
16

Komentar Torsten Engelbrecht dalam jawaban John Petrones diperluas:

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

(Saya tidak ingin mengedit balasan John, karena mendapat upvotes dan ditetapkan sebagai jawaban, dan saya mungkin telah membuat kesalahan)

Brimstedt
sumber
1
@ChristopheRoussy Tidak tanpa plugin tambahan, lihat komentar pada John Petrone answer
rsilva4
16

Anda dapat menghapus dokumen dari jenis dengan kueri berikut:

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

Saya menguji permintaan ini di Kibana dan Elastic 5.5.2

Luka Lopusina
sumber
13

Mulai dari penghapusan Elasticsearch 2.x tidak lagi diizinkan, karena dokumen tetap berada di indeks yang menyebabkan korupsi indeks.

Fabio Fumarola
sumber
1
Jadi apa solusinya?
Christophe Roussy
1
Saya menggunakan solusi berdasarkan alias untuk indeks. Gagasan utamanya adalah membuat indeks baru setiap kali suka news1, news2 and so ondan mengatur alias untuk indeks aktif saat ini ke newsjalur. Tentu saja nama indeksnya hanya sebagai contoh. Di sini Anda dapat menemukan contoh lengkap untuk [alias indeks] ( elastic.co/guide/en/elasticsearch/reference/current/… ) dan artikel yang menjelaskan studi kasus.
Fabio Fumarola
10

Jawaban di atas tidak lagi berfungsi dengan ES 6.2.2 karena Memeriksa Jenis-Jenis yang Ketat untuk Permintaan REST Elasticsearch . The curlperintah yang saya akhirnya menggunakan adalah ini:

curl -H'Content-Type: application/json' -XPOST 'localhost:9200/yourindex/_doc/_delete_by_query?conflicts=proceed' -d' { "query": { "match_all": {} }}'
mindas
sumber
1
Menurut dokumen resmi saya harus menghapus bagian _doc dari URL.
Mark Schäfer
6

Di Konsol Kibana :

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

Anda memiliki alternatif ini:

1) Hapus seluruh indeks:

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

contoh:

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

Untuk detail lebih lanjut Anda dapat menemukan di sini - https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-delete-index.html

2) Hapus dengan Permintaan kepada mereka yang cocok:

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

* Di sini mentorz adalah nama indeks dan pengguna adalah tipe

NeeruKSingh
sumber
5

Catatan untuk ES2 +

Dimulai dengan ES 1.5.3 API penghapusan-oleh-permintaan sudah tidak digunakan lagi, dan sepenuhnya dihapus sejak ES 2.0

Alih-alih API, Delete By Query sekarang menjadi plugin .

Untuk menggunakan plugin Delete By Query Anda harus menginstal plugin di semua node cluster:

sudo bin/plugin install delete-by-query

Semua node harus direstart setelah instalasi.


Penggunaan plugin sama dengan API lama. Anda tidak perlu mengubah apa pun dalam kueri Anda - plugin ini hanya akan membuatnya berfungsi.


* Untuk informasi lengkap mengenai MENGAPA API dihapus, Anda dapat membaca lebih lanjut di sini .

Dekel
sumber
Dari pengalaman saya, plugin DeleteByQuery berkinerja sangat buruk dengan sejumlah besar dokumen. Diuji dengan ES 2.3.2.
ibai
1
@ibai, saya menggunakannya dengan ES 2.2.0 pada indeks berisi beberapa juta dokumen dan tidak butuh waktu lama (sekitar waktu yang sama dengan penghapusan asli dengan API permintaan yang berada di 1,7). Pokoknya - saya kira tidak ada banyak pilihan di sini, karena API tidak lagi valid.
Dekel
4

(Reputasi tidak cukup tinggi untuk dikomentari) Bagian kedua dari jawaban John Petrone berfungsi - tidak perlu kueri. Ini akan menghapus jenis dan semua dokumen yang terkandung dalam jenis itu, tetapi itu bisa saja dibuat ulang setiap kali Anda mengindeks dokumen baru ke jenis itu.

Hanya untuk mengklarifikasi: $ curl -XDELETE 'http://localhost:9200/twitter/tweet'

Catatan: ini tidak menghapus pemetaan! Tetapi seperti yang disebutkan sebelumnya, dapat dengan mudah dipetakan kembali dengan membuat dokumen baru.

Emmy R
sumber
2
Tetapi Anda menghapus semua konfigurasi pemetaan apa yang Anda miliki, itu tidak disarankan ketika Anda memiliki konfigurasi khusus untuk pemetaan apa pun, karena pemetaan dinamis hanya membuat bidang dasar seperti string, panjang, dll ...
Carlos Rodriguez
1
@CarlosRodriguez tetapi pemetaan mewah apa pun yang Anda miliki pasti harus dalam kontrol sumber, dan sangat mudah untuk secara otomatis mendaftar ulang, sebagai bagian dari skrip yang sama yang melakukan penghapusan.
Jonathan Hartley
Jawaban ini secara langsung bertentangan dengan pertanyaan: "Hapus semua dokumen ... TANPA menghapus jenis". Tolong jangan membuat asumsi betapa mudahnya membuat kembali pemetaan berdasarkan proyek ANDA. Proyek lain mungkin memiliki prosedur yang lebih kompleks untuk memetakan versi / migrasi / dll.
VeganHunter
3

Saya menggunakan elasticsearch 7.5 dan ketika saya menggunakan

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

yang akan melempar kesalahan di bawah ini.

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

Saya juga perlu menambahkan -H 'Content-Type: application/json'header tambahan dalam permintaan untuk membuatnya berfungsi.

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
sumber
Ini berfungsi untuk saya di 6.7.2.
rooch84
2

Hanya untuk menambahkan beberapa sen ke ini.

The "delete_by_query" disebutkan di atas masih tersedia sebagai plugin di 2.x. elasticsearch

Meskipun dalam versi 5.x terbaru yang akan datang itu akan diganti oleh "delete by query api"

Walaitki
sumber
0

Elasticsearch 2.3 opsi

    action.destructive_requires_name: true

di elasticsearch.yml melakukan perjalanan

    curl -XDELETE http://localhost:9200/twitter/tweet
Jansansen
sumber
-1

Jika Anda ingin menghapus dokumen berdasarkan tanggal. Anda dapat menggunakan konsol kibana (v.6.1.2)

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