从Elastic Search中的索引中删除现有字段

时间:2019-09-29 19:54:03

标签: elasticsearch kibana

我是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" }
      }
} 

请让我知道我在哪里做错了。

谢谢

1 个答案:

答案 0 :(得分:2)

您的语法正确。由于它在后台运行该进程,因此会超时,并且在完成任务之前会超时。

您可以通过指定wait_for_completion=false

run the query asynchronously
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" }
      }
}