我在elasticsearch中创建索引时提供默认的映射动态模板,并希望检查它是否按预期工作。让我难过,我怎么验证它是否有效? (使用ES 2.2.2)
"mappings": {
"_default_": {
"dynamic_templates": [
{
"no_date_detection": {
"match_mapping_type": "string",
"mapping": {
"type": "string",
"date_detection": false
}
}
},
{
"language_de": {
"match_mapping_type": "*",
"match": "*_de",
"mapping": {
"type": "string",
"analyzer": "german"
}
}
},
{
"language_es": {
"match": "*_es",
"match_mapping_type": "*",
"mapping": {
"type": "string",
"analyzer": "spanish"
}
}
},
{
"language_en": {
"match": "*_en",
"match_mapping_type": "*",
"mapping": {
"type": "string",
"analyzer": "english"
}
}
}
]
}
}
这很简单,就像文档中提供的示例一样。
获取映射表明动态模板已传递给新类型
"testobject": {
"dynamic_templates": [
{
"no_date_detection": {
"mapping": {
"type": "string",
"date_detection": false
},
"match_mapping_type": "string"
}
},
{
"language_de": {
...
但是当我创建一个具有新字段的对象时 “description_en”:“一些英文文本” 并获得它刚刚显示的映射
"description_en": {
"type": "string"
}
不应该这样 “分析员”:“英语” 在它?
我做错了什么,如果我的动态映射是正确的,我该如何验证它是否已被应用?
提前致谢/ Carsten
正如我的问题“如何验证它是否已被应用?”似乎不清楚,我试着简化:
如何验证动态模板是否已应用于新创建的字段?
简化示例:
PUT /myindex
{
"mappings": {
"_default_": {
"dynamic_templates": [
{
"no_date_detection": {
"match_mapping_type": "string",
"mapping": {
"type": "string",
"date_detection": false
}
}
}
]
}
}
}
PUT /myindex/gardeners/1
{
"name": "gary"
}
GET /myindex/_mapping
{
"myindex": {
"mappings": {
"gardeners": {
"dynamic_templates": [
{
"no_date_detection": {
"mapping": {
"type": "string",
"date_detection": false
},
"match_mapping_type": "string"
}
}
],
"properties": {
"name": {
"type": "string"
}
}
},
"_default_": {
"dynamic_templates": [
{
"no_date_detection": {
"mapping": {
"type": "string",
"date_detection": false
},
"match_mapping_type": "string"
}
}
]
}
}
}
}
我的新字段“name”的映射
"properties": {
"name": {
"type": "string"
}
}
不包含
"date_detection": false
为什么不传世呢?
答案 0 :(得分:0)
动态模板按照它们的定义顺序进行检查,第一个匹配,即获得应用的模板。
在您的情况下,no_date_detection
模板与您的字段description_en
匹配,因为它是string
。
如果您希望该字段与english
分析器一起使用,则需要更改模板的顺序:
"mappings": {
"_default_": {
"dynamic_templates": [
{
"language_de": {
"match_mapping_type": "*",
"match": "*_de",
"mapping": {
"type": "string",
"analyzer": "german"
}
}
},
{
"language_es": {
"match": "*_es",
"match_mapping_type": "*",
"mapping": {
"type": "string",
"analyzer": "spanish"
}
}
},
{
"language_en": {
"match": "*_en",
"match_mapping_type": "*",
"mapping": {
"type": "string",
"analyzer": "english"
}
}
},
{
"no_date_detection": {
"match_mapping_type": "string",
"mapping": {
"type": "string",
"date_detection": false
}
}
}
]
}
}
答案 1 :(得分:0)
我在我的假设中发现了错误:"date_detection": false
与dynamic_templates无关。
您必须直接在映射上指定date_detection(而不是在特定类型的级别)。 https://www.elastic.co/guide/en/elasticsearch/guide/current/custom-dynamic-mapping.html
如果您希望将其自动添加到新索引中,则可以使用索引模板。
感谢Yannick的提示(https://discuss.elastic.co/t/mappings--default--dynamic-templates-doesnt-show-up-in-resulting-mapping/59030)