我是Elastic搜索的新手。我的索引中有一个不需要的字段,例如索引名称“ test_index”。其中包含近155154个文档。我想从索引中删除不需要的字段“ B”。这就是我的索引模式在json格式下的样子
{A:{B:{C:}}
我相信删除B也会自动从索引中删除C。为了做到这一点,我使用了以下查询,但它似乎没有用。
POST test_index/_update_by_query?conflicts=proceed {
"script" : "ctx._source.A.remove('B')",
"query" : {
"exists": { "field": "A.B" }
}
}
请让我知道我在哪里做错了。
谢谢
答案 0 :(得分:2)
您的语法正确。由于它在后台运行该进程,因此会超时,并且在完成任务之前会超时。
您可以通过指定wait_for_completion=false
POST test_index/_update_by_query?conflicts=proceed&wait_for_completion=false
{
"script" : "ctx._source.A.remove('B')",
"query" : {
"exists": { "field": "A.B" }
}
}
以上将给出带有taskId的响应
{
"task" : "{taskId:node}"
}
现在您可以使用task api to get the status of the task并使用上面的值
GET _tasks/{taskId:node}
或者,如果您未指定wait_for_completion=false
并超时,则仍然可以通过以下操作获得所有任务。但是,我建议您做第一个。
GET _tasks?actions=*byquery&detailed.
从评论:现在说我是否有100个具有相似名称的索引 模式,例如名称为“ test_date-MM / DD / YYYY”的索引 这里的前缀是相同的“测试”
为了处理多个索引,可以使用通配符语法并将索引名称替换为前缀和*
例如,下面的查询将对以test
开头的所有索引执行:
POST test*/_update_by_query?conflicts=proceed&wait_for_completion=false
{
"script" : "ctx._source.A.remove('B')",
"query" : {
"exists": { "field": "A.B" }
}
}