20

我想使用 HTTP/REST api 删除 Elasticsearch 中某个类型中索引的所有文档,但我不想删除此类型的映射

如何在 URL 中构建查询来执行此操作?

4

7 回答 7

17

执行命令前,索引/映射状态;(截图取自elasticsearch head plugin web interface)

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

命令;

curl -XDELETE 'http://localhost:9200/publishercategoryeu/autocomplete/_query' -d '
{
  "query": {
    "bool": {
      "must": [
        {
          "match_all": {}
        }
      ]
    }
  }
}
'

结果;

在此处输入图像描述

执行命令后,索引/映射状态;

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

正如我们所见,我们删除了类型(映射)中索引的所有文档,而没有删除索引或类型(映射)。

于 2014-05-15T11:19:39.780 回答
8

使用 match_all 查询进行简单的删除查询应该可以解决问题。你可以在这里获取更多信息:

通过查询 api 删除

或者,您可以删除整个类型并使用模板 api。只需在包含模板的 config/templates/ 文件夹中放置一个文件,您将永远不会丢失它。当您删除映射时,映射确实会丢失,但是一旦您再次索引某些内容,模板就会被重新使用。这里有更多信息:

模板api

编辑:新的删除 api:https ://www.elastic.co/guide/en/elasticsearch/reference/current/docs-delete.html

于 2013-09-26T07:04:56.887 回答
4

使用 elasticsearch head 插件中的以下命令,我能够logslogstash索引中删除所有类型的文档而不删除映射:

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

使用 Elasticsearch 头插件删除文档

要释放磁盘空间,您还必须logstash在删除文档后优化索引(Actions->Optimize for index in head plugin)。

于 2014-09-29T10:06:02.237 回答
1

以前的答案不适用于最新版本的Elasticsearch. 已弃用“按查询删除” Elasticsearch 2.0Elasticsearch文档说它可能会在并发索引期间导致 OutOfMemoryError 并可能导致主副本和副本变得不一致。如果你想在Github中关注问题的历史。

现在需要多个步骤才能从type.

  1. 找到您需要删除的文档的所有 ID。执行此操作的最有效方法是使用滚动/扫描 API来查找给定类型的所有匹配 id。

  2. 发出批量请求以按 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标志而不是 plain -d

于 2016-03-14T21:21:44.463 回答
0

如果您想在 golang 中执行此操作,使用“ olviere/elastic ”库,您可以使用此代码,假设您有一个客户端yourClient,并且yourIndexyourType

    bq := elastic.NewBoolQuery()
    bq.Must(elastic.NewMatchAllQuery())
    _, err := elastic.NewDeleteByQueryService(yourClient).
        Index(yourIndex).
        Type(yourType).
        Query(bq).
        Do()
于 2015-07-24T19:02:38.320 回答
0
$ curl -XDELETE 'http://localhost:9200/twitter/tweet/_query?q=user:kimchy'

$ curl -XDELETE 'http://localhost:9200/twitter/tweet/_query' -d '{
    "query" : {
        "term" : { "user" : "kimchy" }
    }
}
于 2016-03-14T16:37:07.463 回答
-3

利用:

curl -XDELETE 'http://{server}/{index_name}/{type_name}/'

(如文档中所示)

于 2013-10-29T13:50:04.363 回答