Elasticsearch 之 Mappings
映射(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 analyzer
,english analyzer
,french 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,新的字段名称会自动添加,并被索引。新的字段既可以添加到顶层的映射类型,也可以添加到 object
和 nested
字段的内部。
显式映射(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。
新字段的自动检测和添加称为动态映射。动态映射规则可以通过以下方式定制,以满足具体的目的:
- 动态字段映射:(控制动态字段检测的规则)
- 动态模版:(为动态添加的字段配置映射的自定义规则)
注: 索引模版在不管是动态创建,还是显示创建,都允许你配置默认的映射、设置、新索引的别名。
翻译自:
推荐阅读
-
Java事务管理学习之Spring和Hibernate详解
-
elasticsearch mapping 映射
-
Elasticsearch 之 Mappings
-
elasticsearch mapping之一:引入mapping
-
记一次ElasticSearch 更改 mapping 字段类型的过程
-
Java事务管理学习之Hibernate详解
-
Android自定义ViewGroup之第一次接触ViewGroup
-
Python环境搭建之OpenCV的步骤方法
-
elasticsearch映射相关字段定义,属性定义,及动态映射(marvel插件方式)mapping
-
(四)elasticsearch之mapping详解和数据类型