【Elasticsearch】文档(一):新增 & 删除

在 Elasticsearch 中,文档Document)是 最小的可索引数据单元,也是信息存储和检索的基本单位。它是 Elasticsearch 的核心概念之一,类似于关系型数据库中的一行记录或 NoSQL 数据库中的一个 JSON 对象。

1.文档的关键特性

  • JSON 格式:文档是一个 JSON 对象,由键值对(字段和值)组成。例如:

    {
      "_index": "books",         // 所属索引
      "_id": "1",               // 文档ID
      "_source": {              // 文档原始内容
        "title": "Elasticsearch 指南",
        "author": "John Doe",
        "publish_date": "2023-10-01"
      }
    }
    
  • 唯一标识:每个文档有一个唯一的 _id(可自定义或由 Elasticsearch 自动生成),用于在索引中唯一标识该文档。

  • 归属于索引:文档必须存储在某个 索引Index)中(类似关系型数据库的 “”)。例如,一个书籍文档可能存储在 books 索引中。

  • 可扩展字段:文档的字段是动态的,无需预先定义结构(除非使用显式映射)。字段类型(如文本、数字、日期等)会自动推断或通过映射(Mapping)指定。

  • 支持嵌套和复杂结构:文档可以包含嵌套对象、数组等复杂结构。例如:

    {
      "user": {
        "name": "Alice",
        "address": {
          "city": "Beijing",
          "postcode": "100000"
        }
      }
    }
    

2.新增文档

2.1 指定 ID 新增文档

场景:明确指定文档的 _id(如书籍 ISBN 作为唯一标识)。

PUT /books/_doc/101  # 索引名: books, 文档ID: 101
{
  "title": "深入理解 Elasticsearch",
  "author": "张三",
  "price": 59.9,
  "publish_date": "2023-05-20"
}

在这里插入图片描述

2.2 不指定 ID 新增文档

场景:让 Elasticsearch 自动生成唯一 _id(如日志场景)。

POST /logs/_doc  # 索引名: logs, 不提供ID
{
  "level": "ERROR",
  "message": "数据库连接超时",
  "timestamp": "2023-10-25T14:30:00Z"
}

在这里插入图片描述

2.3 指定索引批量插入数据

场景:一次性插入多条文档到同一索引(如商品批量导入)。

POST /products/_bulk
{ "index": {} }  # 不指定ID,自动生成
{ "name": "无线鼠标", "price": 99, "category": "电子产品" }
{ "index": { "_id": "1001" } }  # 指定ID为1001
{ "name": "机械键盘", "price": 299, "category": "电子产品" }

在这里插入图片描述

2.4 批量执行多种操作

场景:混合插入、更新、删除操作(如订单系统数据处理)。

POST /orders/_bulk
{ "index": { "_id": "O20230999" } }  # 新增订单
{ "order_id": "O20230999", "amount": 1500, "status": "paid" }
{ "index": { "_id": "O20230998" } }  # 新增订单
{ "order_id": "O20230998", "amount": 1500, "status": "paid" }
POST /orders/_bulk
{ "index": { "_id": "O20231001" } }  # 新增订单
{ "order_id": "O20231001", "amount": 1500, "status": "paid" }
{ "update": { "_id": "O20230999" } }  # 更新订单状态
{ "doc": { "status": "shipped" } }
{ "delete": { "_id": "O20230998" } }  # 删除订单

在这里插入图片描述

2.5 关键说明

  • 批量操作(_bulk
    • 每两行为一个操作:首行声明动作(index / update / delete),次行为数据或参数。
    • 需确保 JSON 格式严格换行(末尾换行符不可省略)。
  • 自动生成 ID
    • 不指定 _id 时,Elasticsearch 会生成类似 x5F6Z4wB3Kp2YvE1 的唯一字符串。
  • HTTP 方法
    • 新增单条文档:PUT(指定 ID)或 POST(不指定 ID)。
    • 批量操作:POST /_bulk

实际应用中,建议使用 Elasticsearch 客户端(如 Python 的 elasticsearch-py)简化操作。

3.删除文档

3.1 删除单个文档

场景:删除指定 _id 的文档(例如删除某本书)。

DELETE /books/_doc/101  # 删除索引 `books` 中 `_id=101` 的文档

响应

{
  "_index": "books",
  "_id": "101",
  "_version": 2,  # 版本号递增
  "result": "deleted",  # 删除成功
  "_shards": {
    "total": 2,
    "successful": 2,
    "failed": 0
  }
}

说明

  • 如果文档不存在,返回 "result": "not_found"
  • 删除操作是 逻辑删除(文档不会立即从磁盘移除,而是在后续段合并时清理)。

3.2 批量文档删除

场景:批量删除符合特定条件的文档(例如删除所有 status="expired" 的订单)。

3.2.1 方法 1:使用 _bulk 删除多个指定 ID 的文档

POST /orders/_bulk
{ "delete": { "_id": "O20231001" } }  
{ "delete": { "_id": "O20231002" } }  
{ "delete": { "_id": "O20231003" } }  

响应

{
  "took": 10,
  "errors": false,
  "items": [
    { "delete": { "_id": "O20231001", "status": 200 } },
    { "delete": { "_id": "O20231002", "status": 200 } },
    { "delete": { "_id": "O20231003", "status": 200 } }
  ]
}

3.2.2 方法 2:使用 _delete_by_query 删除符合查询条件的文档

POST /orders/_delete_by_query
{
  "query": { 
    "term": { "status": "expired" }  # 删除所有 status=expired 的文档
  }
}

响应

{
  "took": 100,
  "timed_out": false,
  "total": 5,  # 共删除5条
  "deleted": 5,
  "batches": 1
}

说明

  • _delete_by_query 适用于 按条件删除,但会触发索引刷新,可能影响性能。
  • 大数据量删除时,建议添加 "conflicts": "proceed" 参数(跳过冲突)和 "scroll_size": 1000(分批处理)。

3.2.3 关键区别

操作类型适用场景性能影响
单条删除(DELETE精确删除指定 _id 的文档低开销,但多次调用效率低
批量删除(_bulk删除多个已知 _id 的文档网络和 I/O 优化,高效
条件删除(_delete_by_query删除符合查询条件的文档触发查询和刷新,大数据量时较慢

3.3 最佳实践

  • 优先使用 _bulk:批量删除已知 ID 的文档时,_bulk 比单条删除快 10-100 倍。
  • 慎用 _delete_by_query:大数据量删除时,建议在低峰期执行,或使用 slices 并行化:
    POST /orders/_delete_by_query?conflicts=proceed&slices=5
    {
      "query": { "range": { "create_time": { "lte": "2023-01-01" } } }
    }
    
  • 强制物理删除:删除后执行 _forcemerge 清理磁盘空间:
    POST /orders/_forcemerge?only_expunge_deletes=true
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

G皮T

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值