【发布时间】:2013-10-01 13:47:52
【问题描述】:
我想使用 HTTP/REST api 删除 Elasticsearch 中某个类型中索引的所有文档,但我不想删除该类型的映射
如何在 URL 中构建查询以执行此操作?
【问题讨论】:
我想使用 HTTP/REST api 删除 Elasticsearch 中某个类型中索引的所有文档,但我不想删除该类型的映射
如何在 URL 中构建查询以执行此操作?
【问题讨论】:
以前的答案不适用于最新版本的Elasticsearch。 Elasticsearch 2.0 已弃用“按查询删除”。 Elasticsearch 文档说它可能会在并发索引期间导致 OutOfMemoryError 并且可能导致主副本和副本变得不一致。如果您想在Github 中关注问题的历史记录。
现在需要多个步骤才能从type 中删除所有文档。
找到您需要删除的文档的所有 id。执行此操作的最有效方法是使用 scroll/scan API 查找给定类型的所有匹配 id。
发出批量请求以按 ID 删除文档。下面提供了一个示例。
curl -XPOST 'http://localhost:9200/_bulk' -d '
{ "delete": { "_index": "index", "_type": "type", "_id": "1"}
{ "delete": { "_index": "index", "_type": "type", "_id": "2"}'
请注意,如果您向 curl 提供文本文件输入,您必须使用 --data-binary 标志而不是普通的 -d。
【讨论】:
使用 match_all 查询的简单删除查询应该可以解决问题。 你可以在这里获取更多信息:
或者,您可以删除整个类型并使用模板 api。只需在包含模板的 config/templates/ 文件夹中放置一个文件,您将永远不会丢失它。当您删除映射时,映射确实会丢失,但是一旦您再次索引某些内容,模板就会被重新使用。这里有更多信息:
编辑:新的删除 api:https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-delete.html
【讨论】:
$ curl -XDELETE 'http://localhost:9200/twitter/tweet/_query?q=user:kimchy'
$ curl -XDELETE 'http://localhost:9200/twitter/tweet/_query' -d '{
"query" : {
"term" : { "user" : "kimchy" }
}
}
【讨论】:
如果您想在 golang 中执行此操作,使用“olviere/elastic”库,则可以使用此代码,假设您有一个客户端 yourClient、yourIndex 和 yourType:
bq := elastic.NewBoolQuery()
bq.Must(elastic.NewMatchAllQuery())
_, err := elastic.NewDeleteByQueryService(yourClient).
Index(yourIndex).
Type(yourType).
Query(bq).
Do()
【讨论】:
使用 elasticsearch head 插件中的以下命令,我能够从 logstash 索引中删除所有类型为 logs 的文档,而无需删除映射:
{"query":{"match_all":{}}}
要释放磁盘上的空间,您还必须在删除文档后优化索引(Actions->Optimize for index logstash in head plugin)。
【讨论】:
执行命令前,索引/映射状态; (截图取自 elasticsearch head plugin 网页界面)
命令;
curl -XDELETE 'http://localhost:9200/publishercategoryeu/autocomplete/_query' -d '
{
"query": {
"bool": {
"must": [
{
"match_all": {}
}
]
}
}
}
'
结果;
执行命令后,索引/映射状态;
如我们所见,我们删除了类型(映射)中索引的所有文档,而没有删除索引或类型(映射)。
【讨论】:
【讨论】: