动态映射模板似乎阻止了映射的创建

时间:2015-11-24 23:40:13

标签: elasticsearch

我正在尝试使用动态用户创建的字段来索引某些数据。输入数据如下所示:

{ "kind": "feature",
  "creationDate": 1424561126000,
  "key" : "sdfgsdfg",
  "user": {
    "email" : "me@example.com",
    "custom": {
      "hello": "world",
      "answer": 42,
      "enable_the_thing": true
    }
  }
}

user.custom对象中的键和值是动态的,甚至有些实例可能具有相同键的不同类型的值。所以,我正在将它们翻译成这样的形状:

    "custom": {
      "hello": {
        "stringVal": "world"
      },
      "answer": {
        "numVal": 42
      },
      "enable_the_thing": {
        "boolVal": true
      }
    }

(这样,我可以确定user.custom.hello.stringVal始终是一个字符串,即使另一个文档有数字user.custom.hello.numVal。)

到目前为止,这似乎有效。我将user.custom的映射声明为:

{
  "type": "object",
  "dynamic": true
}

当我得到映射时,我看到这些动态字段是按照我的期望创建的。

但是,我还需要保留所有这些值的未分析字符串表示。所以,我添加了一个这样的动态映射模板(以及numValboolVal字段之一:

"custom_attribute_string": {
    "mapping": {
        "fields": {
            "stringVal": {
                "index": "analyzed", 
                "type": "string"
            }, 
            "untouched": {
                "index": "not_analyzed", 
                "type": "string"
            }
        }, 
        "type": "multi_field"
    }, 
    "path_match": "user.custom.*.stringVal"
}

但是,现在不会在映射中创建动态自定义字段,并且不会对文档编制索引。

我怀疑我的地图模板有问题,但我不知道在哪里看。我根据这些docs创建了这个模板,但也许我应该在其他地方寻找?

1 个答案:

答案 0 :(得分:2)

您的动态映射效果很好,untouched字段已创建,但在查看文档来源时不会显示在结果中。 _source只会包含您发送的任何数据以进行索引。 Elasticsearch将根据您指定的映射索引每个字段,但不会修改_source

您可以通过在其上运行聚合来查看untouched子字段确实存在:

{
  "size": 0,
  "aggs": {
    "untouched_values": {
      "terms": {
        "field": "user.custom.hello.stringVal.untouched"
      }
    }
  }
}

作为旁注,multi-field类型不久前已被弃用,所以即使它仍然有效,您应该使用指定多字段的新方法,如下所示:

"custom_attribute_string": {
    "mapping": {
        "type": "string",
        "fields": {
            "untouched": {
                "index": "not_analyzed", 
                "type": "string"
            }
        }
    }, 
    "path_match": "user.custom.*.stringVal"
}

请注意,为了重新创建上述问题,我创建了以下索引:

curl -XPUT localhost:9200/testindex -d '{
  "mappings": {
    "test": {
      "dynamic_templates": [
        {
          "custom_attribute_string": {
            "mapping": {
              "fields": {
                "stringVal": {
                  "index": "analyzed",
                  "type": "string"
                },
                "untouched": {
                  "index": "not_analyzed",
                  "type": "string"
                }
              },
              "type": "multi_field"
            },
            "path_match": "user.custom.*.stringVal"
          }
        }
      ],
      "properties": {
        "user": {
          "properties": {
            "email": {
              "type": "string"
            },
            "custom": {
              "type": "object",
              "dynamic": true
            }
          }
        }
      }
    }
  }
}'

然后我将以下测试文档编入索引:

curl -XPUT localhost:9200/testindex/test/1 -d '{
  "user": {
    "email": "val@me.com",
    "custom": {
      "hello": {
        "stringVal": "world"
      },
      "answer": {
        "numVal": 42
      },
      "enable_the_thing": {
        "boolVal": true
      }
    }
  }
}'

运行之后,我检索了映射,您可以看到hello.stringVal.untouched子字段存在:

{
  "customs" : {
    "mappings" : {
      "custom" : {
        "dynamic_templates" : [ {
          "custom_attribute_string" : {
            "mapping" : {
              "type" : "multi_field",
              "fields" : {
                "untouched" : {
                  "index" : "not_analyzed",
                  "type" : "string"
                },
                "stringVal" : {
                  "index" : "analyzed",
                  "type" : "string"
                }
              }
            },
            "path_match" : "user.custom.*.stringVal"
          }
        } ],
        "properties" : {
          "user" : {
            "properties" : {
              "custom" : {
                "dynamic" : "true",
                "properties" : {
                  "answer" : {
                    "dynamic" : "true",
                    "properties" : {
                      "numVal" : {
                        "type" : "long"
                      }
                    }
                  },
                  "enable_the_thing" : {
                    "dynamic" : "true",
                    "properties" : {
                      "boolVal" : {
                        "type" : "boolean"
                      }
                    }
                  },
                  "hello" : {
                    "dynamic" : "true",
                    "properties" : {
                      "stringVal" : {
                        "type" : "string",
                        "fields" : {
                          "untouched" : {
                            "type" : "string",
                            "index" : "not_analyzed"
                          }
                        }
                      }
                    }
                  }
                }
              },
              "email" : {
                "type" : "string"
              }
            }
          }
        }
      }
    }
  }
}