hapus semua elemen yang kurang dari nilai di Elasticsearch

Saya memiliki data json tersimpan berikut di Elasticsearch:

   {
   "id":"1234",
   "expirationDate":"17343234234",
   "paths":"http:localhost:9090",
   "work":"software dev",
   "family":{
      "baba":"jams",
      "mother":"ela"
   }
},
{
   "id":"00021",
   "expirationDate":"0123234",
   "paths":"http:localhost:8080",
   "work":"software engi",
   "family":{
      "baba":"stev",
      "mother":"hela"
   }
}

saya ingin menghapus semua daftar id yang tanggal kadaluwarsanya lebih kecil dari hari ini menggunakan QueryBuilder di springdata Elasticsearch


person Catalina    schedule 22.10.2020    source sumber
comment
Kira-kira berapa banyak id dalam hasil yang Anda harapkan?   -  person Val    schedule 22.10.2020
comment
Saya ingin mendapatkan semua id   -  person Catalina    schedule 22.10.2020
comment
pertanyaan saya adalah berapa semuanya? 10, 100, 1000, 10000, 1 juta? solusinya tergantung pada jawaban itu   -  person Val    schedule 22.10.2020
comment
Lebih dari 10.000   -  person Catalina    schedule 22.10.2020
comment
Oke, kalau begitu Anda tidak akan bisa mendapatkan semuanya sekaligus, oke?   -  person Val    schedule 22.10.2020
comment
Ya, tapi apa alasannya?   -  person Catalina    schedule 22.10.2020
comment
Dan saya hanya penasaran dengan kondisinya... semua item yang dibuat sebelum hari ini, berarti semua item, bukan? karena tidak ada item yang dibuat di masa depan... atau benarkah?   -  person Val    schedule 22.10.2020
comment
Persis seperti itulah yang ingin saya dapatkan   -  person Catalina    schedule 22.10.2020
comment
Alasannya adalah secara default, ES hanya akan mengembalikan 10 ribu hit. Anda dapat menghilangkan batas tersebut, namun hal ini dapat berdampak pada kinerja... Akan sangat membantu jika Anda mengetahui kasus penggunaan Anda secara lebih detail.   -  person Val    schedule 22.10.2020
comment
Oke apa solusi terbaik untuk itu, saya ingin mendapatkan semua entitas lama, artinya sebelum hari ini   -  person Catalina    schedule 22.10.2020
comment
Tidak semua item, lebih detailnya akan ada tanggal kadaluwarsanya 3 hari ke depan, tapi saya fokus pada contoh kecil ini hanya untuk demo   -  person Catalina    schedule 22.10.2020
comment
Silakan lihat posting yang diperbarui, maksud saya Tanggal Kedaluwarsa   -  person Catalina    schedule 22.10.2020
comment
Karena jika saya cek apakah tanggal kadaluwarsanya sebelum hari ini maka barang tersebut sudah kadaluwarsa   -  person Catalina    schedule 22.10.2020
comment
Mari kita melanjutkan diskusi ini dalam chat.   -  person Catalina    schedule 22.10.2020
comment
Berikut adalah solusi yang cocok untuk Anda: stackoverflow.com/a/37669582/4604579, mungkin perlu beberapa adaptasi mengingat itu untuk versi yang lebih lama, tetapi konsepnya dijelaskan di sana, yaitu pencarian yang digulir.   -  person Val    schedule 22.10.2020
comment
Bisakah Anda mengadaptasi solusinya dengan elastcsearch 7.6 yang saya gunakan, saya sangat berterima kasih   -  person Catalina    schedule 22.10.2020


Jawaban (1)


Ya, hapus berdasarkan kueri adalah cara untuk pergi.

POST /{your_index_name}/_delete_by_query
{
  "query": {
    "range": {
      "expirationDate": {
        "lt": "{your_timestamp}"
      }
    }
  } 
}

dokumentasi klien Java menunjukkan bahwa Anda dapat membuat permintaan dengan cara ini:

BulkByScrollResponse response =
  new DeleteByQueryRequestBuilder(client, DeleteByQueryAction.INSTANCE)
    .filter(QueryBuilders.matchQuery("gender", "male")) 
    .source("persons")                                  
    .get();                                             
long deleted = response.getDeleted();

Ini ditandai sebagai didukung oleh Spring-data-elasticsearch sejak versi 3.2.

Misalnya, Anda dapat menggunakan derivasi kueri :

Selain metode kueri, derivasi kueri untuk kueri hitungan dan penghapusan juga tersedia.

Di Lampiran C, Anda dapat melihat bahwa IsLessThan adalah kata kunci derivasi kueri, yang berarti sesuatu seperti ini harus didukung secara langsung:

interface YourRepository extends CrudRepository<User, Long> {
  long deleteByExpirationDateIsLessThan(long timestamp);
}

Dengan menggunakan derivasi kueri, Anda membiarkan pegas melakukan implementasi (semoga saja itu akan melakukan hal yang benar).

Namun Anda juga dapat menggunakan ElasticsearchRestTemplate#delete (jika Anda menggunakan ElasticsearchTemplate lama, cara kerjanya sama).

Ini memungkinkan Anda meneruskan kueri data pegas apa pun (Asli, String, atau kriteria).

person GPI    schedule 06.11.2020
comment
tetapi bagaimana cara membuat fungsi yang mendukung kueri ini menggunakan QueryBuilder atau API serupa? atau DeleteRequestBuilder di springboot - person Catalina; 06.11.2020
comment
Saya telah menambahkan detailnya, tapi sungguh, ini hanya data standar Spring/Spring es. - person GPI; 06.11.2020
comment
Saya punya pertanyaan terakhir, apakah ada cara untuk memperbarui semua Tanggal Kedaluwarsa menjadi waktu saat ini? jadi apakah kadaluwarsanya kurang dari waktu saat ini, lalu diperbarui ke waktu hari ini, tolong bantu saya - person Catalina; 09.11.2020
comment
Memang ada, tetapi elasticsearch tidak dioptimalkan untuk ini sama sekali sehingga sangat mahal (pada dasarnya memerlukan pembangunan kembali seluruh indeks). Tapi ini adalah pertanyaan lain, jadi silakan tanyakan dalam pertanyaan terpisah. - person GPI; 09.11.2020
comment
tolong bantu saya: stackoverflow.com/questions/64771780/ - person Catalina; 10.11.2020