从索引/类型删除所有文档,而不删除类型


155

我知道可以通过deleteByQuery从某种类型删除所有文档。

例:

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

但是我没有术语,无论什么术语,我都只想删除该类型的所有文档。什么是实现这一目标的最佳实践?空项不起作用。

链接到deleteByQuery

Answers:


175

我相信,如果您将通过查询进行的删除与匹配相结合,那么它应该做的就是您想要的,例如(使用您的示例):

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

或者,您可以删除类型:

curl -XDELETE http://localhost:9200/twitter/tweet

9
如果您有自定义映射;请注意,第二个选项将删除类型及其映射。因此,不要忘记在删除后重新映射索引类型。否则你会被搞砸。
Finny Abraham

24
Ftr:在Elasticsearch 2.0中,按查询删除API已从核心中删除,现在位于plugin中
dtk 2015年

2
不建议通过这种方式删除记录。文档中的声明:“这是有问题的,因为它无提示地强制进行刷新,这可能会在并发索引期间迅速导致OutOfMemoryError” elastic.co/guide/en/elasticsearch/reference/1.7/ …
usef_ksa

3
FTR:通过查询插件删除会回到ES核心为5版本
瓦尔

11
如果收到“找不到用于uri的处理程序...”错误,请使用curl -XPOST'localhost:9200 / twitter / tweet / _delete_by_query?conflicts = proceed&pretty'-d'{“ query”:{“ match_all”:{}} }'
Iqbal

70

已删除Delete-By-Query插件,以支持内核中新的Delete By Query 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'
欧姆RY18年

57

在ElasticSearch 5.x中,默认情况下存在delete_by_query API

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

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

这很好,因为它适用于子节点(由于“ routing_missing_exception”,其他答案在某些情况下失败)
dnault

16

Torsten Engelbrecht在John Petrones回答中的评论扩大了:

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

(我不想编辑John的回复,因为它得到了支持并被设置为答案,所以我可能引入了一个错误)


1
@ChristopheRoussy不,不需要额外的插件,请参阅John
Petrone


13

从Elasticsearch 2.x开始,不再允许删除,因为文档保留在索引中,导致索引损坏。


1
那么解决方案是什么?
Christophe Roussy

1
我使用基于别名的解决方案作为索引。主要思想是每次都创建新索引,news1, news2 and so on并为news路径的当前活动索引设置别名。当然,索引的名称仅作为示例。在这里,您可以找到[索引别名]的完整示例(elastic.co/guide/en/elasticsearch/reference/current/…)和说明案例研究的文章
法比奥·富玛拉


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,“ 按查询删除”现在是一个插件

为了使用“按查询删除”插件,您必须在集群的所有节点上安装该插件:

sudo bin/plugin install delete-by-query

安装后必须重新启动所有节点。


插件的用法与旧API相同。您无需更改查询中的任何内容-此插件将使其工作。


*有关为什么删除该API的完整信息,您可以在此处阅读更多内容。


根据我的经验,DeleteByQuery插件在处理大量文档时表现很差。经过ES 2.3.2测试。
ibai

1
@ibai,我在ES 2.2.0上使用它,该索引包含数百万个文档,并且用时不长(大约与1.7中的原始查询API删除时间相同)。无论如何-我猜这里没有太多选择,因为API不再有效。
德克尔

4

(声誉不足以发表评论)John Petrone的答案的第二部分有效-无需查询。它将删除该类型以及该类型中包含的所有文档,但是只要您将新文档索引到该类型,就可以重新创建该类型。

只是澄清一下: $ curl -XDELETE 'http://localhost:9200/twitter/tweet'

注意:这确实会删除映射!但是,如前所述,可以通过创建新文档轻松地将其重新映射。


2
但是,如果删除你所有的映射配置什么,但不推荐,当你有任何映射的具体配置,因为动态映射只能创建基础领域,如弦,长等..
卡洛斯·罗德里格斯

1
@CarlosRodriguez,但是您拥有的任何奇特的映射肯定应该在源代码控制中,并且非常容易自动重新应用,这是执行删除操作的同一脚本的一部分。
乔纳森·哈特利

该答案与以下问题直接矛盾:“删除所有文档...而不删除类型”。请不要假设基于您的项目重新创建映射是多么容易。其他项目可能具有用于映射版本控制/迁移/等的更复杂的过程。
VeganHunter

3

我正在使用Elasticsearch 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

在elasticsearch.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"
                              }
                        }
                  }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.