我使用弹性搜索(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请求发送到
不幸的是,它无法正常工作(错误代码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
}
你知道如何解决这些问题吗?也许您有替代解决方案吗?
谢谢!
答案 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的绝对宝石。希望它有所帮助!