我正在尝试使用动态用户创建的字段来索引某些数据。输入数据如下所示:
{ "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
}
当我得到映射时,我看到这些动态字段是按照我的期望创建的。
但是,我还需要保留所有这些值的未分析字符串表示。所以,我添加了一个这样的动态映射模板(以及numVal
和boolVal
字段之一:
"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创建了这个模板,但也许我应该在其他地方寻找?
答案 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"
}
}
}
}
}
}
}
}