【Elasticsearch】_update api用于更新单文档,更新多个文档使用_update_by_query
是的,Elasticsearch 的 `_update` API 主要用于单文档更新。它允许你对单个文档进行部分更新或完全替换,具体取决于你的需求。
`_update` API 的特点
- 单文档操作:`_update` API 一次只能操作一个文档,通过指定文档的 `_id` 来定位目标文档。
- 部分更新:你可以使用 `doc` 参数对文档的部分字段进行更新,而不需要替换整个文档。
- 全量替换:如果需要完全替换文档内容,可以结合 `doc_as_upsert` 参数实现。
- 脚本更新:通过 `script` 参数,可以使用脚本动态更新文档内容,甚至在文档不存在时创建新文档(通过 `scripted_upsert`)。
示例:单文档更新
部分更新
假设你有一个文档,初始内容如下:
```json
{
"name": "John Doe",
"age": 25,
"email": "john.doe@example.com"
}
```
你可以使用 `_update` API 更新 `age` 字段:
```json
POST /my_index/_update/1
{
"doc": {
"age": 30
}
}
```
更新后,文档内容变为:
```json
{
"name": "John Doe",
"age": 30,
"email": "john.doe@example.com"
}
```
使用脚本更新
你也可以通过脚本动态更新文档内容:
```json
POST /my_index/_update/1
{
"script": {
"source": "ctx._source.age += params.increment",
"lang": "painless",
"params": {
"increment": 5
}
}
}
```
完全替换文档
如果需要完全替换文档内容,可以结合 `doc_as_upsert` 参数:
```json
POST /my_index/_update/1
{
"doc": {
"name": "John Doe",
"age": 30,
"email": "john.doe@example.com"
},
"doc_as_upsert": true
}
```
批量更新
如果你需要更新多个文档,可以使用 `_update_by_query` API,它允许你根据查询条件批量更新文档。例如:
```json
POST /my_index/_update_by_query
{
"script": {
"source": "ctx._source.age += params.increment",
"lang": "painless",
"params": {
"increment": 5
}
},
"query": {
"match_all": {}
}
}
```
这个请求会更新 `my_index` 中所有文档的 `age` 字段。
总结
- `_update` API:适用于单文档更新,支持部分更新、脚本更新和全量替换。
- `_update_by_query` API:适用于批量更新,可以根据查询条件更新多个文档。
选择哪种 API 取决于你的具体需求:如果你只需要更新单个文档,使用 `_update` API;如果你需要批量更新多个文档,使用 `_update_by_query` API。