[英]Removing an existing field from an index in Elastic Search
我是弹性搜索的新手。 我的索引中有一个不需要的字段,例如索引名称“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" }
}
}
请让我知道我在哪里做错了。
谢谢
你的语法是正确的。 由于它在后台运行进程并在完成任务之前超时,因此您会超时。
您可以通过指定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}"
}
现在您可以使用任务 api 使用上面的值获取任务的状态
GET _tasks/{taskId:node}
或者,如果您不指定wait_for_completion=false
并获得超时,您仍然可以通过以下操作获取所有任务。 但是,我建议做第一个。
GET _tasks?actions=*byquery&detailed.
来自评论:现在说如果我有 100 个具有相似名称模式的索引,例如一个名称为“test_date - MM/DD/YYYY”的索引,这里的前缀是相同的“test”
为了处理多个索引,您可以使用通配符语法并将索引名称替换为前缀和 *
例如,下面的查询将在所有以test
开头的索引上运行:
POST test*/_update_by_query?conflicts=proceed&wait_for_completion=false
{
"script" : "ctx._source.A.remove('B')",
"query" : {
"exists": { "field": "A.B" }
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.