如何在所有现有索引上更新dynamic_templates?

时间:2017-08-15 02:27:10

标签: templates elasticsearch mapping

我正在使用ElasticSearch 5.1和elasticsearch.js 5.0。我们在生产中有许多不同的应用程序,可能有我们的平台默认索引或自定义索引。我们不知道他们的名字。对于新索引,我可以使用dynamic_template添加以下indices.putTemplate()

var elasticsearch = require('elasticsearch');
var client = new elasticsearch.Client({ /*...*/ });
var params = { 
  //...
  "body" : {
    "template":"*",
    "settings":{           
      "index.mapper.dynamic":true
      //...           
    },
    "mappings":{
      "_default_":{
        "properties":{
          //...
        },
        "dynamic_templates":[{
          "template_purchases_inner_fields": {
            "path_match":"purchases.*",
            "mapping": { "include_in_all": false }
          }
        }
        //, ...
        ]
      }
    }
  }
};
client.indices.putTemplate(params,function(err,resp){})

然而,Index templates docs

  

模板仅在索引创建时应用。更改模板不会对现有索引产生影响

Dynamic templates docs

  

可以使用PUT映射API将新模板附加到列表末尾

PUT mapping API有一些例子,其中没有一个适合我的场景。使用indices.putMapping()的答案会更有帮助,但不是必需的。谢谢你的时间!

[于2012年8月21日编辑,日蚀日] 这是我尝试通过JS API更改它的代码:

var dynamicTemplates = [{
    "template_purchases_inner_fields": {
      "path_match": "purchases.*",
      "mapping": { "include_in_all": false}
    }
  }
  //...
  ];

params = { body:  {   "dynamic_templates": dynamicTemplates   }};
params.index = "_all";
params.type = "_default_";
//...
client.indices.putMapping(params,function(err,resp){})

这是通过Linux curl的代码,删除了properties字段。 请注意,您应该在此处重新添加其他模板,而不是覆盖之前的模板:

curl -XPUT http://localhost:9200/_all/_default_/_mapping -d "{\"_default_\":{\"dynamic_templates\":[{\"template_purchases_inner_fields\":{\"mapping\":{\"include_in_all\":false},\"path_match\":\"purchases.*\"}}]}}"

检查elasticsearch-head,在这两种情况下,映射也在现有索引上更新,就像它有效一样。但是,include_in_all=false行为未实现,这意味着我们仍然可以在现有索引上的_all下的包含内部对象的记录上搜索purchases.*

相关项目:

1 个答案:

答案 0 :(得分:0)

目前的答案是我们无法根据Index templates docs

将其应用于现有索引
  

模板仅在索引创建时应用。更改模板不会对现有索引产生影响