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

时间:2014-05-28 16:39:16

标签: elasticsearch

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

示例:

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

但我没有任何条款,只是想删除该类型的所有文件,无论什么条款。实现这一目标的最佳做法是什么?空术语不起作用。

Link to deleteByQuery

16 个答案:

答案 0 :(得分:152)

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

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

或者你可以删除类型:

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

答案 1 :(得分:54)

  

已删除Delete-By-Query插件,支持在核心中使用新的Delete By Query API实现。 Read here

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

答案 2 :(得分:46)

从ElasticSearch 5.x开始,默认情况下会出现delete_by_query API

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

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

答案 3 :(得分:16)

Torsten Engelbrecht对John Petrones的评论答案扩大了:

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

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

答案 4 :(得分:13)

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

答案 5 :(得分:11)

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

MathView mv = new MathView(context, null);
        mv.setEngine(MathView.Engine.MATHJAX);
        mv.config("MathJax.Hub.Config({\n" +
                "jax: [\"input/TeX\",\"output/HTML-CSS\"],\n" +
                "displayAlign: \"left\"" +
                "});"
        );
        String a= text;
        mv.setText(a);

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

答案 6 :(得分:5)

  

ES2 +

的注释

从ES 1.5.3开始,不推荐使用逐个查询API,并且自ES 2.0以来已完全删除

而不是API,Delete By Query is now a plugin

要使用Delete By Query插件,您必须在群集的所有节点上安装插件:

sudo bin/plugin install delete-by-query
  

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


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

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

答案 7 :(得分:4)

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

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

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

答案 8 :(得分:4)

你有这些选择:

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

答案 9 :(得分:4)

Kibana 控制台:

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

答案 10 :(得分:4)

由于Strict Content-Type Checking for Elasticsearch REST Requests,上述答案不再适用于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": {} }}'

答案 11 :(得分:2)

只需加上几美分即可。

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

虽然在最新的即将发布的5.x版中,它将被替换为 "delete by query api"

答案 12 :(得分:1)

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

答案 13 :(得分:0)

Elasticsearch 2.3选项

    action.destructive_requires_name: true
在elasticsearch.yml中的

做了这次旅行

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

答案 14 :(得分:0)

如果要根据日期删除文档。 您可以使用kibana console(v.6.1.2)

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

答案 15 :(得分:0)

自 LeasticSearch 7.x 起,delete-by-query 插件被移除以支持新的 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":{}
  }
}