Удалить все документы из индекса / типа без удаления типа

156

Я знаю, что можно удалить все документы определенного типа через 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 удаления по запросу был удален из ядра и теперь находится в плагине .
августа
2
Не рекомендуется удалять записи этим способом. Вот заявление из документов: «это проблематично, так как оно вызывает принудительное обновление, которое может быстро вызвать OutOfMemoryError во время одновременной индексации » astic.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? Конфликтов = продолжить & pretty' -d '{"query": {"match_all": {}} } '
Икбал
71

Плагин Delete-By-Query был удален в пользу новой реализации API Delete By Query в ядре. Читать здесь

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": {}
      }
   }'

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

Brimstedt
источник
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пути. Конечно, название индекса только в качестве примера. Здесь вы можете найти полный пример [index alias] ( astic.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

В консоли Kibana :

POST calls-xin-test-2/_delete_by_query
{
  "query": { 
    "match_all": {}
  }
}
Xin
источник
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 - это индексное имя, а users - это тип

NeeruKSingh
источник
5

Примечание для ES2 +

Начиная с ES 1.5.3, API-интерфейс удаления по запросу устарел и полностью удаляется начиная с ES 2.0.

Вместо API теперь используется плагин Delete By Query .

Чтобы использовать плагин Delete By Query, вы должны установить плагин на все узлы кластера:

sudo bin/plugin install delete-by-query

Все узлы должны быть перезапущены после установки.


Использование плагина такое же, как и у старого API. Вам не нужно ничего менять в своих запросах - этот плагин просто заставит их работать.


* Для получения полной информации о ПОЧЕМУ API был удален, вы можете прочитать больше здесь .

Dekel
источник
По моему опыту, плагин 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
Но вы удаляете все настройки конфигурации сопоставлений, что у вас есть, это не рекомендуется, когда у вас есть конкретная конфигурация для любого сопоставления, потому что динамические сопоставления создают только базовые поля, такие как string, long и т. Д.
Карлос Родригес
1
@CarlosRodriguez, но любое ваше причудливое отображение обязательно должно быть в системе контроля версий и очень легко автоматически повторно применяться, как часть того же сценария, который выполняет удаление.
Джонатан Хартли
Этот ответ прямо противоречит вопросу: «Удалить все документы ... БЕЗ удаления типа». Пожалуйста, не делайте предположений о том, как легко воссоздать отображение на основе ВАШЕГО проекта. Другие проекты могут иметь более сложные процедуры для отображения версий / миграции / и т.д.
VeganHunter
3

Я использую Elassearch 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

вasticsearch.yml сделать поездку

    curl -XDELETE http://localhost:9200/twitter/tweet
JJANSSEN
источник
-1

Если вы хотите удалить документ по дате. Вы можете использовать консоль kibana (v.6.1.2)

POST index_name/_delete_by_query
{
      "query" : {
              "range" : {
                 "sendDate" : {
                     "lte" : "2018-03-06"
                              }
                        }
                  }
}
SerefAltindal
источник