您好,登录后才能下订单哦!
# Elasticsearch document id 生成方式是什么
## 引言
在Elasticsearch中,每个存储在索引中的文档都必须有一个唯一的标识符,称为`_id`。文档ID不仅是文档的唯一标识,还直接影响文档的存储位置、检索效率和部分功能实现。本文将全面解析Elasticsearch中document id的生成机制、最佳实践及其底层原理。
---
## 一、Document ID基础概念
### 1.1 什么是Document ID
- 唯一标识符:类似数据库主键
- 元数据字段:存储在`_id`字段中
- 不可变性:创建后不可修改
### 1.2 ID的核心作用
1. **文档定位**:参与_routing计算,决定分片位置
2. **版本控制**:与`_version`字段协同工作
3. **操作效率**:精确查找时比query更快
---
## 二、ID生成方式详解
### 2.1 显式指定ID(用户自定义)
```json
PUT /my_index/_doc/1
{
"title": "Explicit ID Example"
}
特点: - 完全控制ID内容 - 需确保唯一性 - 适用于业务主键映射场景
使用场景: - 从其他系统迁移数据 - 需要与业务ID保持关联 - 需要人类可读的标识符
POST /my_index/_doc
{
"title": "Auto-generated ID Example"
}
响应示例:
{
"_id": "V5xOc4QB3ZK5n3qT7QH1",
"_version": 1,
"result": "created"
}
生成规则: - 20字符长度的Base64编码字符串 - 使用UUID v4算法变体 - 包含时间戳成分(前4字节)
优点: - 分布式系统友好 - 零碰撞概率 - 无需客户端协调
// Elasticsearch源码片段(org.elasticsearch.common.UUIDs)
public static String base64UUID() {
final byte[] uuid = new byte[15];
SecureRandomHolder.INSTANCE.nextBytes(uuid);
return Base64.getUrlEncoder().withoutPadding().encodeToString(uuid);
}
ID值通过以下公式决定文档存储位置:
shard_num = hash(_id) % num_primary_shards
重要影响: - 相同ID的文档始终路由到同一分片 - 自动生成的ID实现均匀分布
PUT /logs/_doc/log-2023-08-20-001
{
"timestamp": "2023-08-20T00:00:00Z"
}
最佳实践:
- 结合日期前缀(如YYYYMMDD-
)
- 适合日志类数据
- 便于按时间范围删除
PUT /orders/_doc/CUST123-ORD20230820-001
{
"customer_id": "CUST123",
"order_date": "2023-08-20"
}
优势: - 保留业务语义 - 支持前缀搜索 - 便于人工识别
方案 | 写入性能 | 读取性能 | 存储开销 |
---|---|---|---|
自增数字 | ★★★★☆ | ★★★☆☆ | ★★★★★ |
UUID | ★★★☆☆ | ★★★☆☆ | ★★★☆☆ |
业务ID | ★★☆☆☆ | ★★★★☆ | 取决于长度 |
_id
字段设为keyword
类型PUT /my_index
{
"mappings": {
"_id": {
"type": "keyword"
}
}
}
PUT /my_index/_doc/1?op_type=create
{
"text": "Conflict resolution example"
}
响应代码: - 409 Conflict:ID已存在 - 201 Created:创建成功
POST _bulk
{ "index" : { "_index" : "test", "_id" : "1" } }
{ "field1" : "value1" }
{ "create" : { "_index" : "test", "_id" : "2" } }
{ "field1" : "value2" }
批量操作建议: - 混合使用index/create - 预生成ID列表减少延迟
版本 | 重大变更 |
---|---|
5.x | 移除_path字段依赖 |
6.x | 限制ID长度至512字符 |
7.x | 增强UUID生成器的线程安全性 |
系统 | ID生成方式 | 分布式特性 |
---|---|---|
MongoDB | ObjectId | 机器标识+计数器 |
Cassandra | UUID | 时间排序 |
Elasticsearch | Base64 UUID | 完全随机 |
Elasticsearch提供了灵活多样的document id生成策略,开发者应根据业务场景在控制性和便利性之间做出权衡。自动生成的ID适合大多数分布式场景,而显式ID则更适合需要与外部系统集成的场合。理解ID生成机制对于优化集群性能和设计数据模型至关重要。
最佳实践提示:在日志类应用中推荐使用时间序列ID,而在电商等业务系统中建议采用业务主键映射方式。 “`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。