Xóa tất cả tài liệu khỏi chỉ mục / loại mà không xóa loại


155

Tôi biết người ta có thể xóa tất cả các tài liệu từ một loại nhất định thông qua xóaByQuery.

Thí dụ:

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

Nhưng tôi KHÔNG có thuật ngữ và chỉ đơn giản là muốn xóa tất cả các tài liệu từ loại đó, bất kể thuật ngữ nào. Thực hành tốt nhất để đạt được điều này là gì? Thuật ngữ trống không hoạt động.

Liên kết đến xóaByQuery

Câu trả lời:


175

Tôi tin rằng nếu bạn kết hợp xóa bằng truy vấn với một kết quả phù hợp thì tất cả sẽ làm những gì bạn đang tìm kiếm, một cái gì đó như thế này (sử dụng ví dụ của bạn):

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

Hoặc bạn chỉ có thể xóa các loại:

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

9
Nếu bạn đang có ánh xạ tùy chỉnh; xin lưu ý rằng tùy chọn thứ hai sẽ xóa loại và ánh xạ của nó. Vì vậy, đừng quên ánh xạ lại loại chỉ mục sau khi xóa. Nếu không bạn sẽ bị rối tung lên.
Finny Abraham

24
Ftr: trong Elaticsearch 2.0, API xóa bằng truy vấn đã bị xóa khỏi lõi và hiện đang tồn tại trong một plugin .
dtk

2
Không nên xóa các bản ghi bằng cách này. Tuyên bố này từ các tài liệu: "nó có vấn đề vì nó âm thầm buộc phải làm mới có thể nhanh chóng gây ra OutOfMemoryError trong khi lập chỉ mục đồng thời" thun.co/guide/en/elaticsearch/reference/1.7/ ...
usef_ksa

3
Ftr: Plugin xóa bằng truy vấn sẽ trở lại vào lõi ES kể từ phiên bản 5.
Val

11
Nếu bạn gặp lỗi "Không tìm thấy trình xử lý cho uri ...", hãy sử dụng curl -XPOST 'localhost: 9200 / twitter / tweet / _delete_by_query? Xung đột = tiến hành & khá' -d '{"truy vấn": {"match_all": {}} } '
Iqbal

70

Plugin Xóa theo truy vấn đã bị xóa theo hướng triển khai API Xóa theo truy vấn mới trong lõi. Đọc ở đây

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

1
Làm việc cho tôi vào ngày 5,4
jlunavtgrad

2
Làm việc cho tôi trên ES 6.1.1
Sebastian

7
Đối với ES 6+ bạn cũng cần-H 'Content-Type: application/json'
OMRY VOLK

57

Từ ElasticSearch 5.x, API xóa_by_query ở đó theo mặc định

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

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

Điều này là tốt vì nó hoạt động cho các nút con (một số câu trả lời khác không thành công trong trường hợp đó do "định tuyến_missing_exception")
dnault

16

Nhận xét của Torsten Engelbrecht trong câu trả lời của John Petrones:

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

(Tôi không muốn chỉnh sửa câu trả lời của John, vì nó đã được nâng cấp và được đặt làm câu trả lời và tôi có thể đã đưa ra một lỗi)


1
@ChristopheRoussy Không có plugin bổ sung, hãy xem nhận xét về câu trả lời của John Petrone
rsilva4

16

Bạn có thể xóa tài liệu từ loại với truy vấn sau:

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

Tôi đã thử nghiệm truy vấn này trong Kibana và Đàn hồi 5.5.2


13

Bắt đầu từ Elaticsearch 2.x xóa không được phép nữa, vì các tài liệu vẫn nằm trong chỉ mục gây ra tham nhũng chỉ mục.


1
Vậy giải pháp là gì ?
Barshe Roussy

1
Tôi sử dụng một giải pháp dựa trên bí danh cho chỉ mục. Ý tưởng chính là tạo chỉ mục mới mỗi lần thích news1, news2 and so onvà thiết lập bí danh cho chỉ mục hoạt động hiện tại theo newsđường dẫn. Tất nhiên tên của chỉ mục chỉ là ví dụ. Ở đây bạn có thể tìm thấy một ví dụ hoàn chỉnh cho [bí danh chỉ mục] ( thun.co / guide / en / elaticsearch / reference / civerse / ám ) và bài viết giải thích một nghiên cứu trường hợp.
Fabio Fumarola

10

Các câu trả lời ở trên không còn hoạt động với ES 6.2.2 do Kiểm tra loại nội dung nghiêm ngặt đối với các yêu cầu REST của Elaticsearch . Các curllệnh mà tôi đã kết thúc sử dụng là:

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

