Excluir todos os documentos do índice / tipo sem excluir o tipo

155

Eu sei que é possível excluir todos os documentos de um determinado tipo via deleteByQuery.

Exemplo:

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

Mas não tenho termo e simplesmente desejo excluir todos os documentos desse tipo, independentemente do termo. Qual é a melhor prática para conseguir isso? O termo vazio não funciona.

Link para deleteByQuery

Michael Leiss
fonte

Respostas:

175

Acredito que se você combinar a exclusão por consulta com uma correspondência, tudo o que você deve fazer é o que está procurando, algo assim (usando seu exemplo):

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

Ou você pode simplesmente excluir o tipo:

curl -XDELETE http://localhost:9200/twitter/tweet
John Petrone
fonte
9
Se você estiver tendo mapeamentos personalizados; observe que a segunda opção excluirá o tipo e seus mapeamentos. Portanto, não esqueça de remapear o tipo de índice após a exclusão. Ou então você vai ser confuso.
Finny Abraham
24
Ftr: no Elasticsearch 2.0, a API de exclusão por consulta foi removida do núcleo e agora vive em um plug-in .
dtk
2
Não é recomendável excluir registros dessa maneira. A seguinte declaração dos documentos: "é problemática, pois força silenciosamente uma atualização que pode causar rapidamente OutOfMemoryError durante a indexação simultânea" elastic.co/guide/en/elasticsearch/reference/1.7/ ...
usef_ksa 14/01
3
Ftr: O plug-in excluir por consulta estará de volta ao núcleo do ES a partir da versão 5.
Val
11
Se você receber o erro "Nenhum manipulador encontrado para uri ...", use curl -XPOST 'localhost: 9200 / twitter / tweet / _delete_by_query? Conflitos = prossiga e mude' -d '{"query": {"match_all": {}} } '
Iqbal 24/11
70

O plug-in Excluir por consulta foi removido em favor de uma nova implementação da API Excluir por consulta no núcleo. Leia aqui

curl -XPOST 'localhost:9200/twitter/tweet/_delete_by_query?conflicts=proceed&pretty' -d'
{
    "query": {
        "match_all": {}
    }
}'
Iqbal
fonte
1
Trabalhou para mim no es 5.4
jlunavtgrad 10/17
2
Trabalhou para mim no ES 6.1.1
Sebastian
7
Para ES 6+ você também precisa-H 'Content-Type: application/json'
Omry VOLK
57

No ElasticSearch 5.x, a API delete_by_query existe por padrão

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

{
    "query": { 
        "match_all": {}
    }
}
Jay Shah
fonte
Isso é bom porque ele funciona para nós filhos (algumas das outras respostas falhar nesse caso, devido à "routing_missing_exception")
dnault
16

O comentário de Torsten Engelbrecht na resposta de John Petrones foi expandido:

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

(Eu não queria editar a resposta de John, pois ela recebeu votos positivos e está definida como resposta, e talvez eu tenha introduzido um erro)

Brimstedt
fonte
1
@ChristopheRoussy Não sem plugins extra, ver comentários sobre resposta John Petrone
rsilva4
16

Você pode excluir documentos do tipo com a seguinte consulta:

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

Eu testei esta consulta no Kibana e Elastic 5.5.2

Luka Lopusina
fonte
13

A partir da exclusão do Elasticsearch 2.x não é mais permitida, pois os documentos permanecem no índice causando corrupção no índice.

Fabio Fumarola
fonte
1
Então qual é a solução ?
Christophe Roussy
1
Eu uso uma solução baseada em alias para o índice. A idéia principal é criar um novo índice a cada vez news1, news2 and so one configurar um alias para o índice ativo atual no newscaminho. Obviamente, o nome do índice é apenas um exemplo. Aqui você pode encontrar um exemplo completo de [alias de índice] ( elastic.co/guide/en/elasticsearch/reference/current/… ) e artigo que explica um estudo de caso.
Fabio Fumarola
10

As respostas acima não funcionam mais com o ES 6.2.2 devido à verificação rigorosa do tipo de conteúdo para solicitações REST do Elasticsearch . O curlcomando que acabei usando é o seguinte:

