删除索引中的所有文档而不删除索引

问题描述 投票:0回答:17

我知道可以通过deleteByQuery删除某个索引中的所有文档。

示例:

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

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

删除ByQuery的链接

elasticsearch elasticsearch-dsl
17个回答
197
投票

我相信,如果您将按查询删除与匹配项结合起来,它应该可以满足您的要求,如下所示(使用您的示例):

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

或者您可以删除该类型:

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

注意:

XDELETE
在更高版本的 ElasticSearch 中已弃用


110
投票

删除按查询插件已被删除,取而代之的是核心中新的按查询删除 API 实现。 请阅读此处

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

80
投票

从ElasticSearch 5.x开始,默认存在delete_by_query API

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

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

27
投票

您可以使用以下查询从类型中删除文档:

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

我在 Kibana 和 Elastic 5.5.2 中测试了这个查询


20
投票

自 ElasticSearch 7.x 起,

delete-by-query
插件已被删除,取而代之的是新的 按查询删除 API

curl选项:

curl -X POST "localhost:9200/my-index/_delete_by_query" -H 'Content-Type: application/json' -d' { "query": { "match_all":{} } } '

或者在 Kibana

POST /my-index/_delete_by_query
{
  "query": {
    "match_all":{}
  }
}

16
投票

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

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

(我不想编辑约翰的回复,因为它得到了赞成票并被设置为答案,我可能引入了一个错误)


13
投票

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


11
投票

由于对 Elasticsearch REST 请求进行严格的内容类型检查,上述答案不再适用于 ES 6.2.2。我最终使用的

curl
命令是这样的:

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

8
投票

Kibana 控制台中:

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

5
投票

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

澄清一下:

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

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


5
投票

ES2+

注意事项

从 ES 1.5.3 开始,delete-by-query API 已被弃用,并且自 ES 2.0 起被完全删除

按查询删除现在是一个插件,而不是 API。

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

sudo bin/plugin install delete-by-query

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


该插件的使用方法与旧API相同。您不需要更改查询中的任何内容 - 这个插件只会让它们工作。


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


5
投票

您有以下选择:

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
投票

我正在使用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" : [ ]
}

3
投票

只是为此添加几美分。

顶部提到的 “delete_by_query” 仍然可以作为 Elasticsearch 2.x 中的插件使用。

尽管在最新即将推出的 5.x 版本中它将被替换为 “通过查询API删除”


1
投票

对于未来的读者:

  • 在 Elasticsearch 7.x 中,每个索引实际上只有一种类型 - 类型是隐藏的
  • 您可以通过查询删除,但是如果您想删除所有内容,最好删除并重新创建索引。这是因为删除只是幕后的软删除,直到触发 Lucene 段合并*,如果索引很大,这可能会很昂贵。同时,删除索引几乎是即时的:删除磁盘上的一些文件和集群状态中的引用。

* 视频/幻灯片是关于 Solr 的,但在 Elasticsearch 中的工作原理完全相同,这是 Lucene 级别的功能。


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"
                              }
                        }
                  }
}
© www.soinside.com 2019 - 2024. All rights reserved.