客户为了实现search after功能,必须有一个modify_at字段在更新doc的时候不能修改,也就是更新的时候如果请求body里包含了这个modify_at字段,就不更新;但是同时又要保证upsert功能,在没有该文档的时候,就新增该文档。
梳理一下,客户的需求就是在upsert的同时,实现部分更新。
部分更新文档的话就需要通过update API 实现,通过指定文档id来实现部分更新,部分更新可以通过plainless script或者指定doc字段来实现
另外,update API 可以实现upsert功能,在body中指定upsert字段来实现。
综上,最终通过如下方式解决了客户的需求:
{
"script": {
"source": "ctx._source.a = params.a;ctx._source.b = params.b;",
"lang": "painless",
"params": {
"a": 1,
"b": 1
}
},
"upsert": {
"a": 1,
"b": 1,
"modify_at": 1634819527790
}
}
或者通过指定doc字段实现部分更新:
{
"doc": {
"a": 1,
"b": 1
},
"upsert": {
"a": 1,
"b": 1,
"modify_at": 1634819527790
}
}
{
"_index": "x",
"_id": "1",
"_version": 1,
"_seq_no": 12,
"_primary_term": 1,
"found": true,
"_source": {
"a": 1,
"b": 1,
"modify_at": 1634819527790
}
}
{
"script": {
"source": "ctx._source.a = params.a;ctx._source.b = params.b;",
"lang": "painless",
"params": {
"a": 2,
"b": 2
}
},
"upsert": {
"a": 2,
"b": 2,
"modify_at": 1634819527790
}
}
或者
{
"doc": {
"a": 2,
"b": 2
},
"upsert": {
"a": 1,
"b": 1,
"modify_at": 1634819527790
}
}
{
"_index": "x",
"_id": "1",
"_version": 2,
"_seq_no": 13,
"_primary_term": 1,
"found": true,
"_source": {
"a": 2,
"b": 2,
"modify_at": 1634819527790
}
}
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。