1
Theo các tài liệu chính thức, tôi đã phải xóa phần _doc của URL.
Đánh dấu Schäfer

6

Trong Bảng điều khiển Kibana :

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

6

Bạn có những lựa chọn thay thế:

1) Xóa toàn bộ chỉ mục:

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

thí dụ:

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

Để biết thêm chi tiết, bạn có thể tìm thấy ở đây - https://www.elastic.co/guide/en/elSTERearch/reference/civerse/indices-delete-index.html

2) Xóa bằng Truy vấn đến những người phù hợp:

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

* Ở đây mentorz là một tên chỉ mục và người dùng là một loại


5

Lưu ý cho ES2 +

Bắt đầu với ES 1.5.3, API xóa theo truy vấn không được dùng nữa và bị xóa hoàn toàn kể từ ES 2.0

Thay vì API, Xóa theo truy vấn hiện là một plugin .

Để sử dụng plugin Xóa theo truy vấn, bạn phải cài đặt plugin trên tất cả các nút của cụm:

sudo bin/plugin install delete-by-query

Tất cả các nút phải được khởi động lại sau khi cài đặt.


Việc sử dụng plugin giống như API cũ. Bạn không cần thay đổi bất cứ điều gì trong các truy vấn của mình - plugin này sẽ chỉ khiến chúng hoạt động.


* Để biết thông tin đầy đủ về lý do TẠI SAO API đã bị xóa, bạn có thể đọc thêm tại đây .


Từ kinh nghiệm của tôi, plugin DeleteByQuery hoạt động rất kém với số lượng lớn tài liệu. Đã thử nghiệm với ES 2.3.2.
Bạch

1
@ibai, tôi đã sử dụng nó với ES 2.2.0 trên một chỉ mục chứa vài triệu tài liệu và nó không mất nhiều thời gian (cùng thời gian với việc xóa bản gốc bằng API truy vấn trong 1.7). Dù sao - tôi đoán không có nhiều sự lựa chọn ở đây, vì API không còn hợp lệ.
Dekel

4

(Danh tiếng không đủ cao để bình luận) Phần thứ hai trong câu trả lời của John Petrone hoạt động - không cần truy vấn. Nó sẽ xóa loại và tất cả các tài liệu có trong loại đó, nhưng nó chỉ có thể được tạo lại bất cứ khi nào bạn lập chỉ mục một tài liệu mới cho loại đó.

Chỉ cần làm rõ: $ curl -XDELETE 'http://localhost:9200/twitter/tweet'

Lưu ý: điều này sẽ xóa ánh xạ! Nhưng như đã đề cập trước đó, nó có thể dễ dàng được ánh xạ lại bằng cách tạo một tài liệu mới.


2
Nhưng bạn xóa tất cả cấu hình ánh xạ những gì bạn có, không nên sử dụng khi bạn có cấu hình cụ thể cho bất kỳ ánh xạ nào, bởi vì ánh xạ động chỉ tạo các trường cơ bản như chuỗi, dài, v.v ...
Carlos Rodriguez

1
@CarlosRodriguez nhưng bất kỳ ánh xạ ưa thích nào bạn có chắc chắn phải được kiểm soát nguồn và rất dễ dàng tự động áp dụng lại, như là một phần của cùng một kịch bản đang thực hiện xóa.
Jonathan Hartley

Câu trả lời này mâu thuẫn trực tiếp với câu hỏi: "Xóa tất cả tài liệu ... KHÔNG xóa loại". Vui lòng không đưa ra các giả định dễ dàng như thế nào để tạo lại ánh xạ dựa trên dự án CỦA BẠN. Các dự án khác có thể có các thủ tục phức tạp hơn để ánh xạ phiên bản / di chuyển / vv.
VeganHunter

3

Tôi đang sử dụng elaticsearch 7.5 và khi tôi sử dụng

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

mà sẽ ném dưới đây lỗi.

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

Tôi cũng cần thêm -H 'Content-Type: application/json'tiêu đề bổ sung trong yêu cầu để làm cho nó hoạt động.

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

Điều này làm việc cho tôi vào ngày 6.7.2.
rooch84


0

Elaticsearch 2.3 tùy chọn

    action.destructive_requires_name: true

trong elaticsearch.yml thực hiện chuyến đi

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

-1

Nếu bạn muốn xóa tài liệu theo một ngày. Bạn có thể sử dụng bảng điều khiển kibana (v.6.1.2)

POST index_name/_delete_by_query
{
      "query" : {
              "range" : {
                 "sendDate" : {
                     "lte" : "2018-03-06"
                              }
                        }
                  }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.