0%

elasticsearch映射中的元字段

Elasticsearch 映射中的元字段:内置字段的作用与用法

在 Elasticsearch 中,元字段(Meta-fields)是索引文档时自动生成或可配置的内置字段,用于描述文档的元数据(如 ID、索引名)或控制文档的处理逻辑(如路由、存储)。这些字段是 Elasticsearch 内部机制的重要组成部分,理解它们的作用有助于优化查询性能和数据管理。

_all 字段:全局全文搜索字段

_all 字段是一个特殊的 “聚合字段”,它会将文档中所有字段的文本内容合并为一个大字符串,用于在不知道具体字段名的情况下进行全文搜索。

特性

  • 默认情况下,_all 字段会包含所有 textkeyword 类型字段的值(数字、日期等类型需显式配置才会被包含)。
  • 6.0 版本后默认禁用,需手动开启。

配置与使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// 创建索引时开启 _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 禁用(节省存储)。

配置与使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 禁用 _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+ 新增)记录文档中因类型不匹配而被忽略的字段名称(如将字符串写入数字字段)。

作用

  • 帮助排查数据写入异常,识别不符合映射定义的字段。

使用示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 查询所有包含被忽略字段的文档
GET my_index/_search
{
"query": {
"exists": { "field": "_ignored" }
}
}

// 查看被忽略的具体字段
GET my_index/_search
{
"script_fields": {
"ignored_fields": {
"script": { "source": "doc['_ignored']" }
}
}
}

_id 字段:文档唯一标识

_id 字段是文档的唯一标识符,由用户指定或自动生成(如不指定 ID 时)。

特性

  • 不参与全文索引,但可用于精确查询、更新、删除操作。
  • 可在查询中通过 _id 字段过滤(需用 termsids 查询)。

使用示例

1
2
3
4
5
6
7
// 通过 _id 字段查询
GET my_index/_search
{
"query": {
"ids": { "values": ["1", "2", "3"] } // 匹配 ID 为 1、2、3 的文档
}
}

_index 字段:文档所属索引

_index 字段记录文档所在的索引名称,常用于跨索引查询时区分来源。

特性

  • 可在查询、聚合、排序中使用,帮助分析多索引数据。

使用示例

1
2
3
4
5
6
7
8
9
10
// 跨索引查询并按索引分组
GET index_a,index_b/_search
{
"aggs": {
"by_index": {
"terms": { "field": "_index", "size": 10 } // 按索引名称聚合
}
},
"sort": [{"_index": { "order": "asc" }}] // 按索引名称排序
}

_meta 字段:自定义元数据

_meta 字段用于存储应用程序特定的元数据(如映射版本、业务标识),不影响索引和查询,仅作为附加信息。

配置示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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 字段:分片路由控制

1
2
_routing` 字段用于指定文档存储到哪个分片,默认值为文档的 `_id`,通过哈希算法计算分片位置:
`shard_num = hash(_routing) % 主分片数量

作用

  • 自定义路由可将相关文档(如同一用户的所有数据)路由到同一分片,减少查询时的分片扫描,提升性能。

使用示例

1
2
3
4
5
6
7
8
9
10
11
12
// 写入文档时指定路由
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 筛选字段)。

配置与使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 禁用 _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 会导致以下功能失效:

  • 更新操作(updateupdate_by_query);
  • 高亮显示;
  • 重建索引(reindex);
  • 调试与数据恢复。

已废弃的元字段

_type 字段(6.0+ 废弃)

  • 早期用于区分索引内的文档类型(如同一索引下的 userorder 类型)。
  • 7.0+ 彻底移除,改用独立索引区分不同类型的文档。

_uid 字段(6.0+ 废弃)

  • 早期为 _type_id 的组合(格式:type#id),用于唯一标识文档。
  • _type 废弃而移除。

_parent 字段(逐步被 join 类型替代)

  • 用于建立同一索引内文档的父子关系(如 “评论” 关联 “文章”)。
  • 推荐使用 join 类型替代,功能更完善

欢迎关注我的其它发布渠道

表情 | 预览
快来做第一个评论的人吧~
Powered By Valine
v1.3.10