Elasticsearch 提供了一系列文档(Document)API,用于对索引中的个体数据单元进行增删改查操作。以下是对主要文档API的实战介绍:
1. 索引文档 (Index API)
目的:插入或更新文档。
请求方式:PUT 或 POST
URL:PUT /<index>/_doc/<_id>
或 POST /<index>/_doc/<_id>
请求体:包含待索引的文档数据,以JSON格式表示。
示例:
PUT /my_index/_doc/1
{
"title": "Example Document",
"body": "This is an example document.",
"author": "John Doe",
"publication_date": "2024-04-0½"
}
注意:
- 使用
PUT
方法时,如果文档ID已存在,会更新该文档;不存在则插入新文档。 - 使用
POST
方法时,Elasticsearch会自动生成文档ID(如果未指定),并始终插入新文档。在6.x版本之后,推荐使用PUT
方式,因为POST
可能会在未来版本中移除。
2. 获取文档 (Get API)
目的:检索指定ID的文档。
请求方式:GET
URL:GET /<index>/_doc/<_id>
示例:
GET /my_index/_doc/1
3. 更新文档 (Update API)
目的:部分更新文档内容,无需提供完整的文档。
请求方式:POST
URL:POST /<index>/_update/<_id>
请求体:包含更新指令,如 script
或 doc
(用于替换整个文档)。
示例(使用脚本更新body
字段):
POST /my_index/_update/1
{
"script": {
"source": "ctx._source.body += ' Updated content';"
}
}
4. 删除文档 (Delete API)
目的:从索引中移除指定ID的文档。
请求方式:DELETE
URL:DELETE /<index>/_doc/<_id>
示例:
DELETE /my_index/_doc/1
5. 批量操作 (Bulk API)
目的:一次性执行多个索引、更新、删除操作,提高数据处理效率。
请求方式:POST
URL:POST /_bulk
请求体:包含一系列操作行,每行由操作元数据(如{ "index": { "_index": "my_index", "_id": "1" } }
)和可选的文档数据(换行分隔)组成。
示例:
POST /_bulk
{ "index": { "_index": "my_index", "_id": "1" } }
{ "title": "Example Document", "body": "Original content" }
{ "update": { "_index": "my_index", "_id": "1" } }
{ "doc": { "body": "Updated content" } }
{ "delete": { "_index": "my_index", "_id": "2" } }
6. 版本控制与乐观并发控制
在进行文档操作时,可以利用Elasticsearch的版本控制机制来实现乐观并发控制。在请求中添加 version
、if_seq_no
和 if_primary_term
参数,确保在特定版本或序列号条件下执行操作,避免并发冲突。
7. 刷新与等待索引
-
刷新 (Refresh):通过在请求中添加
?refresh=true
参数,确保操作立即可见于搜索。但频繁刷新会影响写入性能。 -
等待索引 (Wait For Active Shards):使用
wait_for_active_shards
参数指定在多少个主分片上完成操作后才返回成功响应,以保证数据持久化和复制的可靠性。
8. 源字段 (Source Filtering)
在获取文档或搜索结果时,可以使用 _source
参数来筛选返回的文档源字段,只获取需要的部分,节省带宽和处理资源。
9. 文档元数据
每个文档除了用户提供的数据外,还包含一些系统生成的元数据,如 _index
、_type
(在7.x+版本中已弃用)、_id
、_version
、_score
(搜索结果中)等。这些信息在处理文档时可能会用到。
在Elasticsearch实战中,熟练运用这些文档API可以有效地管理和操作索引中的数据。结合实际情况,合理选择API、参数以及请求体内容,以满足具体业务需求并优化系统性能。同时,关注Elasticsearch版本更新带来的API变更,确保代码与最新规范保持一致。