Elasticsearch 【mappings 动态模板dynamic_templates】

本文介绍如何使用Elasticsearch的dynamic_templates特性来精确控制新字段的映射方式,包括通过字段名或数据类型来应用不同的映射配置。此外,还讨论了_default_映射的应用场景。

一、

使用dynamic_templates可以完全控制新字段的映射,你设置可以通过字段名或数据类型应用一个完全不同的映射。

每个模板都由一个名字用于描述这个模板的用途,一个mapping字段用于指导这个映射怎么使用,和至少一个参数match来定义这个模板使用哪个字段。模板是按照顺序检测的,第一个匹配的模板会被启用。通常把具体的模板放置在第一位,不然通用性模板会匹配,导致具体的是无法被匹配到的。

注:以下都是在sense上操作的

例子:我们为/my_index/my_type 分别创建

es:字段名以_es结尾的且是string类型的,需要使用spanish分词器

enn:其他字段的且是string类型的,需要使用english分词器

DELETE /my_index

PUT /my_index
{
    "mappings":{
        "my_type":{
            "dynamic_templates":[
                {
                    "es":{                                     =>模板名称,随意,一般要有语义
                        "match":"*_es",                        =>匹配字段名称
                        "match_mapping_type":"string"          =>匹配字段类型
                        "mapping":{                            => 当匹配到之后,该字段的具体设置
                            "type":"string",
                            "anaylzer":"spanish"
                        }
                    }
                },
                {
                    "en":{                                     =>模板名称,随意,一般要有语义
                        "match":"*",                           =>匹配字段名称(任意,通用的顺序要在之后)
                        "match_mapping_type":"string"          =>匹配字段类型
                        "mapping":{                            => 当匹配到之后,该字段的具体设置
                            "type":"string",
                            "anaylzer":"english"
                        }
                    }
                }
            ]
        }
    }
}


POST /my_index/my_type
{
  "str_es":"xxx",            => 匹配es (字段名称匹配,类型匹配)
  "long_es":123,             => 不会匹配es (字段名称匹配,但类型不匹配)
  "date_es":"2015-01-01",    => 不会匹配es (字段名称匹配,但类型不匹配)
  "long_en":123,             => 不会匹配en (字段名称匹配,但类型不匹配)
  "str_en":"xxx",            => 匹配en (字段名称匹配,但类型不匹配)
  "date_en":"2015-01-01"     => 不会匹配en (字段名称匹配,但类型不匹配)
}


//mapping如下,正是结果
GET /my_index/my_type
{
   "my_index": {
      "mappings": {
         "my_type": {
            "dynamic_templates": [
               {
                  "es": {
                     "mapping": {
                        "analyzer": "spanish",
                        "type": "string"
                     },
                     "match": "*_es",
                     "match_mapping_type": "string"
                  }
               },
               {
                  "en": {
                     "mapping": {
                        "analyzer": "english",
                        "type": "string"
                     },
                     "match": "*",
                     "match_mapping_type": "string"
                  }
               }
            ],
            "properties": {
               "date_en": {
                  "type": "date",
                  "format": "dateOptionalTime"
               },
               "date_es": {
                  "type": "date",
                  "format": "dateOptionalTime"
               },
               "long_en": {
                  "type": "long"
               },
               "long_es": {
                  "type": "long"
               },
               "str_en": {
                  "type": "string",
                  "analyzer": "english"
               },
               "str_es": {
                  "type": "string",
                  "analyzer": "spanish"
               },
               "str_es2": {
                  "type": "string",
                  "analyzer": "english"
               }
            }
         }
      }
   }
}


二、默认映射
_default_

通常一个索引中的所有类型具有共享的字段和设置,用_default_映射来指定会设置更方便,而不是每次创建一个类型是重复操作。_default_映射新类型的模板,除非在自己类型的明确进行覆盖



转载于:https://my.oschina.net/u/204498/blog/529955

