【问题标题】:Bulk delete elasticsearch批量删除弹性搜索
【发布时间】:2019-08-11 02:46:29
【问题描述】:

我正在使用弹性搜索 2.2。

这是文档的数量

curl 'xxxxxxxxx:9200/_cat/indices?v'

yellow open   app                 5   1   28019178         5073     11.4gb         11.4gb

在“app”索引中,我们有两种类型的文档。

  1. “日志”
  2. “系统日志”

现在我想删除“syslog”类型下的所有文档。

因此,我尝试使用以下命令

 curl -XDELETE "http://xxxxxx:9200/app/syslog"

但出现以下错误

No handler found for uri [/app/syslog]

我也安装了 delete-by-query 插件。有什么办法可以进行批量删除操作吗?

现在,我正在通过获取 id 来删除记录。

curl -XDELETE "http://xxxxxx:9200/app/syslog/A121312"

删除 10000 条记录大约需要 5 分钟。我有超过 1000000 个文档需要删除。请帮忙。

[编辑 -1]

我运行以下查询来删除系统日志类型文档

curl -XDELETE 'http://xxxxxx:9200/app/syslog/_query' -d'
{
  "query": {
    "bool": {
      "must": [
        {
          "match_all": {}
        }
      ]
    }
  }
}'

结果在下面

{"found":false,"_index":"app","_type":"syslog","_id":"_query","_version":1,"_shards":{"total":2,"successful":1,"failed":0}}

我曾经通过查询从索引中获取此消息

 {
      "_index" : "app",
      "_type" : "syslog",
      "_id" : "AVckPMQnKYIebrQhF556",
      "_score" : 1.0,
      "_source" : {
        "message" : "some test message",
        "@version" : "1",
        "@timestamp" : "2016-09-13T15:49:04.562Z",
        "type" : "syslog",
        "host" : "1.2.3.4",
        "priority" : 0,
        "severity" : 0,
        "facility" : 0,
        "facility_label" : "kernel",
        "severity_label" : "Emergency"
}

[编辑 2]

按插件列出的查询删除

sudo /usr/share/elasticsearch/bin/plugin list
Installed plugins in /usr/share/elasticsearch/plugins/node1:
    - delete-by-query

【问题讨论】:

  • 如果文档数量很大,您应该创建一个新索引并重新索引您想要保留的文档

标签: elasticsearch


【解决方案1】:

在过去几天用 7700 万个不需要的文档填充 elasticsearch 后,我遇到了类似的问题。在查询中设置超时是你的朋友。正如提到的here。 curl也有参数增加(-m 3600)

curl --request DELETE \
  --url 'http://127.0.0.1:9200/nadhled/tree/_query?timeout=60m' \
  --header 'content-type: application/json' \
  -m 3600 \
  --data '{"query":{
            "filtered":{
              "filter":{
                "range":{
                  "timestamp":{
                    "lt":1564826247
                   },
                  "timestamp":{
                    "gt":1564527660
                  }
                }
              }
            }
          }
        }'

我知道这不是您的批量删除,但我在研究过程中发现了这个页面,所以我把它贴在这里。希望对你也有帮助。

【讨论】:

    【解决方案2】:

    在最新的 Elasticsearch(5.2) 中,您可以使用 _delete_by_query

    curl -XPOST "http://localhost:9200/index/type/_delete_by_query" -d'
    {
        "query":{
            "match_all":{}
        }
    }'
    

    delete-by-query API 是新的,仍应考虑使用 实验性的。 API 可能会以不倒退的方式发生变化 兼容

    https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-delete-by-query.html

    【讨论】:

      【解决方案3】:

      我建议您应该创建一个新索引并重新索引您想要保留的文档

      但是如果你想通过查询使用删除,你应该使用这个,

      curl -XDELETE 'http://xxxxxx:9200/app/syslog/_query'
      
      {
        "query": {
          "bool": {
            "must": [
              {
                "match_all": {}
              }
            ]
          }
        }
      }
      

      但是你会留下映射。

      【讨论】:

      • 您上面给出的删除查询只会删除A121312。我想删除索引“app”下的所有文档并输入“syslog”
      • 这不起作用..让我现在用查询、结果和示例消息编辑我的帖子,如果有帮助的话
      • 我也给出了示例消息。尽管我们有系统日志消息,但不确定为什么查询结果为 found=False
      • 你安装删除查询插件了吗?
      • _query当成_id,检查是否安装了查询删除插件
      猜你喜欢
      • 2019-06-03
      • 2022-06-16
      • 2015-05-23
      • 2014-04-16
      • 1970-01-01
      • 2018-03-10
      • 1970-01-01
      • 2017-07-03
      • 2016-06-20
      相关资源
      最近更新 更多