来源:https://mp.weixin.qq.com/s/3MLWKZ8akJk7HbZnKopmVA
动态映射
概念说明
DSL实例
创建索引
我们先创建一个新的索引,不指定mapping
PUT user_info_dynamic_mapping
查询mapping
查询该索引的mapping,可以看到mapping默认是空的
GET user_info_dynamic_mapping/_mappings
往索引写数据
我们往索引中写一条数据在看mappings
PUT user_info_dynamic_mapping/user_info_dynamic_mapping/1
{
"id":1,
"name":"张三",
"birthdate":"1988-09-01"
}
我们看到7.0之后_doc(类型)被叫做终点名称。
查看mappings
再次查看该索引的mapping
GET user_info_dynamic_mapping/_mappings
可以看到加入数据后产生了mapping
再次写入数据
PUT user_info_dynamic_mapping/user_info_dynamic_mapping/2
{
"id":2,
"name":"李四",
"birthdate":"1989-09-01",
"sex":"男"
}
执行后mapping自动又创建了
注意:当我们想关闭改功能时可在创建mapping时指定 "dynamic":"strict",
日期检测
当索引第一条数据入库时,ElasticSearch会自动猜测字段类型,如果该数据索引字段为日期型字符串,那么它被认为日期型,另外如果有新的字段添加第一条数据入索引也是该规则。比如:第一条数据格式为{"note":"2019-01-08"}那么改字段认定为日期型,但是实际我们想该字段为字符型,当再次添加{"note":"我是一条鱼"}这时改字段显然不是日期类型,此时会抛出异常下面我们通过设置date_detection为false来关闭日期检测
关闭日期检测
PUT /user_info_dynamic_date
{
"mappings": {
"date_detection":false
}
通过这种方式映射后面日期型也会映射为字符型,如果后面需要新增date类型字段,
元字段
mapping元字段是mapping映射中描述文档本身的字段,大致可以分为文档属性元数据、文档元数据、索引元数据、路由元数据和自定义元数据。
分类元数据说明
文档属性元数据_index文档所属的索引
_id文档的id
_type文档所属类型
_uid由_type和_id字段组成
文档元数据_source文档的原生json字符串
_size整个_source字段的字节数大小
索引元数据_all自动组合所有的字段值
_field_names索引了每个字段的名称
路由元数据_parent指定文档之间父子关系,已过时
_routing将一个文档根据路由存储到指定分片上
自定义元数据_meta用于自定义元数据
_type
在6.0.0中弃用。此doc的mapping type名, 自动被索引,可被查询,聚合,排序使用,或者脚本里访问 。
_id
doc的id,建索引时候传入 ,不被索引, 可通过_uid被查询,脚本里使用,不能参与聚合或排序。6.0之前的版本并不是这样的,因为它们支持多种类型,所以_type和_id被合并为一个名为_uid的复合主键。
_uid
在6.0.0中弃用。现在,类型已被删除,文档由_id唯一标识,_uid字段仅作为查看_id字段以保持向后兼容。
_source
_source字段包含在索引时间传递的原始JSON文档正文。_source字段本身没有编入索引(因此不可搜索),但它被存储,以便在执行获取请求(如get或search)时可以返回它。默认_source字段是开启的,也就是说,默认情况下存储文档的原始值。如果某个字段内容非常多(比如一篇小说),或者查询业务只需要对该字段进行搜索,返回文档id,然后通过其他途径查看文档原文,则不需要保留_source元字段。可以通过禁用_source元字段,在ElasticSearch 中只存储倒排索引,不保留字段原始值。
_size
整个_source字段的字节数大小 。
_all
_all可能不再为在6.0+中创建的索引启用,请使用自定义字段和映射copy_to参数
_all字段是把其它字段拼接在一起的超级字段,所有的字段用空格分开,_all字段会被解析和索引,但是不存储。当你只想返回包含某个关键字的文档但是不明确地搜某个字段的时候就需要使用_all字段。按照官方文档的说法,_all元字段默认是禁用的,如果需要使用,可以通过"_all": {"enabled": true}开启,测试如下。PUT myindex { "mappings": { "mytype": { "_all": {"enabled": true}, "properties": { "title": { "type": "text" }, "content": { "type": "text" } } } } }但是创建失败,报错:”Enabling [_all] is disabled in 6.0. As a replacement, you can use [copy_to] on mapping fields to create your own catch all field.”看来在Elasticsearch 6. 0+中_all元字段是真的不能使用了。
_field_names
_field_names字段索引文档中每个字段的名称,其中包含除null以外的任何值。存在查询使用此字段来查找对于特定字段具有或不具有任何非空值的文档。
_parent
ES6.0+改为join的实现方式,使用join数据类型。
_routing
使用以下公式将文档路由到索引中的特定分片:
shard_num = hash(_routing) % num_primary_shards,The default value used for _routing is the document’s _id.
_routing的默认值是文档的_id。自定义路由模式可以通过指定每个文档的自定义路由值来实现。
文章来源:https://mp.weixin.qq.com/s/3MLWKZ8akJk7HbZnKopmVA