【问题标题】:Delete documents of type in Elasticsearch在 Elasticsearch 中删除类型的文档
【发布时间】:2013-10-01 13:47:52
【问题描述】:

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

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

【问题讨论】:

    标签: elasticsearch documents


    【解决方案1】:

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

    现在需要多个步骤才能从type 中删除所有文档。

    1. 找到您需要删除的文档的所有 id。执行此操作的最有效方法是使用 scroll/scan 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 标志而不是普通的 -d

    【讨论】:

      【解决方案2】:

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

      delete by query api

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

      template api

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

      【讨论】:

      • 似乎已弃用
      【解决方案3】:
      $ curl -XDELETE 'http://localhost:9200/twitter/tweet/_query?q=user:kimchy'
      
      $ curl -XDELETE 'http://localhost:9200/twitter/tweet/_query' -d '{
          "query" : {
              "term" : { "user" : "kimchy" }
          }
      }
      

      【讨论】:

        【解决方案4】:

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

            bq := elastic.NewBoolQuery()
            bq.Must(elastic.NewMatchAllQuery())
            _, err := elastic.NewDeleteByQueryService(yourClient).
                Index(yourIndex).
                Type(yourType).
                Query(bq).
                Do()
        

        【讨论】:

          【解决方案5】:

          使用 elasticsearch head 插件中的以下命令,我能够从 logstash 索引中删除所有类型为 logs 的文档,而无需删除映射:

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

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

          【讨论】:

            【解决方案6】:

            执行命令前,索引/映射状态; (截图取自 elasticsearch head plugin 网页界面)

            命令;

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

            结果;

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

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

            【讨论】:

            • 'twitter' 是索引名称,'tweet' 是命令中的映射名称。你用你的箱子正确地替换它们了吗?
            • 当然。我认为这取决于弹性搜索版本。我也有一些来自 elasticsearch 指南的查询并得到一个无法解析的异常。
            • 今晚我会检查/测试我的帖子并通知你。请耐心等待。 :)
            • 我测试并详细说明了我的帖子。正如您所说,elasticsearch 版本对于此操作很重要。在文档 (elasticsearch.org/guide/en/elasticsearch/reference/current/…) 中有一条注释提到了这一点。
            • 注意:从 1.5.3 开始不推荐使用按查询删除,并且在 2.0 中不再适用
            【解决方案7】:

            使用:

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

            (如documentation

            【讨论】:

            • 虽然这似乎可行,但它不是 delete_by_query 文档的一部分。但是,这也会删除映射,因此您应该使用完整的 delete_by_query 和 match-all 查询。
            • 这会删除整个文档类型,而不仅仅是文档。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-11-03
            • 2015-08-31
            相关资源
            最近更新 更多