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

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

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

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

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)


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


13

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


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


6

Di Konsol Kibana :

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

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


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 .


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.


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

Ini berfungsi untuk saya di 6.7.2.
rooch84


0

Elasticsearch 2.3 opsi

    action.destructive_requires_name: true

di elasticsearch.yml melakukan perjalanan

    curl -XDELETE http://localhost:9200/twitter/tweet

-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"
                              }
                        }
                  }
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.