Elasticsearch,如何检查我的动态映射是否有效?

时间:2016-08-19 10:21:30

标签: elasticsearch

我在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

正如我的问题“如何验证它是否已被应用?”似乎不清楚,我试着简化:

  1. 我使用默认动态映射创建索引。
  2. 我创建了一个类型“testobject”。
  3. “GET / myindex / testobject / _mappings”验证,正如预期的那样,动态模板将传递给该类型。
  4. 我在testobject类型的对象中创建一个新字段。
  5. “GET / myindex / testobject / _mappings”显示新字段,但没有说'“date_detection”:false'。它只是一个简单的字符串(见上文)。
  6. 如何验证动态模板是否已应用于新创建的字段?

    简化示例:

    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 为什么不传世呢?

2 个答案:

答案 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