我知道可以通过deleteByQuery删除某个索引中的所有文档。
示例:
curl -XDELETE 'http://localhost:9200/twitter/tweet/_query' -d '{
"query" : {
"term" : { "user" : "kimchy" }
}
}'
但我没有术语,只想删除该索引中的所有文档,无论是什么术语。实现这一目标的最佳实践是什么?空词不起作用。
我相信,如果您将按查询删除与匹配项结合起来,它应该可以满足您的要求,如下所示(使用您的示例):
curl -XDELETE 'http://localhost:9200/twitter/tweet/_query' -d '{
"query" : {
"match_all" : {}
}
}'
或者您可以删除该类型:
curl -XDELETE http://localhost:9200/twitter/tweet
注意:
XDELETE
在更高版本的 ElasticSearch 中已弃用
删除按查询插件已被删除,取而代之的是核心中新的按查询删除 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": {}
}
}
您可以使用以下查询从类型中删除文档:
POST /index/type/_delete_by_query
{
"query" : {
"match_all" : {}
}
}
我在 Kibana 和 Elastic 5.5.2 中测试了这个查询
自 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":{}
}
}
Torsten Engelbrecht 在 John Petrones 回答中的评论扩展:
curl -XDELETE 'http://localhost:9200/twitter/tweet/_query' -d
'{
"query":
{
"match_all": {}
}
}'
(我不想编辑约翰的回复,因为它得到了赞成票并被设置为答案,我可能引入了一个错误)
从 Elasticsearch 2.x 开始,不再允许删除,因为文档保留在索引中,导致索引损坏。
由于对 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": {} }}'
在 Kibana 控制台中:
POST calls-xin-test-2/_delete_by_query
{
"query": {
"match_all": {}
}
}
(声誉不够高,无法发表评论) 约翰·佩特龙(John Petrone)答案的第二部分有效 - 无需查询。它将删除该类型以及该类型中包含的所有文档,但只要您将新文档索引到该类型,就可以重新创建该类型。
澄清一下:
$ curl -XDELETE 'http://localhost:9200/twitter/tweet'
注意:这会删除映射!但如前所述,可以通过创建新文档轻松重新映射。
ES2+
注意事项
从 ES 1.5.3 开始,delete-by-query API 已被弃用,并且自 ES 2.0 起被完全删除
按查询删除现在是一个插件,而不是 API。
为了使用“按查询删除”插件,您必须在集群的所有节点上安装该插件:
sudo bin/plugin install delete-by-query
安装后必须重新启动所有节点。
该插件的使用方法与旧API相同。您不需要更改查询中的任何内容 - 这个插件只会让它们工作。
*有关为何删除 API 的完整信息,您可以在此处阅读更多信息。
您有以下选择:
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 是类型
我正在使用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" : [ ]
}
只是为此添加几美分。
顶部提到的 “delete_by_query” 仍然可以作为 Elasticsearch 2.x 中的插件使用。
尽管在最新即将推出的 5.x 版本中它将被替换为 “通过查询API删除”
对于未来的读者:
* 视频/幻灯片是关于 Solr 的,但在 Elasticsearch 中的工作原理完全相同,这是 Lucene 级别的功能。
Elasticsearch 2.3 选项
action.destructive_requires_name: true
在elasticsearch.yml中进行行程
curl -XDELETE http://localhost:9200/twitter/tweet
如果您想根据日期删除文档。 您可以使用kibana控制台(v.6.1.2)
POST index_name/_delete_by_query
{
"query" : {
"range" : {
"sendDate" : {
"lte" : "2018-03-06"
}
}
}
}