弹性搜索:按查询删除不起作用

时间:2017-02-02 09:53:13

标签: elasticsearch elasticsearch-5

简介

我使用弹性搜索(v5.x)并尝试通过查询删除文档。

我的索引称为"数据"。文档以层次结构存储。以此模式构建的文档URL:

  

https://server.ip/data/ {用户ID} / {文档ID}

所以,让我们说用户ID' 1'存储了两个文档(' 1',' 2')。因此,他们的直接网址是:

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。所以,我尝试删除所有文档的删除查询,数据' index,包含值为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
}

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

谢谢!

1 个答案:

答案 0 :(得分:0)

我假设您在输出> elasticsearch 中的 logstash conf 中定义了 document_type

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

        stdout {
             codec => rubydebug
        }
    }

因此,您只需删除具有相同类型的所有文档:

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

如果您愿意使用按查询删除,请尝试以下操作:

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

这可能是source的绝对宝石。希望它有所帮助!