Elasticsearch document id 生成方式是什么

发布时间:2021-12-16 17:33:36 作者:柒染
来源:亿速云 阅读:245
# 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保持关联 - 需要人类可读的标识符

2.2 自动生成ID(ES生成)

POST /my_index/_doc
{
  "title": "Auto-generated ID Example"
}

响应示例:

{
  "_id": "V5xOc4QB3ZK5n3qT7QH1",
  "_version": 1,
  "result": "created"
}

生成规则: - 20字符长度的Base64编码字符串 - 使用UUID v4算法变体 - 包含时间戳成分(前4字节)

优点: - 分布式系统友好 - 零碰撞概率 - 无需客户端协调


三、底层生成机制

3.1 自动ID生成流程

  1. 协调节点接收请求
  2. 检查是否包含ID字段
  3. 调用UUID生成器
    
    // 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);
    }
    

3.2 分片路由计算

ID值通过以下公式决定文档存储位置:

shard_num = hash(_id) % num_primary_shards

重要影响: - 相同ID的文档始终路由到同一分片 - 自动生成的ID实现均匀分布


四、进阶ID策略

4.1 时间序列ID模式

PUT /logs/_doc/log-2023-08-20-001
{
  "timestamp": "2023-08-20T00:00:00Z"
}

最佳实践: - 结合日期前缀(如YYYYMMDD-) - 适合日志类数据 - 便于按时间范围删除

4.2 复合ID策略

PUT /orders/_doc/CUST123-ORD20230820-001
{
  "customer_id": "CUST123",
  "order_date": "2023-08-20"
}

优势: - 保留业务语义 - 支持前缀搜索 - 便于人工识别


五、性能优化建议

5.1 ID设计原则

方案 写入性能 读取性能 存储开销
自增数字 ★★★★☆ ★★★☆☆ ★★★★★
UUID ★★★☆☆ ★★★☆☆ ★★★☆☆
业务ID ★★☆☆☆ ★★★★☆ 取决于长度

5.2 关键注意事项

  1. 避免超长ID:超过512字节会降低性能
  2. 热点问题:顺序ID可能导致写入热点
  3. 映射优化:将_id字段设为keyword类型
PUT /my_index
{
  "mappings": {
    "_id": {
      "type": "keyword"
    }
  }
}

六、特殊场景处理

6.1 冲突处理机制

PUT /my_index/_doc/1?op_type=create
{
  "text": "Conflict resolution example"
}

响应代码: - 409 Conflict:ID已存在 - 201 Created:创建成功

6.2 批量操作中的ID管理

POST _bulk
{ "index" : { "_index" : "test", "_id" : "1" } }
{ "field1" : "value1" }
{ "create" : { "_index" : "test", "_id" : "2" } }
{ "field1" : "value2" }

批量操作建议: - 混合使用index/create - 预生成ID列表减少延迟


七、版本演进对比

7.1 历史版本变化

版本 重大变更
5.x 移除_path字段依赖
6.x 限制ID长度至512字符
7.x 增强UUID生成器的线程安全性

7.2 与同类系统比较

系统 ID生成方式 分布式特性
MongoDB ObjectId 机器标识+计数器
Cassandra UUID 时间排序
Elasticsearch Base64 UUID 完全随机

结论

Elasticsearch提供了灵活多样的document id生成策略,开发者应根据业务场景在控制性和便利性之间做出权衡。自动生成的ID适合大多数分布式场景,而显式ID则更适合需要与外部系统集成的场合。理解ID生成机制对于优化集群性能和设计数据模型至关重要。

最佳实践提示:在日志类应用中推荐使用时间序列ID,而在电商等业务系统中建议采用业务主键映射方式。 “`

推荐阅读:
  1. Elasticsearch 索引文档
  2. 一、Elasticsearch原理与基本使用

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

document id elasticsearch

上一篇:java并发之同步辅助类CyclicBarrier的示例分析

下一篇:怎么解析Python中的Dict

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》