curl -H'Content-Type: application/json' -XPOST 'localhost:9200/yourindex/_doc/_delete_by_query?conflicts=proceed' -d' { "query": { "match_all": {} }}'
mindas
fonte
1
De acordo com os documentos oficiais, tive que remover a parte _doc da URL.
Mark Schäfer
6

No Kibana Console:

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

Você tem estas alternativas:

1) Exclua um índice inteiro:

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

exemplo:

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

Para mais detalhes, você pode encontrar aqui - https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-delete-index.html

2) Exclua por consulta as que correspondem:

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

* Aqui mentorz é um nome de índice e usuários é um tipo

NeeruKSingh
fonte
5

Nota para ES2 +

A partir do ES 1.5.3, a API de exclusão por consulta foi descontinuada e foi completamente removida desde o ES 2.0

Em vez da API, a opção Excluir por consulta agora é um plug-in .

Para usar o plug-in Excluir por consulta, você deve instalar o plug-in em todos os nós do cluster:

sudo bin/plugin install delete-by-query

Todos os nós devem ser reiniciados após a instalação.


O uso do plug-in é o mesmo da API antiga. Você não precisa alterar nada em suas consultas - este plugin apenas as faz funcionar.


* Para obter informações completas sobre por que a API foi removida, você pode ler mais aqui .

Dekel
fonte
Pela minha experiência, o plug-in DeleteByQuery tem um desempenho muito ruim com uma grande quantidade de documentos. Testado com ES 2.3.2.
ibai 26/08/16
1
@ibai, eu o usei com o ES 2.2.0 em um índice que contém vários milhões de documentos e não demorou muito (aproximadamente o mesmo tempo com a exclusão original pela API de consulta que estava em 1.7). Enfim - acho que não há muita escolha aqui, pois a API não é mais válida.
Dekel
4

(Reputação insuficiente para comentar) A segunda parte da resposta de John Petrone funciona - nenhuma consulta é necessária. Ele excluirá o tipo e todos os documentos contidos nesse tipo, mas isso poderá ser recriado sempre que você indexar um novo documento para esse tipo.

Só para esclarecer: $ curl -XDELETE 'http://localhost:9200/twitter/tweet'

Nota: este não excluir o mapeamento! Mas, como mencionado anteriormente, ele pode ser facilmente mapeado novamente, criando um novo documento.

Emmy R
fonte
2
Mas você excluir todos o que está configuração mapeamentos que você tem, não é recomendado quando você tem configuração específica para qualquer mapeamento, porque os mapeamentos dinâmicos só criam campos básico, como corda, longa, etc ...
Carlos Rodriguez
1
@CarlosRodriguez, mas qualquer mapeamento sofisticado que você tenha certamente deve estar no controle de origem e muito fácil de se reaplicar automaticamente, como parte do mesmo script que está excluindo.
Jonathan Hartley
Esta resposta contradiz diretamente a pergunta: "Excluir todos os documentos ... SEM excluir o tipo". Por favor, não faça suposições sobre como é fácil recriar o mapeamento com base no SEU projeto. Outros projetos podem ter procedimentos mais complexos para mapear versão / migração / etc.
VeganHunter 19/09/18
3

Estou usando elasticsearch 7.5 e quando uso

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

que jogará abaixo do erro.

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

Também preciso adicionar um -H 'Content-Type: application/json'cabeçalho extra na solicitação para que funcione.

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" : [ ]
}
Kris Roofe
fonte
Isso funciona para mim no 6.7.2.
rooch84 16/07
2

Apenas para adicionar alguns centavos a isso.

O "delete_by_query" mencionado na parte superior ainda está disponível como um plug-in no elasticsearch 2.x.

Embora na versão 5.x mais recente seja substituída por "delete by query api"

Walaitki
fonte
0

Elasticsearch 2.3 a opção

    action.destructive_requires_name: true

em elasticsearch.yml faça a viagem

    curl -XDELETE http://localhost:9200/twitter/tweet
JJANSSEN
fonte
-1

Se você deseja excluir o documento de acordo com uma data. Você pode usar o console kibana (v.6.1.2)

POST index_name/_delete_by_query
{
      "query" : {
              "range" : {
                 "sendDate" : {
                     "lte" : "2018-03-06"
                              }
                        }
                  }
}
SerefAltindal
fonte