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",
}
}