ลบเอกสารทั้งหมดจากดัชนี / ประเภทโดยไม่ลบประเภท


155

ฉันรู้ว่าสามารถลบเอกสารทั้งหมดจากบางประเภทผ่าน deleteByQuery

ตัวอย่าง:

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

แต่ฉันไม่มีคำศัพท์และต้องการลบเอกสารทั้งหมดจากประเภทนั้นไม่ว่าจะเป็นคำใด อะไรคือวิธีปฏิบัติที่ดีที่สุดในการบรรลุเป้าหมายนี้? คำว่างเปล่าไม่ทำงาน

ลิงก์ไปที่ deleteByQuery

คำตอบ:


175

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

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

หรือคุณสามารถลบประเภท:

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

9
หากคุณมีการแมปที่กำหนดเอง; โปรดทราบว่าตัวเลือกที่สองจะลบประเภทและการแมป ดังนั้นอย่าลืมทำการแมปประเภทดัชนีใหม่อีกครั้งหลังจากลบ มิฉะนั้นคุณจะต้องเลอะ
Finny Abraham

24
ftr: ใน ElasticSearch 2.0 ลบโดย API แบบสอบถามได้ถูกลบออกจากแกนกลางและตอนนี้อาศัยอยู่ในปลั๊กอิน
dtk

2
ไม่แนะนำให้ลบระเบียนด้วยวิธีนี้นี่เป็นคำสั่งจากเอกสาร: "มันเป็นปัญหาเนื่องจากมันบังคับให้รีเฟรชอย่างเงียบ ๆ ซึ่งอาจทำให้เกิด OutOfMemoryError ในระหว่างการจัดทำดัชนีพร้อมกันอย่างรวดเร็ว" elastic.co/guide/en/elasticsearch/reference/1.7/ …
usef_ksa

3
Ftr: ปลั๊กอินลบโดยการสืบค้นจะกลับสู่ ES coreตั้งแต่เวอร์ชัน 5
Val

11
หากคุณได้รับข้อผิดพลาด "ไม่พบตัวจัดการสำหรับ uri ... " ให้ใช้ curl -XPOST 'localhost: 9200 / twitter / tweet / _delete_by_query? ขัดแย้ง = ดำเนินการ & สวย' -d '{"การจับคู่": {} }'
อิคบาล

70

ปลั๊กอินลบโดยแบบสอบถามได้ถูกลบไปในความโปรดปรานของการใช้งานใหม่ API ลบโดยแบบสอบถามในแกนกลาง อ่านที่นี่

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

1
ทำงานให้ฉันในวันที่ 5.4
jlunavtgrad

2
ทำงานให้ฉันใน ES 6.1.1
เซบาสเตียน

7
สำหรับ ES 6+ คุณต้องใช้-H 'Content-Type: application/json'
OMRY VOLK

57

จาก ElasticSearch 5.x จะมี delete_by_query API เป็นค่าเริ่มต้น

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

{
    "query": { 
        "match_all": {}
    }
}

นี่เป็นสิ่งที่ดีเพราะมันใช้งานได้กับโหนดลูก (บางคำตอบอื่น ๆ ล้มเหลวในกรณีนั้นเนื่องจาก "routing_missing_exception")
dnault

16

ความคิดเห็นของ Torsten Engelbrecht ในคำตอบของ John Petrones ได้ขยายออกไป:

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

(ฉันไม่ต้องการแก้ไขคำตอบของ John เนื่องจากมี upvotes และตั้งเป็นคำตอบและฉันอาจแนะนำข้อผิดพลาด)


1
@ChristopheRoussy ไม่ต้องใช้ปลั๊กอินเพิ่มเติมดูความคิดเห็นเกี่ยวกับคำตอบของ John Petrone
rsilva4

16

คุณสามารถลบเอกสารจากประเภทด้วยแบบสอบถามต่อไปนี้:

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

ฉันทดสอบข้อความค้นหานี้ใน Kibana และ Elastic 5.5.2


13

ไม่อนุญาตให้เริ่มต้นจาก Elasticsearch 2.x อีกต่อไปเนื่องจากเอกสารยังคงอยู่ในดัชนีที่ทำให้ดัชนีเสียหาย


1
แล้วทางออกคืออะไร?
Christophe Roussy

1
ฉันใช้วิธีแก้ไขตามนามแฝงสำหรับดัชนี แนวคิดหลักคือการสร้างดัชนีใหม่ทุกครั้งที่ต้องการnews1, news2 and so onและตั้งค่านามแฝงสำหรับดัชนีที่ใช้งานปัจจุบันไปยังnewsเส้นทาง แน่นอนว่าชื่อของดัชนีนั้นเป็นเพียงตัวอย่างเท่านั้น ที่นี่คุณสามารถดูตัวอย่างที่สมบูรณ์สำหรับ [ดัชนีนามแฝง] ( elastic.co/guide/en/elasticsearch/reference/current/… ) และบทความที่อธิบายกรณีศึกษา
Fabio Fumarola

10

คำตอบข้างต้นไม่ทำงานกับ ES 6.2.2 เนื่องจากการเข้มงวดประเภทเนื้อหาการตรวจสอบสำหรับการร้องขอ ElasticSearch REST curlคำสั่งที่ฉันสิ้นสุดที่ใช้คือ:

curl -H'Content-Type: application/json' -XPOST 'localhost:9200/yourindex/_doc/_delete_by_query?conflicts=proceed' -d' { "query": { "match_all": {} }}'

1
ตามเอกสารอย่างเป็นทางการฉันต้องลบส่วน _doc ของ URL
Mark Schäfer


6

คุณมีทางเลือกเหล่านี้:

1) ลบดัชนีทั้งหมด:

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

