Elasticsearch 之 Mappings

本文围绕Elasticsearch的映射(Mapping)展开,介绍了映射类型、字段数据类型,阐述了防止映射激增的设置。还讲解了动态映射和显式映射,指出已存在字段映射更新方法,最后通过举例说明创建索引时指定映射,以及动态映射规则的定制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

映射(Mapping)

映射是用来定义一个文档,和其包含的字段,是如何存储和索引的过程。举例来说,使用映射可以定义:

  • 哪一个字符串字段应该看作全文索引字段;
  • 哪一个字段包含数字,日期,或者地理定位;
  • 是否文档中所有字段的值都该被索引到 _all 字段中;
  • 日期字段值的格式;
  • 自定义的规则控制是否动态添加索引 (附1)
映射类型(Mapping Type)

每个索引都有一份映射类型决定了文档如何被索引。

一个映射类型有:

Meta-fields

  • 元字段用于定制如何处理文档的相关元数据。元字段包括 _index_type_id_source

Fields or properties

  • 一份映射类型包含字段列表或者文档的相关属性。
字段数据类型

每个字段有一种数据类型:

  • 检点类型包括:text、keyword、date、long、double、boolean、ip;
  • 支持 json 层级结构的类型 object 或者 nested。
  • 特殊类型如 geo_point、geo_shape、completion。

为了不同的目的而用不同的方法索引同样的字段是很常见的。举例来说,一个 string 字段可以设置为 text 达到全文索引的目的,或者设置为 keyword 用来排序或者聚合。以上的两种情况任选一个,在分词的情况下,可以给一个字符串字段使用 standard analyzerenglish analyzerfrench analyzer 等分词器。

这就是多字段的目的。大部分数据类型通过字段参数支持多字段。

防止映射激增的设置

在一个索引中定义太多字段是一种可能导致映射爆炸的情况,这可能导致内存不足错误和难以恢复的情况。这个问题可能比预期的更加常见。例如,考虑如下的情况,每个新增加的文档都引入了新的字段。这在动态映射的设置下是很常见的。每次文档包含的新字段都会最终添加到索引的映射中。对于数据集小的情况并没有什么问题,但是如果映射的集持续增长就会产生问题。以下的设置允许你可以限制字段映射的数量,不管是手动还是自动创建的,为了预防糟糕的文档导致映射激增:

index.mapping.total_fields.limit

索引的最大字段数量。默认值 1000。

index.mapping.depth.limit

字段最大深度,用来衡量内部对象的数量。例如,如果所有的字段都定义在根对象的同一级,那么深度就是 1。如果有一个对象映射,那么深度就是 2,以此类推。默认值 20。

index.mapping.nested_fields.limit

在一个索引中 nested 字段的最大数量默认为 50。索引一个拥有 100 个嵌套字段的文档实际上索引了 101 个文档,因为每个嵌套文档都会被索引为一个独立的隐藏文档。

动态映射(Dynamic mapping)

字段和映射类型在使用前不需要定义。多亏了 dynamic mapping,新的字段名称会自动添加,并被索引。新的字段既可以添加到顶层的映射类型,也可以添加到 objectnested 字段的内部。

显式映射(Explicit mappings)

尽管动态映射在刚开始学习的时候很方便,但是在你比 Elasticsearch 的猜测更了解数据的情况下,指定自己的显示映射更合适。

更新存在的字段映射

除了记录的地方,已经存在的字段映射无法更新。更改映射将意味着使已经存在索引的文档无效。相反,你应该创建一个具有正确映射的新索引,并将数据 重新索引(reindex) 到该索引中。如果您只想重命名字段而不更改其映射,可以使用 别名字段 实现。

举例

当创建索引的时候即可以指定映射,如下:

PUT my_index 
{
  "mappings": {
    "_doc": { 
      "properties": { 
        "title":    { "type": "text"  }, 
        "name":     { "type": "text"  }, 
        "age":      { "type": "integer" },  
        "created":  {
          "type":   "date", 
          "format": "strict_date_optional_time||epoch_millis"
        }
      }
    }
  }
}
curl -X PUT "localhost:9200/my_index" -H 'Content-Type: application/json' -d'
{
  "mappings": {
    "_doc": { 
      "properties": { 
        "title":    { "type": "text"  }, 
        "name":     { "type": "text"  }, 
        "age":      { "type": "integer" },  
        "created":  {
          "type":   "date", 
          "format": "strict_date_optional_time||epoch_millis"
        }
      }
    }
  }
}
'

附录

附1

动态映射

Elasticsearch 最重要的特性特性之一方便上手,让你很快的让你的数据投入使用。为了索引一个文档,你不必走创建索引,定义映射类型,然后定义字段----索引一个文档,然后索引,映射,字段就会自动创建:

PUT data/_doc/1 
{ "count": 5 }
curl -X PUT "localhost:9200/data/_doc/1" -H 'Content-Type: application/json' -d'
{ "count": 5 }
'

注:上面创建了 data 索引,映射类型 _doc,以及字段 count,数据类型为 long。

新字段的自动检测和添加称为动态映射。动态映射规则可以通过以下方式定制,以满足具体的目的:

  1. 动态字段映射:(控制动态字段检测的规则)
  2. 动态模版:(为动态添加的字段配置映射的自定义规则)

注: 索引模版在不管是动态创建,还是显示创建,都允许你配置默认的映射、设置、新索引的别名。
翻译自:

  1. https://www.elastic.co/guide/en/elasticsearch/reference/6.4/mapping.html
  2. https://www.elastic.co/guide/en/elasticsearch/reference/6.4/dynamic-mapping.html
<think>嗯,用户想了解如何配置和使用Elasticsearchmappings。首先,我得回忆一下Elasticsearchmapping的作用。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、付费专栏及课程。

余额充值