ElasticSearch修改文档
文档更新
ES可以使用PUT或者POST对文档进行更新, 如果指定ID的文档已经存在, 则执行更新操作
注意:
执行更新操作的时候ES首先将旧的文档标记为删除状态,然后添加新的文档,旧的文档不会立即消失, 但是你也无法访问,ES会在你继续添加更多数据的时候在后台清理已经标记为删除状态的文档
1. 普通更新
添加数据
PUT test3/_doc/1
{
"name": "徐晓",
"age": 50,
"birthday": "1970-01-11"
}
注意,文档更新一次,version 就会自增 1。
可以直接更新整个文档:
PUT test3/_doc/1
{
"name":"大柱国"
}
这种方式,更新的文档会覆盖掉原文档。
大多数时候,我们只是想更新文档字段,这个可以通过脚本来实现。
POST /test3/_doc/1/_update
{
"doc":{
"name": "北凉王"
}
}
通过脚本实现
POST test3/_update/1
{
"script": {
"lang": "painless",
"source":"ctx._source.name=params.name",
"params": {
"name":"大将军"
}
}
}
更新的请求格式:POST {index}/_update/{id}
在脚本中,lang 表示脚本语言,painless 是 es 内置的一种脚本语言。source 表示具体执行的脚本,ctx 是一个上下文对象,通过 ctx 可以访问到 _source、_name 等。
也可以向文档中添加字段:
POST test3/_update/1
{
"script": {
"lang": "painless",
"source":"ctx._source.tags=[\"wuxia\",\"xianxia\"]"
}
}
通过脚本语言,也可以修改数组。例如再增加一个 tag:
POST test3/_update/1
{
"script":{
"lang": "painless",
"source":"ctx._source.tags.add(\"xiuxian\")"
}
}
当然,也可以使用 if else 构造稍微复杂一点的逻辑。
# 判断文档的tags字段是否包含xiuxian,如果包含就删除文档
POST test3/_update/1
{
"script": {
"lang": "painless",
"source": "if (ctx._source.tags.contains(\"xiuxian\")){ctx.op=\"delete\"}else{ctx.op=\"none\"}"
}
}
2. 查询更新
通过条件查询找到文档,然后再去更新。
例如将 title 中包含 666 的文档的 content 修改为 888。
# 添加数据
POST blog/_doc
{
"title":"666",
"date":"2020-11-05",
"content":"关于庙堂权争与刀剑交错的江湖"
}
POST blog/_doc
{
"title":"剑来",
"date":"2020-11-05",
"content":"关于庙堂权争与刀剑交错的江湖"
}
# 查看索引(blog)下的全部数据
GET blog/_doc/_search
# 查询 id 为 1DhOHXcBuH13WhKO6DUz 的数据
GET blog/_doc/1DhOHXcBuH13WhKO6DUz
# 将 title 中包含 666 的文档的 content 修改为 888。
POST blog/_update_by_query
{
"script": {
"source": "ctx._source.content=\"888\"",
"lang": "painless"
},
"query": {
"term": {
"title":"666"
}
}
}