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


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

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


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

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 - это тип


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 был удален, вы можете прочитать больше здесь .


По моему опыту, плагин 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

-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.