Skip to content

ES

参考资料:

操作文档


1、Document


Document 是 Elasticsearch 数据的基本单元,类似于 关系型数据库中的一行数据。

一个典型的 ES 文档示例如下:

json
{
  "id": "1",
  "name": "Java并发编程实战",
  "author": "Brian Goetz",
  "price": 89.00,
  "published_date": "2024-03-01",
  "tags": ["Java", "并发", "编程"],
  "description": "一本讲解Java多线程编程的经典书籍。"
}

2、操作


2.1.新增文档

es 中通过 Restful 请求操作文档,请求内容用 DSL 语句来表示。新增一条 document 的 DSL 语法如下:

json
POST /indexName/_doc/文档id
{
  "fieldName01": "值1",
  "fieldName02": "值2",
  "fieldName03": {
    "fieldName031": "值3",
    "fieldName032": "值4"
  },
  // ...
}

示例:

json
POST /heima/_doc/1
{
  "info":"黑马程序元学java",
  "email":"645299910@qq.com",
  "name":{
    "firstName":"云",
    "lastName":"赵"
  }
}

2.2.查询文档

json
GET /indexName/_doc/docId

示例:

json
GET /heima/_doc/1

结果:

json
{
  "_id": "1",// 文档的唯一标识符,相当于MySQL中的 主键
  "_index": "heima",// 文档所在的 索引名称
  "_primary_term": 1,// 主分片版本号,在分布式环境中,primary_term 会随着 主分片的重新选举 而增加,用于确保数据一致性
  "_seq_no": 0,// 序列号,每次对文档执行写操作(创建、更新、删除)时,序列号会自增,用于数据的版本控制和冲突检测
  "_source": {// 文档的实际数据内容,存储在 _source 字段中
    "email": "645299910@qq.com",
    "info": "黑马程序元学java",
    "name": {
      "firstName": "云",
      "lastName": "赵"
    }
  },
  "_version": 1,// 表示当前文档的 版本号,每次更新文档时,版本号都会自动增加,用于实现乐观锁
  "found": true // 表示查询是否找到了该文档
}

2.3.删除文档

json
DELETE /indexName/_doc/docId

示例:

json
DELETE /heima/_doc/1

结果:

json
{
  "_id": "1",
  "_index": "heima",
  "_primary_term": 2,
  "_seq_no": 1,
  "_shards": {
    "failed": 0,
    "successful": 1,
    "total": 2
  },
  "_version": 2,
  "result": "deleted"
}

如果再次新增 id = 1 的文档,然后查询,结果为:

json
{
  "_id": "1",
  "_index": "heima",
  "_primary_term": 2,// 由于主分片切换或故障恢复导致的
  "_seq_no": 2,// 表示经过了三次写操作:创建 → 删除 → 重新插入
  "_source": {
    "email": "645299910@qq.com",
    "info": "黑马程序元学java",
    "name": {
      "firstName": "云",
      "lastName": "赵"
    }
  },
  "_version": 1,// 删除之后再创建,相当于一个新的生命周期
  "found": true
}

2.4.修改文档

修改文档,分为两种方式:

  • 全量修改,会删除旧的文档,添加新文档
json
PUT /indexName/_doc/docId
{
  "fieldName01": "值1",
  "fieldName02": "值2",
  "fieldName03": {
    "fieldName031": "值3",
    "fieldName032": "值4"
  },
  // ...
}
  • 部分修改,修改指定字段值
json
PUT /indexName/_update/docId
{
  "doc": {
    "fieldName01": "值1",
  }
}