Видалити всі документи з індексу / типу без видалення типу


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
Якщо у вас є власні відображення; зауважте, що другий варіант видалить тип та його відображення. Тому не забудьте перезаписати тип індексу після видалення. Інакше вас заплутають.
Фінні Авраам

24
Ftr: в Elasticsearch 2.0 видалення за запитом API було видалено з ядра і тепер живе в плагіні .
dtk

2
Не рекомендується видаляти записи таким чином. Ось твердження з документів: "Це проблематично, оскільки він мовчки примушує оновити, що може швидко викликати OutOfMemoryError під час одночасного індексування" elastic.co/guide/en/elasticsearch/reference/1.7/ …
usef_ksa

3
Ftr: Плагін видалення за запитом повернеться до основного ядра ES версії 5.
Val

11
Якщо ви отримуєте помилку "Не знайдено обробника для uri ...", використовуйте curl -XPOST 'localhost: 9200 / twitter / tweet / _delete_by_query? Конфлікти = продовжити & досить' -d '{"query": {"match_all": {}} } '
Ікбал

70

Плагін "Видалити за запитом" видалено на користь нової реалізації API ядро ​​по запиту в ядрі. Прочитайте тут

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
Себастьян

7
Для ES 6+ вам також потрібно-H 'Content-Type: application/json'
OMRY VOLK

57

З ElasticSearch 5.x API delete_by_query за замовчуванням є

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

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

Це приємно, оскільки воно працює для дочірніх вузлів (деякі інші відповіді в цьому випадку провалюються через "routing_missing_exception")
dnault

16

Коментар Торстена Енгельбрехта у відповіді Джона Петронеса розширився:

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

(Я не хотів редагувати відповідь Джона, оскільки вона отримала відгуки і встановлена ​​як відповідь, і я могла ввести помилку)


1
@ChristopheRoussy Ні без додаткового плагіна, дивіться коментарі до відповіді Джона Петроне
rsilva4

16

Ви можете видалити документи з типу за допомогою наступного запиту:

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

Я перевірив цей запит у Kibana та Elastic 5.5.2


13

Починаючи з Elasticsearch 2.x видалення більше не дозволено, оскільки документи залишаються в індексі, що викликає пошкодження індексу.


1
То яке рішення?
Крістоф Руссі

1
Я використовую рішення на основі псевдоніма для індексу. Основна ідея полягає у створенні нового індексу кожного разу, як news1, news2 and so onі встановлення псевдоніма для поточного активного індексу до newsшляху. Звичайно, назва індексу є лише прикладом. Тут ви можете знайти повний приклад для [псевдонім індексу] ( elastic.co/guide/en/elasticsearch/reference/current/… ) та статтю, яка пояснює тематичне дослідження.
Фабіо Фумарола

10

Наведені вище відповіді більше не працюють з ES 6.2.2 через сувору перевірку типу вмісту для запитів на REST Elasticsearch . curlКоманда , яку я в кінцевому підсумку , використовуючи це:

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

1
Згідно з офіційними документами, мені довелося видалити частину URL-адреси _doc.
Марк Шефер

6

У консолі Кібана :

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

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 вже не діє.
Декель

4

(Репутація недостатньо висока для коментарів) Друга частина відповіді Джона Петроне працює - запит не потрібен. Він видалить тип і всі документи, що містяться в цьому типі, але їх можна буде знову створити, коли ви індексуєте новий документ до цього типу.

Просто для уточнення: $ curl -XDELETE 'http://localhost:9200/twitter/tweet'

Примітка: це дійсно видаляє відображення! Але, як згадувалося раніше, це можна легко переробити, створивши новий документ.


2
Але ви видалите всі наявні у вас конфігурації відображень, не рекомендується, якщо у вас є конкретна конфігурація для будь-якого зіставлення, оскільки динамічні відображення створюють лише основні поля, такі як рядок, довгий тощо ...
Карлос Родрігес,

1
@CarlosRodriguez, але будь-яке фантазійне відображення у вас, безумовно, повинно бути в контролі джерела, і дуже легко автоматично повторно застосовуватись, як частина того ж сценарію, що робить видалення.
Джонатан Хартлі

Ця відповідь прямо суперечить питанню: "Видалити всі документи ... БЕЗ видалення типу". Будь ласка, не робіть припущення, як легко відтворити картографування на основі ВАШЕГО проекту. Інші проекти можуть мати більш складні процедури для відображення версій / міграції / тощо.
VeganHunter

3

Я використовую еластичний пошук 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


0

Elasticsearch 2.3 варіант

    action.destructive_requires_name: true

в elasesearch.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"
                              }
                        }
                  }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.