我正在尝试为如下对象创建动态映射:
{ "product": { "productId": 99999, "manufacturerId": "A0001", "manufacturerCode": "A101LI", "name": "Test Product", "description": "Describe the product here.", "feature_details":{ "category": "Category1", "brand": "Brand Name" }, "feature_tpcerts":{ "certifiedPass": true, "levelCertified": 2 }, "feature_characteristics":{ "amount": 0.73, "location": 49464 } } }
我希望feature_*属性为嵌套类型,该类型是我在下面的映射中使用nested_feature模板定义的,并且按预期工作。但是,我也想让属性的嵌套对象中的每个属性feature_*都multi_value带有facet定义的其他属性。我尝试了第二个nested_template模板,但没有成功。
feature_*
multi_value
facet
{ "product" : { "_timestamp" : {"enabled" : true, "store": "yes" }, "dynamic_templates": [ { "nested_feature": { "match" : "feature_*", "mapping" : { "type" : "nested", "stored": "true" } } }, { "nested_template": { "match": "feature_*.*", "mapping": { "type": "multi_field", "fields": { "{name}": { "type": "{dynamic_type}", "index": "analyzed" }, "facet": { "type": "{dynamic_type}", "index": "not_analyzed" } } } } } ], "properties" : { "productId" : { "type" : "integer", "store" : "yes"}, "manufacturerId" : { "type" : "string", "store" : "yes", "index" : "analyzed"}, "manufacturer" : { "type" : "string", "store" : "yes", "index" : "not_analyzed"}, "manufacturerCode" : { "type" : "string", "store" : "yes"}, "name" : {"type" : "string", "store" : "yes"}, "description": {"type": "string", "index" : "analyzed"} } } }
不幸的是,属性中的feature_*属性是从另一个进程创建的,几乎可以是任何名称/值对。关于如何使用动态模板将属性设置为嵌套的任何建议,以及如何使嵌套对象中的每个属性multi_field带有附加facet属性?
multi_field
您只需要使用即可,path_match而不必match在模式引用整个字段路径时使用它,否则仅考虑其名称(最后一部分)。查看根对象的参考页,其中还包含一些与动态模板有关的文档。
path_match
match
您可能还想使用,match_mapping_type因为您无法"index":"analyzed"为例如数字或布尔字段设置。在这种情况下,您可能想根据字段类型做不同的事情。
match_mapping_type
"index":"analyzed"
我注意到您的文档包含产品根对象,您实际上并不需要它。我将其删除,因为类型名称已经是产品。
另外,除非真正需要,否则我将避免显式存储字段,例如,对于Elasticsearch而言,默认情况下会存储字段,这就是您一直需要的_source字段。
_source
以下映射应适用于您的情况(文档中没有产品根对象):
{ "product" : { "dynamic_templates": [ { "nested_feature": { "match" : "feature_*", "mapping" : { "type" : "nested" } } }, { "nested_template": { "path_match": "feature_*.*", "match_mapping_type" : "string", "mapping": { "type": "multi_field", "fields": { "{name}": { "type": "{dynamic_type}", "index": "analyzed" }, "facet": { "type": "{dynamic_type}", "index": "not_analyzed" } } } } } ] } }