Elasticsearch Document Update API详解、原理与示例

本文解析了一线大厂Java面试中的常见问题,重点介绍了ElasticsearchUpdateAPI的使用,包括Script更新、部分字段更新、Upserts、detectNoop和retry_on_conflict等核心概念,以及实战示例和最佳实践。
摘要由CSDN通过智能技术生成

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!

  • 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”

}

总结

至此,文章终于到了尾声。总结一下,我们谈论了简历制作过程中需要注意的以下三个部分,并分别给出了一些建议:

  1. 技术能力:先写岗位所需能力,再写加分能力,不要写无关能力;
  2. 项目经历:只写明星项目,描述遵循 STAR 法则;
  3. 简历印象:简历遵循三大原则:清晰,简短,必要,要有的放矢,不要海投;

以及最后为大家准备的福利时间:简历模板+Java面试题+热门技术系列教程视频

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!
星项目,描述遵循 STAR 法则;
3. 简历印象:简历遵循三大原则:清晰,简短,必要,要有的放矢,不要海投;

以及最后为大家准备的福利时间:简历模板+Java面试题+热门技术系列教程视频

[外链图片转存中…(img-Q0isParM-1714420218212)]

[外链图片转存中…(img-VJgPJekl-1714420218213)]

[外链图片转存中…(img-QQg3eSKe-1714420218213)]

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!

  • 11
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值