ElasticSearch 中删除 index/type 下的所有文档,但不删除 type

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

例子如下:

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

但我没有 term,只是想删除该类型的所有文档,不管是那个 term。实现这一目标的最佳实践是什么? term 留空试过了不行。

deleteByQuery 链接

247303 次浏览

我相信如果你将查询删除和匹配结合起来,它应该做你想要的,就像这样(使用你的例子):

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

或者你可以直接删除类型:

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

注意:在ElasticSearch的后续版本中,XDELETE已弃用

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

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

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

(声誉不够高,无法评论) 约翰·佩特龙回答的第二部分是有效的——不需要询问。它将删除该类型和该类型中包含的所有文档,但当您将一个新文档索引到该类型时,可以重新创建该类型 只是为了澄清: $ curl -XDELETE 'http://localhost:9200/twitter/tweet' < / p >

注意:此删除映射!但是如前所述,可以通过创建一个新文档轻松地重新映射它。

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

Elasticsearch 2.3选项

    action.destructive_requires_name: true

在elasticsearch。我们去旅行吧

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

再加几分钱。

上面提到的“delete_by_query”仍然可以作为elasticsearch 2.x的插件使用。

虽然在最新的即将到来的版本5。X将被替换 “通过查询api删除” < / p >

注意ES2 +

从ES 1.5.3开始,按查询删除API已弃用,从ES 2.0开始完全删除

而不是API,而是通过查询删除现在是一个插件

为了使用Delete By Query插件,你必须在集群的所有节点上安装该插件:

sudo bin/plugin install delete-by-query

安装完成后,需要重新启动所有节点。

< p >
该插件的用法与旧的API相同。你不需要改变你的查询中的任何东西-这个插件会让他们工作

关于为什么API被删除的完整信息,你可以阅读更多在这里

基于查询的删除插件已经被移除,取而代之的是一个新的基于查询的删除API实现。在这里阅读

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

来自ElasticSearch 5。x, delete_by_query API默认存在

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

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

你有这些选择:

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是索引名,用户是类型

Kibana控制台中:

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

你可以通过以下查询从类型中删除文档:

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

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

如果你想根据日期删除文档。 你可以使用kibana控制台(v.6.1.2)

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

上面的答案不再适用于ES 6.2.2,因为Elasticsearch REST请求的严格内容类型检查。我最终使用的curl命令是:

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

我用的是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" : [ ]
}

ElasticSearch 7。x, delete-by-query插件被移除,取而代之的是新的查询API删除

旋度选项:

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

对于未来的读者:

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

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