-
private int retryOnConflict = 0:更新冲突时重试次数。
-
private RefreshPolicy refreshPolicy = RefreshPolicy.NONE:刷新策略。NONE:代表不重试;
-
private ActiveShardCount waitForActiveShards = ActiveShardCount.DEFAULT:执行操作之前需要等待激活的副本数,已在《Elasticsearch Document Get API详解、原理与示例》中详细介绍。
-
private IndexRequest upsertRequest:使用该 字段进行更新操作,如果原索引不存在,则更新,类似于saveOrUpdate操作,该操作需要与脚步执行,详细将在后续章节中描述,
-
private boolean scriptedUpsert = false;是否是用脚步执行更新操作。
-
private boolean docAsUpsert = false; 是否使用saveOrUpdate模式,即是否使用IndexRequest upsertRequest进行更新操作。(docAsUpser=true+ doc组合,将使用saveOrUpdate模式)。
-
private boolean detectNoop = true;是否检查空操作,下文会进行详细介绍。
-
private IndexRequest doc;默认使用该请求进行更新操作。
从上述我们基本可以得知更新基本有3种方式,script、upsert、doc(普通更新)。
2、深入分析Elasticsearch Update API(更新API)
2.1 Script脚步更新
Elasticsearch可以通过脚本(painless)进行更新,其具体语法见:https://www.elastic.co/guide/en/elasticsearch/painless/current/index.html ,,本节不会深入去学习其语法,后续会看单独的章节对其进行详细讲解。
2.2 部分字段更新(普通更新方式)
更新API支持传递一个部分文档(_source字段中包含类型的部门字段),它将被合并到现有的文档中(简单的递归合并,对象的内部合并,替换核心的“键/值”和数组)。如果需要完全替代现有的文档,请使用(Index API)。以下部分更新为现有文档添加了一个新字段:(下文会给出基于java的API调用)。
POST test/_doc/1/_update
{
“doc” : {
“name” : “new_name”
}
}
如果指定了doc和script,则script属性优先,关于更新API一个比较好的实践是使用脚步更新(painless),后续会重点章节详细介绍。
2.3 检测空更新(检测本请求是否值得更新)
该功能特性的意思是当提交的请求,发现与原文档的数据并未发送变化,是否执行update操作,默认检测。如果开启检测,detectNoop=true,如果检测到数据并未发生变化,则返回结果为noop(空操作),如果detectNoop=false,每次操作都会执行,版本号将自增。
2.4 保存或更新(Upserts)
如果文档还不存在,upsert元素的内容将作为新文档插入。Elasticsearch支持scripted_upsert和doc_as_upsert两种模式,以scripted_upsert优先。通过UpdateRequest#scriptedUpsert和UpdateRequest#docAsUpsert控制。
2.5 核心参数一览表
更新API主要核心参数一览表
| 参数名 | 说明 |
| — | — |
| retry_on_conflict | Elasticsearch基于版本进行乐观锁控制,当版本冲突后,允许的重试次数,超过重试次数retry_on_conflict后抛出异常。 |
| routing | 路由策略。 |
| timeout | 等待分片的超时时间。 |
| wait_for_active_shards | 在执行命令之前需要等待副本的数量。 |
| refresh | 刷新机制。 |
| _source | 允许在响应中控制更新后的源是否和如何返回。默认情况下,更新的源代码不会返回。有关源字段过滤,请参考《Elasticsearch Document Get API详解、原理与示例》中详细介绍。 |
| version | 版本字段,基于乐观锁控制。 |
注意:更新API不支持除内部以外的版本控制,外部(版本类型外部和外部的)或强制(版本类型的force)版本控制不受更新API的支持,因为它会导致弹性搜索版本号与外部系统不同步。
3、Update API使用示例
本节将暂时不会展示使用脚步进行更新的Demo,此部分会在后续文章中单独的章节来介绍ElasticSearch painless Script。
3.1 常规更新(更新部分字段)
public static void testUpdate_partial() {
RestHighLevelClient client = EsClient.getClient();
try {
UpdateRequest request = new UpdateRequest(“twitter”, “_doc”, “10”);
IndexRequest indexRequest = new IndexRequest(“twitter”, “_doc”, “10”);
Map<String, String> source = new HashMap<>();
source.put(“user”, “dingw2”);
indexRequest.source(source);
request.doc(indexRequest);
UpdateResponse result = client.update(request, RequestOptions.DEFAULT);
System.out.println(result);
testGet();
} catch (Throwable e) {
e.printStackTrace();
} finally {
EsClient.close(client);
}
}
最终结果:调用get API能反映出user字段已经更新为dingw2,及更新成功。
3.2 开启detectNoop(detectNoop=true),并且并不改变数据
public static void testUpdate_noop() {
RestHighLevelClient client = EsClient.getClient();
try {
UpdateRequest request = new UpdateRequest(“twitter”, “_doc”, “10”);
request.detectNoop(true);
request.doc(buildIndexRequest());
UpdateResponse result = client.update(request, RequestOptions.DEFAULT);
System.out.println(result);
} catch (Throwable e) {
e.printStackTrace();
} finally {
EsClient.close(client);
}
}
返回结果:
{
“_shards”: {
“total”: 0,
“successful”: 0,
“failed”: 0
},
“_index”: “twitter”,
“_type”: “_doc”,
“_id”: “10”,
“_version”: 6,
“result”: “noop”
}
其特征为result为noop,并且_shards各个字段都返回0,表示没有在任何分片上执行该动作,并且数据的版本_version并不会发送变化。
3.3 不开启detectNoop(detectNoop=false),并且并不改变数据
public static void testUpdate_no_noop() {
RestHighLevelClient client = EsClient.getClient();
try {
UpdateRequest request = new UpdateRequest(“twitter”, “_doc”, “10”);
request.detectNoop(false);
request.doc(buildIndexRequest());
UpdateResponse result = client.update(request, RequestOptions.DEFAULT);
System.out.println(result);
} catch (Throwable e) {
e.printStackTrace();
} finally {
EsClient.close(client);
}
}
返回结果:
{
“_shards”: {
“total”: 2,
“successful”: 1,
“failed”: 0
},
“_index”: “twitter”,
“_type”: “_doc”,
“_id”: “10”,
“_version”: 7,
“result”: “updated”
}
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
最后
毕竟工作也这么久了 ,除了途虎一轮,也七七八八面试了不少大厂,像阿里、饿了么、美团、滴滴这些面试过程就不一一写在这篇文章上了。我会整理一份详细的面试过程及大家想知道的一些问题细节
美团面试经验
字节面试经验
菜鸟面试经验
蚂蚁金服面试经验
唯品会面试经验
因篇幅有限,图文无法详细发出
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
2934261)]
字节面试经验
[外链图片转存中…(img-LN6T5yuY-1713082934261)]
菜鸟面试经验
[外链图片转存中…(img-RO0Bh5vS-1713082934261)]
蚂蚁金服面试经验
[外链图片转存中…(img-PhyVhvGM-1713082934261)]
唯品会面试经验
[外链图片转存中…(img-I7EhRlbA-1713082934261)]文章来源:https://www.toymoban.com/news/detail-855468.html
因篇幅有限,图文无法详细发出
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!文章来源地址https://www.toymoban.com/news/detail-855468.html
到了这里,关于Elasticsearch Document Update API详解、原理与示例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!