ลบองค์ประกอบทั้งหมดที่น้อยกว่าค่าใน Elasticsearch

ฉันมีข้อมูล json ที่บันทึกไว้ต่อไปนี้ใน 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"
   }
}

ฉันต้องการลบรายการ ids ทั้งหมดซึ่ง วันหมดอายุ ของมันน้อยกว่าวันนี้โดยใช้ QueryBuilder ใน springdata Elasticsearch


comment
คุณคาดหวังผลลัพธ์ได้ประมาณกี่รหัส   -  person Val    schedule 22.10.2020
comment
อยากได้ไอดีทั้งหมด   -  person Catalina    schedule 22.10.2020
comment
คำถามของฉันคือทั้งหมดเท่าไหร่? 10, 100, 1,000, 10,000, 1M? วิธีแก้ปัญหาขึ้นอยู่กับคำตอบนั้น   -  person Val    schedule 22.10.2020
comment
มากกว่า 10,000   -  person Catalina    schedule 22.10.2020
comment
โอเค ถ้าอย่างนั้นคุณจะไม่สามารถเก็บพวกมันทั้งหมดได้ในช็อตเดียว โอเคสำหรับคุณไหม?   -  person Val    schedule 22.10.2020
comment
ใช่ แต่อะไรคือเหตุผลสำหรับสิ่งนั้น?   -  person Catalina    schedule 22.10.2020
comment
และผมแค่สงสัยเกี่ยวกับสภาพครับ...ทุกรายการที่สร้างขึ้นก่อนวันนี้ก็ค่อนข้างจะหมายความถึงทุกรายการใช่ไหมครับ? เนื่องจากไม่มีรายการที่สร้างขึ้นในอนาคต...หรือมี?   -  person Val    schedule 22.10.2020
comment
นั่นคือสิ่งที่ฉันต้องการได้รับ   -  person Catalina    schedule 22.10.2020
comment
เหตุผลก็คือ โดยค่าเริ่มต้น ES จะส่งกลับ Hit 10,000 เท่านั้น คุณสามารถยกเลิกขีดจำกัดนั้นได้ แต่อาจส่งผลต่อประสิทธิภาพการทำงาน... การทราบกรณีการใช้งานของคุณโดยละเอียดมากขึ้นจะช่วยให้คุณทราบรายละเอียดมากขึ้น   -  person Val    schedule 22.10.2020
comment
โอเค อะไรคือทางออกที่ดีที่สุดสำหรับสิ่งนั้น ฉันต้องการได้เอนทิตีเก่าทั้งหมด ซึ่งหมายถึงก่อนวันนี้   -  person Catalina    schedule 22.10.2020
comment
ไม่ใช่ทุกรายการ ในรายละเอียดเพิ่มเติมนั้นจะต้องมีวันหมดอายุซึ่งอยู่ข้างหน้า 3 วัน แต่ฉันกำลังพูดถึงตัวอย่างเล็กๆ นี้สำหรับการสาธิตเท่านั้น   -  person Catalina    schedule 22.10.2020
comment
โปรดดูโพสต์ที่อัปเดต ฉันหมายถึงวันหมดอายุ   -  person Catalina    schedule 22.10.2020
comment
เพราะหากฉันตรวจสอบว่า expirationDate ก่อนวันนี้ แสดงว่าสินค้านั้นหมดอายุ   -  person Catalina    schedule 22.10.2020
comment
ให้เราสนทนาต่อในการแชท   -  person Catalina    schedule 22.10.2020
comment
นี่คือวิธีแก้ปัญหาที่เหมาะกับคุณ: stackoverflow.com/a/37669582/4604579 อาจต้องมีการปรับเปลี่ยนบ้าง มันเป็นเวอร์ชันเก่า แต่มีคำอธิบายแนวคิดอยู่ที่นั่น เช่น การค้นหาแบบเลื่อน   -  person Val    schedule 22.10.2020
comment
คุณช่วยปรับวิธีแก้ปัญหาด้วย elastcsearch 7.6 ที่ฉันใช้อยู่ได้ไหมจะขอบคุณมาก   -  person Catalina    schedule 22.10.2020


คำตอบ (1)


ลบตามคำค้นหา คือหนทางที่จะไป

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

เอกสารประกอบไคลเอ็นต์ java ระบุว่าคุณสามารถสร้างคำขอได้ด้วยวิธีนี้:

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

ซึ่งถูกทำเครื่องหมายเป็น รองรับโดย Spring-data-elasticsearch ตั้งแต่เวอร์ชัน 3.2

ตัวอย่างเช่นคุณสามารถใช้ ที่มาของแบบสอบถาม< /ก> :

นอกจากวิธีการสืบค้นแล้ว ยังมีการสืบทอดการสืบค้นสำหรับการสืบค้นทั้งการนับและการลบอีกด้วย

ในภาคผนวก C คุณจะเห็นว่า IsLessThan เป็นคีย์เวิร์ดที่มาจากคิวรี ซึ่งหมายความว่าบางสิ่งในบรรทัดเหล่านี้ควรได้รับการสนับสนุนทันที:

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

ด้วยการใช้การสืบค้นมา คุณกำลังปล่อยให้ Spring ดำเนินการ (ลองดูว่ามันจะทำสิ่งที่ถูกต้อง)

แต่คุณยังสามารถใช้ ElasticsearchRestTemplate#delete (หากคุณใช้ ElasticsearchTemplate ที่เก่ากว่า ก็ใช้งานได้เหมือนเดิม)

สิ่งนี้ช่วยให้คุณสามารถส่งผ่านแบบสอบถามข้อมูลสปริง (เนทีฟ สตริง หรือเกณฑ์)

person GPI    schedule 06.11.2020
comment
แต่จะสร้างฟังก์ชั่นที่รองรับแบบสอบถามนี้โดยใช้ QueryBuilder หรือ API ที่คล้ายกันได้อย่างไร หรือ DeleteRequestBuilder ใน springboot - person Catalina; 06.11.2020
comment
ฉันได้เพิ่มรายละเอียดแล้ว แต่จริงๆ แล้วนี่เป็นเพียงข้อมูล Spring data / Spring es มาตรฐาน - person GPI; 06.11.2020
comment
ฉันมีภารกิจสุดท้ายโปรดมีวิธีใดที่จะอัปเดตวันหมดอายุทั้งหมดให้เป็นเวลาปัจจุบันได้หรือไม่ expiratonDAte น้อยกว่าเวลาปัจจุบันและอัปเดตเป็นเวลาปัจจุบัน โปรดช่วยฉันด้วย - person Catalina; 09.11.2020
comment
มีอยู่บ้าง แต่ elasticsearch ไม่ได้รับการปรับให้เหมาะสมสำหรับสิ่งนี้เลย ดังนั้นจึงมีค่าใช้จ่ายสูงมาก (โดยพื้นฐานแล้วจะต้องสร้างดัชนีทั้งหมดใหม่) แต่นี่เป็นอีกคำถามหนึ่ง ดังนั้นโปรดถามคำถามแยกต่างหาก - person GPI; 09.11.2020
comment
โปรดช่วยฉัน: stackoverflow.com/questions/64771780/ - person Catalina; 10.11.2020