什么是meta-fields
在Elasticsearch下,文档包含数据、元数据。元数据主要定义文档各个字段的限制等,比如_index:指定文档属于哪个索引。元数据一般在mapping映射的时候设置。
有哪些meta-fields
ES中元数据大体分为五中类型:身份元数据、索引元数据、文档元数据、路由元数据以及其他类型的元数据
身份元数据
- _index:文档所属索引 , 自动被索引,可被查询,聚合,排序使用,或者脚本里访问
- _type:文档所属类型,自动被索引,可被查询,聚合,排序使用,或者脚本里访问
- _id:文档的唯一标识,建索引时候传入 ,不被索引, 可通过_uid被查询,脚本里使用,不能参与聚合或排序
- _uid:由_type和_id字段组成,自动被索引 ,可被查询,聚合,排序使用,或者脚本里访问
索引元数据
- _all: 自动组合所有的字段值,以空格分割,可以指定分器词索引,但是整个值不被存储,所以此字段仅仅能被搜索,不能获取到具体的值
- _field_names:索引了每个字段的名字,可以包含null值,可以通过exists查询或missing查询方法来校验特定的字段
- _timestamp:可以手工指定时间戳值,也可以自动生成使用now()函数,除此之外还可以设置日期的格式化,忽略确实等功能
- _ttl:对于一些会话数据或者验证码失效时间,一般来说是有生命周期的,在es中可以很方便的通过这个ttl来设置存活时间,比如1小时,或者10分钟,在超时过后,这个doc会被自动删除,这种方式并不适合按周或按天删除历史数据,如果是这种需求,可考虑使用索引级别的管理方式
文档元数据
- _source : 一个doc的原生的json数据,不会被索引,用于获取提取字段值 ,启动此字段,索引体积会变大,如果既想使用此字段又想兼顾索引体积,可以开启索引压缩
- _size: 整个_source字段的字节数大小,需要单独安装一个插件才能展示,
路由元数据
- _parent:在同一个索引中,可以通过_parent字段来给两个不同mapping type的数据建立父子关系,在查询时可以通过has_child, has_parent等查询,来聚合join数据,需要注意的是,父子type必须不能是一样的,否则会识别失败。
- _routing: 一个doc可以被路由到指定的shard上,通过下面的规则:
shard_num = hash(_routing) % num_primary_shards
默认情况下,会使用doc的_id字段来参与路由规则,如果此doc有父子关系,则会以父亲的_id作为路由规则,以确保父子数据 必须处于同一个shard上,以提高join效率。。
自定义路由时,需要注意路由的规则要一致
其他
- _meta:每个mapping type可以有不同的元数据类型,我们可以存储自己定义认为的元数据中,此字段支持查询和更新