【问题标题】:Delete all documents from index/type without deleting type从索引/类型中删除所有文档而不删除类型
【发布时间】:2021-12-08 15:16:14
【问题描述】:

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

例子:

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

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

Link to deleteByQuery

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    我相信,如果您将查询删除与匹配所有内容结合起来,它应该会做您正在寻找的事情,就像这样(使用您的示例):

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

    或者你可以删除类型:

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

    注意:XDELETE 已被 ElasticSearch 的更高版本弃用

    【讨论】:

    • 如果您有自定义映射;请注意,第二个选项将删除类型及其映射。所以不要忘记删除后重新映射索引类型。否则你会搞砸的。
    • Ftr:在 Elasticsearch 2.0 中,delete by query API 已从核心中删除,现在为 lives in a plugin
    • 不建议通过这种方式删除记录。文档中的Here声明:“这是有问题的,因为它会默默地强制刷新,这会在并发索引期间迅速导致OutOfMemoryError”elastic.co/guide/en/elasticsearch/reference/1.7/…
    • Ftr:从第 5 版开始,查询删除插件将是 back into ES core
    • 如果你得到“No handler found for uri ...”错误,使用 curl -XPOST 'localhost:9200/twitter/tweet/_delete_by_query?conflicts=proceed&pretty' -d' { "query": { "match_all": {} } }'
    【解决方案2】:

    Delete-By-Query 插件已被移除,取而代之的是核心中的新 Delete-By-Query API 实现。 Read here

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

    【讨论】:

    • 在 es 5.4 上为我工作
    • 在 ES 6.1.1 上为我工作
    • 对于 ES 6+ 你还需要-H 'Content-Type: application/json'
    【解决方案3】:

    从 ElasticSearch 5.x 开始,delete_by_query API 默认存在

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

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

    【讨论】:

    • 这很好,因为它适用于子节点(在这种情况下,由于“routing_missing_exception”,其他一些答案会失败)
    【解决方案4】:

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

    POST /index/type/_delete_by_query
    {
        "query" : { 
            "match_all" : {}
        }
    }
    

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

    【讨论】:

      【解决方案5】:

      Torsten Engelbrecht 在 John Petrones 回答中的评论已扩展:

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

      (我不想编辑约翰的回复,因为它得到了投票并被设置为答案,我可能引入了一个错误)

      【讨论】:

      • @ChristopheRoussy 不,没有额外的插件,请参阅 John Petrone 上的 cmets 答案
      【解决方案6】:

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

      【讨论】:

      • 那么解决办法是什么?
      • 我使用基于别名的解决方案作为索引。主要思想是每次都创建新索引,例如news1, news2 and so on,并将当前活动索引的别名设置为news 路径。当然索引的名称仅作为示例。在这里您可以找到 [索引别名](elastic.co/guide/en/elasticsearch/reference/current/…) 和 article 的完整示例,其中解释了一个案例研究。
      【解决方案7】:

      由于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": {} }}'
      

      【讨论】:

      • 根据官方文档,我必须删除 URL 的 _doc 部分。
      【解决方案8】:

      Kibana 控制台中:

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

      【讨论】:

        【解决方案9】:

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

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

        注意:这确实删除了映射!但如前所述,可以通过创建新文档轻松重新映射。

        【讨论】:

        • 但是你删除了所有的映射配置,当你有任何映射的特定配置时不建议这样做,因为动态映射只创建字符串、长等基本字段......
        • @CarlosRodriguez 但您拥有的任何精美映射肯定都应该在源代码管理中,并且很容易自动重新应用,作为执行删除的同一脚本的一部分。
        • 这个答案直接与问题相矛盾:“删除所有文档......而不删除类型”。请不要假设根据您的项目重新创建映射是多么容易。其他项目可能有更复杂的映射版本/迁移/等过程。
        【解决方案10】:

        ES2+的注意事项

        从 ES 1.5.3 开始,delete-by-query API 已被弃用,自 ES 2.0 起已完全删除

        Delete By Query is now a plugin 代替 API。

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

        sudo bin/plugin install delete-by-query
        

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


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


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

        【讨论】:

        • 根据我的经验,DeleteByQuery 插件在处理大量文档时效果很差。使用 ES 2.3.2 测试。
        • @ibai,我将它与 ES 2.2.0 一起用于包含数百万个文档的索引上,并且没有花费很长时间(大约与 1.7 中的原始查询 API 删除时间相同) .无论如何 - 我想这里没有太多选择,因为 API 不再有效。
        【解决方案11】:

        您有以下选择:

        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 是一个类型

        【讨论】:

          【解决方案12】:

          我正在使用 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】:

            自 LeasticSearch 7.x 起,delete-by-query 插件被移除,取而代之的是新的Delete By Query API

            卷曲选项:

            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":{}
              }
            }
            

            【讨论】:

              【解决方案14】:

              只是为了增加几美分。

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

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

              【讨论】:

                【解决方案15】:

                Elasticsearch 2.3 选项

                    action.destructive_requires_name: true
                

                在 elasticsearch.yml 中进行操作

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

                【讨论】:

                  【解决方案16】:

                  对于未来的读者:

                  • 在 Elasticsearch 7.x 中,每个索引实际上只有一种类型 - 类型是隐藏的
                  • 您可以delete by query,但如果您想删除所有内容,最好删除并重新创建索引。这是因为删除只是底层的软删除,直到触发 Lucene segment merges*,如果索引很大,这可能会很昂贵。同时,删除索引几乎是即时的:删除磁盘上的一些文件和集群状态下的引用。

                  * 视频/幻灯片是关于 Solr 的,但在 Elasticsearch 中的工作方式完全相同,这是 Lucene 级别的功能。

                  【讨论】:

                    【解决方案17】:

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

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

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2011-08-14
                      • 2021-08-13
                      • 2021-11-21
                      • 1970-01-01
                      • 2017-08-15
                      相关资源
                      最近更新 更多