1

介绍

我正在使用 Elastic Search (v5.x) 并尝试通过查询删除文档。

我的索引称为“数据”。文档以分层结构存储。以这种模式构建的文档 URL:

https://server.ip/data/ {userid}/{document-id}

因此,假设用户 ID“1”存储了两个文档(“1”、“2”)。因此,他们的直接 URL 将是:

https://server.ip/data/1/1
https://server.ip/data/1/2

目标

现在,我要做的是从系统中删除用户(用户及其存储的文档)。

对我有用的唯一方法是为每个文档 URL 发送 HTTP DELETE 请求。像这样:

DELETE https://server.ip/data/1/1
DELETE https://server.ip/data/1/2

这是有效的。但是,在这个解决方案中,我必须多次调用 delete。我想在一次通话中删除所有文档。因此,该解决方案被拒绝。

我的第一次尝试是发送 HTTP DELETE 请求到

https://server.ip/data/1

不幸的是,它不起作用(错误代码 400)。

我的第二次尝试是使用该_delete_by_query功能。我存储的每个文档都UserId包含包含 UserId 的字段。因此,我尝试进行删除查询以删除“数据”索引中包含值为 1 ('UserId'==1) 的字段的所有文档

POST https://server.ip/data/_delete_by_query
{
   "query":{
      "match":{
         "UserId":"1"
      }
   }
}

这也行不通。响应是带有以下正文的 HTTP 错误代码 400:

{
   "error":{
      "root_cause":[
         {
            "type":"invalid_type_name_exception",
            "reason":"Document mapping type name can't start with '_'"
         }
      ],
      "type":"invalid_type_name_exception",
      "reason":"Document mapping type name can't start with '_'"
   },
   "status":400
}

你知道如何解决这些问题吗?也许你有替代解决方案?

谢谢!

4

1 回答 1

0

我假设你已经在你的logstash conf中定义了你的document_type ,在你的output> elasticsearch 中是这样的:

output {        
        elasticsearch {         
            index => "1"
            document_type => "1type"
            hosts => "localhost"            
        }

        stdout {
             codec => rubydebug
        }
    }

因此,您可以简单地删除所有具有相同类型的文档:

curl -XDELETE https://server.ip/data/1/1type

或者如果您愿意使用delete by query ,请尝试这样的事情:

POST https://server.ip/data/_delete_by_query?UserId=1
{
  "query": {
    "match_all": {}
  }
}

这可能是一个绝对的来源宝石。希望能帮助到你!

于 2017-02-02T10:16:37.453 回答