elasticsearch映射中的元字段
Elasticsearch 映射中的元字段:内置字段的作用与用法
在 Elasticsearch 中,元字段(Meta-fields)是索引文档时自动生成或可配置的内置字段,用于描述文档的元数据(如 ID、索引名)或控制文档的处理逻辑(如路由、存储)。这些字段是 Elasticsearch 内部机制的重要组成部分,理解它们的作用有助于优化查询性能和数据管理。
_all 字段:全局全文搜索字段
_all 字段是一个特殊的 “聚合字段”,它会将文档中所有字段的文本内容合并为一个大字符串,用于在不知道具体字段名的情况下进行全文搜索。
特性
- 默认情况下,
_all字段会包含所有text或keyword类型字段的值(数字、日期等类型需显式配置才会被包含)。 - 6.0 版本后默认禁用,需手动开启。
配置与使用
// 创建索引时开启 _all 字段
PUT my_index
{
"mappings": {
"default": {
"_all": { "enabled": true }, // 开启 _all 字段
"properties": {
"name": { "type": "text" },
"age": { "type": "integer", "include_in_all": true } // 强制将数字字段包含到 _all
}
}
}
}
// 使用 _all 字段搜索(匹配 name 或 age 中包含相关值的文档)
GET my_index/_search
{
"query": {
"match": { "_all": "john 30" } // 无需指定具体字段,搜索所有字段
}
}
注意
_all字段会增加索引存储和写入开销,仅在需要 “全局搜索” 场景下使用。- 可通过
include_in_all: false排除特定字段(如敏感信息)。
_field_names 字段:非空字段跟踪
_field_names 字段记录文档中所有非空字段的名称,用于快速查询 “包含特定字段” 或 “包含任意非空字段” 的文档。
特性
- 自动索引文档中所有非空字段的名称,无需手动配置。
- 可通过
enabled: false禁用(节省存储)。
配置与使用
// 禁用 _field_names 字段(如需)
PUT my_index
{
"mappings": {
"default": {
"_field_names": { "enabled": false }
}
}
}
// 查询包含 "email" 字段的文档
GET my_index/_search
{
"query": {
"term": { "_field_names": "email" }
}
}
_ignored 字段:跟踪被忽略的字段
_ignored 字段(6.4+ 新增)记录文档中因类型不匹配而被忽略的字段名称(如将字符串写入数字字段)。
作用
- 帮助排查数据写入异常,识别不符合映射定义的字段。
使用示例
// 查询所有包含被忽略字段的文档
GET my_index/_search
{
"query": {
"exists": { "field": "_ignored" }
}
}
// 查看被忽略的具体字段
GET my_index/_search
{
"script_fields": {
"ignored_fields": {
"script": { "source": "doc['_ignored']" }
}
}
}
_id 字段:文档唯一标识
_id 字段是文档的唯一标识符,由用户指定或自动生成(如不指定 ID 时)。
特性
- 不参与全文索引,但可用于精确查询、更新、删除操作。
- 可在查询中通过
_id字段过滤(需用terms或ids查询)。
使用示例
// 通过 _id 字段查询
GET my_index/_search
{
"query": {
"ids": { "values": ["1", "2", "3"] } // 匹配 ID 为 1、2、3 的文档
}
}
_index 字段:文档所属索引
_index 字段记录文档所在的索引名称,常用于跨索引查询时区分来源。
特性
- 可在查询、聚合、排序中使用,帮助分析多索引数据。
使用示例
// 跨索引查询并按索引分组
GET index_a,index_b/_search
{
"aggs": {
"by_index": {
"terms": { "field": "_index", "size": 10 } // 按索引名称聚合
}
},
"sort": [{"_index": { "order": "asc" }}] // 按索引名称排序
}
_meta 字段:自定义元数据
_meta 字段用于存储应用程序特定的元数据(如映射版本、业务标识),不影响索引和查询,仅作为附加信息。
配置示例
PUT my_index
{
"mappings": {
"default": {
"_meta": { // 自定义元数据
"app_version": "1.0.0",
"schema": "user",
"last_updated": "2023-07-01"
},
"properties": {
"name": { "type": "text" }
}
}
}
}
// 查看元数据
GET my_index/_mapping
_routing 字段:分片路由控制
_routing` 字段用于指定文档存储到哪个分片,默认值为文档的 `_id`,通过哈希算法计算分片位置:
`shard_num = hash(_routing) % 主分片数量
作用
- 自定义路由可将相关文档(如同一用户的所有数据)路由到同一分片,减少查询时的分片扫描,提升性能。
使用示例
// 写入文档时指定路由
PUT my_index/default/1?routing=user123
{
"user_id": "user123",
"content": "我的第一条动态"
}
// 查询时指定路由(仅扫描该路由对应的分片)
GET my_index/default/_search?routing=user123
{
"query": { "term": { "user_id": "user123" } }
}
_source 字段:原始文档存储
_source 字段存储文档的原始 JSON 数据,查询时默认返回,便于查看完整文档内容。
特性
- 不建立索引,但会占用存储空间。
- 支持部分返回(通过
_source_include/_source_exclude筛选字段)。
配置与使用
// 禁用 _source 字段(不推荐,会丢失原始数据)
PUT my_index
{
"mappings": {
"default": {
"_source": { "enabled": false }
}
}
}
// 查询时只返回特定字段
GET my_index/default/1?_source=name,age
// 或在搜索中配置
GET my_index/_search
{
"_source": ["name", "age"],
"query": { "match_all": {} }
}
注意
禁用 _source 会导致以下功能失效:
- 更新操作(
update、update_by_query); - 高亮显示;
- 重建索引(
reindex); - 调试与数据恢复。
已废弃的元字段
_type 字段(6.0+ 废弃)
- 早期用于区分索引内的文档类型(如同一索引下的
user和order类型)。 - 7.0+ 彻底移除,改用独立索引区分不同类型的文档。
_uid 字段(6.0+ 废弃)
- 早期为
_type和_id的组合(格式:type#id),用于唯一标识文档。 - 随
_type废弃而移除。
_parent 字段(逐步被 join 类型替代)
- 用于建立同一索引内文档的父子关系(如 “评论” 关联 “文章”)。
- 推荐使用
join类型替代,功能更完善