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.