繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM