Türü silmeden dizin / türdeki tüm belgeleri sil


156

Biri deleteByQuery aracılığıyla belirli bir türden tüm belgeleri silebilir biliyorum.

Misal:

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

Ama hiçbir terim var ve sadece hangi terim olursa olsun, bu türdeki tüm belgeleri silmek istiyorum. Bunu başarmak için en iyi uygulama nedir? Boş terim çalışmıyor.

DeleteByQuery bağlantısı

Yanıtlar:


175

Eğer bir silme ile sorgu ile birleştirmek tüm aradığınızı, böyle bir şey (örneğin kullanarak) yapmanız gerekir birleştirmek inanıyorum:

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

Veya sadece türü silebilirsiniz:

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

9
Özel eşlemeleriniz varsa; ikinci seçeneğin türü ve eşlemelerini sileceğini unutmayın. Bu nedenle, sildikten sonra dizin türünü yeniden eşlemeyi unutmayın. Yoksa mahvolursun.
Finny Abraham

24
Ftr: Elasticsearch 2.0'da sorgu ile API'yi silme çekirdekten kaldırıldı ve şimdi bir eklentide yaşıyor .
dtk

2
Kayıtların bu şekilde silinmesi önerilmez. "Dokümanlardan gelen ifade:" sorunlu çünkü eşzamanlı indeksleme sırasında hızlı bir şekilde OutOfMemoryError'a neden olabilecek bir yenilemeyi zorladığı için " elastik.co/guide/tr/elasticsearch/reference/1.7/ …
usef_ksa

3
Ftr: Sorgu eklentisine göre silme , sürüm 5 itibariyle ES çekirdeğine geri dönecek
Val

11
"Uri ... için işleyici bulunamadı" hatası alırsanız, curl -XPOST 'localhost kullanın: 9200 / twitter / tweet / _delete_by_query? Çakışmaları = devam et & pretty' -d '{"query": {"match_all": {}} } '
İkbal

71

Sorguya göre Sil eklentisi, çekirdekte yeni bir Sorguya Göre Sil API uygulaması lehine kaldırıldı. Burayı oku

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

1
Es 5.4
jlunavtgrad

2
ES 6.1.1
Sebastian

7
ES 6+ için de ihtiyacınız var-H 'Content-Type: application/json'
OMRY VOLK

57

Elastik Arama 5.x sürümünden, delete_by_query API varsayılan olarak oradadır

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

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

Bu güzel çünkü çocuk düğümleri için çalışıyor (bu durumda "routing_missing_exception" nedeniyle diğer yanıtların bazıları başarısız oluyor)
dnault

16

Torsten Engelbrecht'in John Petrones cevabındaki yorumu genişletildi:

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

(John'un cevabını düzenlemek istemedim, çünkü oyları aldı ve cevap olarak ayarlandı ve bir hata getirmiş olabilirim)



16

Aşağıdaki sorgu ile belgeleri türden silebilirsiniz:

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

Bu sorguyu Kibana ve Elastik 5.5.2'de test ettim


13

Elasticsearch 2.x 'ten başlayarak silinmeye artık izin verilmez, çünkü dokümanlar dizinde kalır ve dizin bozulmasına neden olur.


1
Peki çözüm nedir?
Christophe Roussy

1
İndeks için takma isme dayalı bir çözüm kullanıyorum. Ana fikir, her seferinde yeni dizin oluşturmak news1, news2 and so onve newsyol için geçerli etkin dizin için bir takma ad oluşturmaktır . Tabii ki indeksin adı sadece örnek olarak verilebilir. Burada [dizin takma adı] ( elastik.co/guide/tr/elasticsearch/reference/current/… ) ve örnek olayı açıklayan makale için tam bir örnek bulabilirsiniz .
Fabio Fumarola


6

In Kibana Konsolundan:

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

6

Şu alternatiflere sahipsiniz:

1) Bir dizinin tamamını silin:

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

misal:

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

