Templates 如何在Elasticsearch中为字段定义动态模板映射,同时保持其他字段的严格动态设置?
我想在Elasticsearch中为一个字段创建一个动态映射,但是我在这样做时遇到了问题,同时使用“严格的”动态设置来限制其他字段的创建 例如,我希望能够像下面这样索引文档,“members”字段中的对象键是动态的:Templates 如何在Elasticsearch中为字段定义动态模板映射,同时保持其他字段的严格动态设置?,templates,dynamic,elasticsearch,mapping,Templates,Dynamic,elasticsearch,Mapping,我想在Elasticsearch中为一个字段创建一个动态映射,但是我在这样做时遇到了问题,同时使用“严格的”动态设置来限制其他字段的创建 例如,我希望能够像下面这样索引文档,“members”字段中的对象键是动态的: POST /groups/group { "members" : { "Bob" : { "age" : 50 } } } POST /groups/group { "members" : {
POST /groups/group
{
"members" : {
"Bob" : {
"age" : 50
}
}
}
POST /groups/group
{
"members" : {
"Alice" : {
"age" : 40
}
}
}
但我还想将添加到“members”字段的字段限制为“object”类型,并限制内部对象中的字段,以便只允许使用“age”字段。例如,当我尝试为以下两个文档编制索引时,它们应该会生成一个错误:
POST /groups/group
{
"members" : {
"foo" : "bar",
"Alice" : {
"age" : 40
}
}
}
POST /groups/group
{
"members" : {
"Alice" : {
"foo" : "bar",
"age" : 40
}
}
}
下面是我一直在尝试的动态映射。当我尝试为其中一个具有所需结构的文档编制索引时,会出现以下错误:“StrictDynamicMappingException[映射设置为strict,不允许在[members]中动态引入[Bob]”
我曾尝试在映射的各个部分将“dynamic”设置为“true”,但这打破了我想要实施的限制
关于如何允许在“成员”字段中使用动态键名,同时在其他位置保持“严格”设置,您有什么想法吗?当您试图将工具弯曲变形以符合您的设计时,您应该重新考虑您的设计。更简单的方法是让members对象包含一个name字段和一个age字段。我上面使用的人为示例只是为了说明我希望实现的原则,我同意在示例情况下,您建议的替代方案将是一个更干净的设计。对于我正在处理的用例,能够通过“members.Bob.age”或“members.Alice.age”等路径来寻址属性将非常有用。我在自定义计分脚本中访问这些值,这样寻址可以避免我在大型对象列表上迭代,检查每个对象的“name”字段。但我也更喜欢在可能的情况下定义映射:)
PUT /groups/group/_mapping
{
"dynamic" : "strict",
"dynamic_templates" : [
{
"members_template" : {
"path_match" : "members.*",
"match_mapping_type" : "object",
"mapping" : {
"type" : "object",
"properties" : {
"{name}" : {
"properties" : {
"age" : {"type" : "long"}
}
}
}
}
}
}
],
"properties":{
"members":{
"type":"object"
}
}
}