ตัวอย่าง:

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

สำหรับรายละเอียดเพิ่มเติมคุณสามารถค้นหาได้ที่นี่ - https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-delete-index.html

2) ลบโดยการสืบค้นกับผู้ที่ตรงกัน:

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

* ที่นี่mentorzเป็นชื่อดัชนีและผู้ใช้เป็นประเภท


5

หมายเหตุสำหรับES2 +

เริ่มต้นด้วย ES 1.5.3 API การลบโดยการสอบถามเลิกใช้แล้วและถูกลบตั้งแต่ ES 2.0

แทนที่จะเป็น API ตอนนี้ลบโดยแบบสอบถามเป็นปลั๊กอินลบโดยแบบสอบถามในขณะนี้คือปลั๊กอิน

ในการใช้ปลั๊กอินลบโดยแบบสอบถามคุณต้องติดตั้งปลั๊กอินบนโหนดทั้งหมดของคลัสเตอร์:

sudo bin/plugin install delete-by-query

โหนดทั้งหมดต้องเริ่มต้นใหม่หลังจากการติดตั้ง


การใช้งานปลั๊กอินนั้นเหมือนกับ API เก่า คุณไม่จำเป็นต้องเปลี่ยนแปลงอะไรในการสืบค้น - ปลั๊กอินนี้จะทำให้มันทำงานได้


* สำหรับข้อมูลที่สมบูรณ์เกี่ยวกับทำไม API จะถูกลบออกคุณสามารถอ่านรายละเอียดเพิ่มเติมที่นี่


จากประสบการณ์ของฉันปลั๊กอิน DeleteByQuery ทำงานได้ไม่ดีกับเอกสารจำนวนมาก ทดสอบกับ ES 2.3.2
ibai

1
@ibai ฉันใช้กับ ES 2.2.0 ในดัชนีมีเอกสารหลายล้านฉบับและใช้เวลาไม่นาน (ประมาณเวลาเดียวกันกับการลบแบบเดิมโดยการสืบค้น API ที่เป็น 1.7) อย่างไรก็ตาม - ฉันเดาว่าไม่มีตัวเลือกมากมายที่นี่เนื่องจาก API ไม่ถูกต้องอีกต่อไป
Dekel

4

(ชื่อเสียงไม่สูงพอที่จะแสดงความคิดเห็น) ส่วนที่สองของคำตอบของ John Petrone ทำงานได้ - ไม่ต้องสืบค้น มันจะลบประเภทและเอกสารทั้งหมดที่มีอยู่ในประเภทนั้น แต่จะสามารถสร้างขึ้นใหม่เมื่อใดก็ตามที่คุณทำดัชนีเอกสารใหม่เป็นประเภทนั้น

เพียงชี้แจง: $ curl -XDELETE 'http://localhost:9200/twitter/tweet'

หมายเหตุ: นี้ไม่ลบการทำแผนที่! แต่ดังที่ได้กล่าวไว้ก่อนหน้านี้มันสามารถถูกแมปใหม่ได้อย่างง่ายดายโดยการสร้างเอกสารใหม่


2
แต่คุณลบการกำหนดค่าการแมปทั้งหมดที่มีอยู่ไม่แนะนำให้ใช้เมื่อคุณมีการกำหนดค่าเฉพาะสำหรับการจับคู่ใด ๆ เนื่องจากการแมปแบบไดนามิกจะสร้างเฉพาะฟิลด์พื้นฐานเช่นสตริงยาว ฯลฯ ...
Carlos Rodriguez

1
@CarlosRodriguez แต่การทำแผนที่แฟนซีใด ๆ ที่คุณควรจะอยู่ในการควบคุมแหล่งที่มาและง่ายมากที่จะสมัครใหม่โดยอัตโนมัติซึ่งเป็นส่วนหนึ่งของสคริปต์เดียวกันที่ทำการลบ
Jonathan Hartley

คำตอบนี้ขัดแย้งกับคำถามโดยตรง: "ลบเอกสารทั้งหมด ... โดยไม่ลบประเภท" โปรดอย่าตั้งสมมติฐานว่าการสร้างการแมปตามโครงการของคุณเป็นเรื่องง่ายเพียงใด โครงการอื่น ๆ อาจมีขั้นตอนที่ซับซ้อนกว่าสำหรับการจับคู่การกำหนดเวอร์ชัน / การย้าย / ฯลฯ
VeganHunter

3

ฉันใช้ elasticsearch 7.5 และเมื่อฉันใช้

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

ซึ่งจะโยนข้อผิดพลาดด้านล่าง

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

ฉันต้องเพิ่ม-H 'Content-Type: application/json'ส่วนหัวพิเศษในคำขอเพื่อให้ใช้งานได้

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

สิ่งนี้ใช้ได้กับฉันใน 6.7.2
rooch84

2

เพียงเพื่อเพิ่มคู่เซ็นต์นี้

"delete_by_query"กล่าวถึงที่ด้านบนยังคงมีอยู่เป็นปลั๊กอินใน 2.x. ElasticSearch

แม้ว่าในเวอร์ชัน 5.x ที่กำลังจะมาถึงล่าสุดมันจะถูกแทนที่ด้วย "delete by query api"


0

Elasticsearch 2.3 ตัวเลือก

    action.destructive_requires_name: true

ใน elasticsearch.yml ทำการเดินทาง

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

-1

หากคุณต้องการลบเอกสารตามวันที่ คุณสามารถใช้คอนโซล kibana (v.6.1.2)

POST index_name/_delete_by_query
{
      "query" : {
              "range" : {
                 "sendDate" : {
                     "lte" : "2018-03-06"
                              }
                        }
                  }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.