Daha fazla ayrıntı için burada bulabilirsiniz - https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-delete-index.html

2) Eşleşenlere Sorgu ile Sil :

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

* Burada mentorz bir dizin adı ve kullanıcılar bir tür


5

ES2 + için not

ES 1.5.3'ten başlayarak, sorgula silme API'sı kullanımdan kaldırılmıştır ve ES 2.0'dan bu yana tamamen kaldırılmıştır

API yerine, Sorguya Göre Sil artık bir eklentidir .

Sorguya Göre Sil eklentisini kullanmak için eklentiyi kümenin tüm düğümlerine yüklemeniz gerekir:

sudo bin/plugin install delete-by-query

Kurulumdan sonra tüm düğümlerin yeniden başlatılması gerekir.


Eklentinin kullanımı eski API ile aynıdır. Sorgularınızda hiçbir şeyi değiştirmenize gerek yoktur - bu eklenti sadece onları çalıştıracaktır.


* API'nın neden kaldırıldığına ilişkin eksiksiz bilgi için buradan daha fazla bilgi edinebilirsiniz .


Deneyimlerime göre, DeleteByQuery eklentisi büyük miktarda belge ile çok kötü performans gösteriyor. ES 2.3.2 ile test edilmiştir.
ibai

1
@ibai, birkaç milyon belge içeren bir dizinde ES 2.2.0 ile kullandım ve uzun sürmedi (yaklaşık olarak 1.7'deki sorgu API'sı ile orijinal silme ile aynı zamanda). Her neyse - Sanırım API artık geçerli olmadığı için burada fazla seçenek yok.
Dekel

4

(İtibar yorum yapmak için yeterince yüksek değil) John Petrone'un cevabının ikinci kısmı çalışıyor - sorguya gerek yok. Türü ve bu türdeki tüm belgeleri siler, ancak bu tür yeni bir belgeyi her tür dizine eklediğinizde yeniden oluşturulabilir.

Sadece netleştirmek için: $ curl -XDELETE 'http://localhost:9200/twitter/tweet'

Not: Bu mu eşleştirme silin! Ancak daha önce de belirtildiği gibi, yeni bir belge oluşturarak kolayca yeniden eşlenebilir.


2
Ancak, sahip olduğunuz tüm eşleme yapılandırmasını silersiniz, herhangi bir eşleme için belirli bir yapılandırmanız olduğunda önerilmez, çünkü dinamik eşlemeler yalnızca dize, uzun, vb. Gibi temel alanlar oluşturur ...
Carlos Rodriguez

1
@CarlosRodriguez ancak sahip olduğunuz herhangi bir süslü haritalama mutlaka kaynak kontrolünde olmalı ve silme işlemini yapan aynı komut dosyasının bir parçası olarak otomatik olarak yeniden uygulanması çok kolay olmalıdır.
Jonathan Hartley

Bu yanıt şu soruyla doğrudan çelişir: "Tüm belgeleri sil ... türü silinmeden". Lütfen projenize göre eşlemeyi yeniden oluşturmanın ne kadar kolay olduğunu varsaymayın. Diğer projeler, sürüm oluşturma / taşıma / vb. Eşlemek için daha karmaşık prosedürlere sahip olabilir.
VeganHunter

3

Elasticsearch 7.5 kullanıyorum ve

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

hangi hata altına atar.

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

Ayrıca -H 'Content-Type: application/json', çalışmasını sağlamak için isteğe ekstra başlık eklemem gerekiyor .

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

Bu benim için 6.7.2'de çalışıyor.
rooch84


0

Elasticsearch 2.3 seçeneği

    action.destructive_requires_name: true

elasticsearch.yml yolculuk yapmak

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

-1

Belgeyi tarihe göre silmek istiyorsanız. Kibana konsolunu kullanabilirsiniz (v.6.1.2)

POST index_name/_delete_by_query
{
      "query" : {
              "range" : {
                 "sendDate" : {
                     "lte" : "2018-03-06"
                              }
                        }
                  }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.