<think>嗯,用户想了解如何配置和使用Elasticsearchmappings。首先,我得回忆一下Elasticsearch中mapping的作用。Mapping相当于数据库中的表结构定义,用来定义索引中的字段类型和属性。用户可能刚接触Elasticsearch,需要知道如何正确设置字段类型,比如text、keyword、date等,避免自动推断不符合需求。 接下来,应该分步骤说明配置mapping的方法。用户可能需要在创建索引时显式定义mapping,或者在已有索引上更新。需要注意的是,一旦字段被创建,修改类型可能有限制,可能需要reindex。这里需要提到动态mapping和显式mapping的区别,动态虽然方便,但生产环境建议显式定义。 然后,要给出具体的示例,比如使用REST API创建索引并指定mapping。用户可能需要看到具体的JSON结构,包括字段类型、是否索引、analyzer设置等。比如,name字段用text类型,同时包含keyword子字段用于聚合或排序。 另外,常见配置参数如index、analyzer、format等需要解释清楚。用户可能对如何设置日期格式或者自定义分词器有疑问。还要提到动态模板,用于自动匹配字段名规则应用特定mapping,这对处理大量相似字段的情况有帮助。 可能用户的实际问题包括如何修改已有mapping,这时候需要说明只能添加新字段,无法修改现有字段类型,必须通过reindex。这部分需要强调,避免用户误操作。同时,动态模板的使用场景和示例也很重要,帮助用户灵活处理未知字段。 最后,相关问题的建议应该覆盖mapping设计的最佳实践、动态与显式的选择、修改限制以及动态模板的应用,这些都是用户后续可能遇到的问题。需要确保引用正确的文档链接,比如官方文档中的Mapping部分,帮助用户深入查阅。</think>### Elasticsearch映射(Mappings)配置与使用指南 映射(Mappings)用于定义索引中文档字段的类型、格式和存储方式,类似于数据库表结构的定义。以下是关键配置步骤和示例: --- #### 一、映射的核心作用 1. **字段类型定义** 指定字段类型如`text`(全文检索)、`keyword`(精确匹配)、`date`(时间类型)等,避免自动类型推断不准确。例如: $$ \text{product\_name} \rightarrow \text{text类型} $$ 2. **控制字段行为** 设置`index`(是否可搜索)、`analyzer`(分词器)等属性,如: ```json "content": { "type": "text", "index": true, "analyzer": "ik_max_word" } ``` --- #### 二、映射配置方法 1. **创建索引时显式定义** 通过REST API直接指定字段类型: ```bash PUT /products { "mappings": { "properties": { "name": { "type": "text", "fields": { "keyword": { "type": "keyword" } // 子字段用于聚合 } }, "price": { "type": "double" }, "created_at": { "type": "date", "format": "yyyy-MM-dd HH:mm:ss" } } } } ``` 2. **动态映射(Dynamic Mapping)** Elasticsearch默认自动推断字段类型,但生产环境建议关闭以避免意外结构: ```json PUT /logs { "mappings": { "dynamic": false // 禁止自动添加新字段 } } ``` --- #### 三、关键配置参数 | 参数 | 作用 | |---------------|----------------------------------------------------------------------| | `type` | 字段类型(text/keyword/long/boolean/object等) | | `index` | 是否可被搜索(`true`/`false`) | | `analyzer` | 指定分词器(如`standard`、`ik_smart`) | | `format` | 日期格式(如`yyyy-MM-dd`) | | `fields` | 多字段配置(如主字段用text分词,子字段用keyword聚合) | --- #### 四、实际场景示例 **场景:电商商品索引** ```json PUT /electronics { "mappings": { "properties": { "title": { "type": "text", "analyzer": "ik_max_word", // 中文分词 "search_analyzer": "ik_smart" }, "brand": { "type": "keyword" }, // 精确过滤 "specs": { "type": "object", // 嵌套结构 "properties": { "cpu": { "type": "keyword" }, "memory": { "type": "keyword" } } } } } } ``` --- #### 五、注意事项 1. **修改限制** 已存在字段的类型不可直接修改,需通过`reindex`重建索引[^5]。 2. **动态模板Dynamic Templates)** 自动为匹配规则的字段指定类型,如所有以`_time`结尾的字段设为`date`类型: ```json "dynamic_templates": [{ "time_fields": { "match_pattern": "regex", "match": "^.*_time$", "mapping": { "type": "date" } } }] ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值