Java操作Elasticsearch 之 [Java High Level REST Clientedit]

<a name="VbjtD"></a>
1. 简述
Elasticsearch
是基于Lucene
开发的一个分布式全文检索框架,向Elasticsearch
中存储和从Elasticsearch
中查询,格式是json。向
Elasticsearch
中存储数据,其实就是向es
中的index
下面的type
中存储json
类型的数据。elasticsearch
提供了很多语言的客户端用于操作elasticsearch
服务,例如:java
、python
、.net
、JavaScript
、PHP
等。本文主要介绍如何使用java
语言来操作elasticsearch
服务。在elasticsearch
的官网上提供了两种java
语言的API
,一种是Java Transport Client
,一种是Java REST Client
。
Java Transport Client
**** 是基于 TCP 协议交互的,在elasticsearch 7.0+
版本后官方不再赞成使用,在Elasticsearch 8.0的版本中完全移除TransportClient
**
Java REST Client
是基于 HTTP 协议交互,**而Java REST Client
又分为Java Low Level REST Client
和Java High Level REST Client
-
Java High Level REST Client
是在Java Low Level REST Client
的基础上做了封装,使其以更加面向对象和操作更加便利的方式调用elasticsearch
服务。
官方推荐使用
Java High Level REST Client
,因为在实际使用中,Java Transport Client
在大并发的情况下会出现连接不稳定的情况。
那接下来我们就来看看elasticsearch
提供的Java High Level REST Client
(以下简称高级REST客户端)的一些基础的操作,跟多的操作大家自行阅读elasticsearch的官方文档:[https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-high.html](https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-high.html)
<br />
<br />
<a name="pltdZ"></a>
2. 准备
-
环境:
Windows 10
elasticsearch 7.91
IDEA
Maven
Java 8
高级客户端需要
Java 1.8
并依赖于Elasticsearch core
项目
- 依赖:
<dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>7.9.1</version></dependency><dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>7.9.1</version></dependency>
<a name="yLwsi"></a>
3. 初始化
- 实例需要构建 REST 低级客户端生成器,如下所示:
RestHighLevelClient
RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http"),new HttpHost("localhost", 9201, "http")));
- 高级客户端将在内部创建用于基于提供的生成器执行请求的低级客户端。该低级客户端维护一个连接池并启动一些线程,因此,当您很好地完成高级客户端时,您应该关闭该高级客户端,然后关闭内部低级客户端以释放这些资源。这可以通过 以下时间完成:
close
client.close();
在有关 Java 高级客户端的本文档的其余部分中,实例将引用为 。
RestHighLevelClient
client
<br />案例:
- 查询
index
代码:
public static void main(String[] args) {RestClientBuilder builder = RestClient.builder(new HttpHost("127.0.0.1", //es主机 IP9200 // es 端口http));RestHighLevelClient client = new RestHighLevelClient(builder);GetRequest request = new GetRequest("blog1", //索引"1" //文档ID);//当针对不存在的索引执行获取请求时,响应404状态码,将引发IOException,需要按如下方式处理:GetResponse documentFields = null;try {documentFields = client.get(request, RequestOptions.DEFAULT);} catch (IOException e) {e.printStackTrace();处理因为索引不存在而抛出的异常情况 }System.out.println(documentFields);try {client.close();} catch (IOException e) {e.printStackTrace();}}
- 查询结果:
{"_index": "blog1","_type": "_doc","_id": "1","_version": 1,"_seq_no": 0,"_primary_term": 1,"found": true,"_source": {"age": 1,"country": "fuzhou","date": "2020-09-10","name": "ngitvusercancel"}
}
上述是一个案例的展示,让我们初步了解通过
Java
的高级restful
客户端来访问, 下面我们将进行相关Api
的介绍
<a name="zPBfl"></a>
4. 索引 API (Index Api)
<a name="mWB7r"></a>
4.1 创建索引(Create Index API)
**
<a name="xDqhx"></a>
4.1.1 案例:
/** 创建索引.* url:https://i-code.online/*/public static void main(String[] args) {//创建链接信息RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("127.0.0.1",9200)));//创建索引请求 索引名称 studentCreateIndexRequest createIndexRequest = new CreateIndexRequest("student-1");//创建索引时可以设置与之相关的 特定配置createIndexRequest.settings(Settings.builder().put("index.number_of_shards",3) //分片数.put("index.number_of_replicas",2) //备份数);//创建文档类型映射createIndexRequest.mapping("{\n" +" \"properties\": {\n" +" \"id\": {\n" +" \"type\": \"long\",\n" +" \"store\": true\n" +" },\n" +" \"name\": {\n" +" \"type\": \"text\",\n" +" \"index\": true,\n" +" \"analyzer\": \"ik_max_word\"\n" +" },\n" +" \"content\": {\n" +" \"type\": \"text\",\n" +" \"index\": true,\n" +" \"analyzer\": \"ik_max_word\"\n" +" }\n" +" }\n" +"}",XContentType.JSON //类型映射,需要的是一个JSON字符串);//可选参数//超时,等待所有节点被确认(使用TimeValue方式)createIndexRequest.setTimeout(TimeValue.timeValueMinutes(1));try {//同步执行CreateIndexResponse createIndexResponse = client.indices().create(createIndexRequest, RequestOptions.DEFAULT);//返回的CreateIndexResponse允许检索有关执行的操作的信息,如下所示:boolean acknowledged = createIndexResponse.isAcknowledged();//指示是否所有节点都已确认请求boolean shardsAcknowledged = createIndexResponse.isShardsAcknowledged();//指示是否在超时之前为索引中的每个分片启动了必需的分片副本数System.out.println("acknowledged:"+acknowledged);System.out.println("shardsAcknowledged:"+shardsAcknowledged);System.out.println(createIndexResponse.index());} catch (IOException e) {e.printStackTrace();}try {//关闭客户端链接client.close();} catch (IOException e) {e.printStackTrace();}}
上述是一个 index 创建的过程,具体的细节操作
api
下面详解
<a name="8tDfE"></a>
4.1.2 创建索引请求
- 需要参数:
CreateIndexRequestindex
CreateIndexRequest request = new CreateIndexRequest("twitter");//<1>
<1>要创建索引
<a name="KUm4n"></a>
4.1.3 索引设置
- 创建的每个索引都可以具有与其关联的特定设置。
//此索引的设置
request.settings(Settings.builder()
.put("index.number_of_shards", 3) //分片数
.put("index.number_of_replicas", 2)//备份数
);
<a name="IHo2o"></a>
4.1.4 索引映射
- 可以创建索引,并创建其文档类型的映射
request.mapping(
"{\n" +
" "properties": {\n" +
" "message": {\n" +
" "type": "text"\n" +
" }\n" +
" }\n" +
"}", //<1> 要定义的类型
XContentType.JSON); //<2> 此类型的映射,作为 JSON 字符串提供
<1>要定义的类型
<2>此类型的映射,作为JSON
字符串提供
- 除了上面显示的示例之外,还可以以不同的方式提供映射源:
String
Map<String, Object> message = new HashMap<>();
message.put("type", "text");Map<String, Object> properties = new HashMap<>();
properties.put("message", message);Map<String, Object> mapping = new HashMap<>();
mapping.put("properties", properties);request.mapping(mapping); //接受map的映射集合,自动转为 json
提供自动转换为
JSON
格式的映射源Map
这种方式多层嵌套,在使用过程中注意嵌套,上面标签嵌套:properties -> message -> type
XContentBuilder builder = XContentFactory.jsonBuilder(); // 使用XContentBuilder内容生成器
builder.startObject();
{builder.startObject("properties");{builder.startObject("message");{builder.field("type", "text");}builder.endObject();}builder.endObject();
}
builder.endObject();
映射作为对象提供的源,弹性搜索内置帮助器,用于生成
JSON
内容XContentBuilder
<a name="hVM0R"></a>
4.1.5 索引别名
- 可以在索引创建时设置别名
request.alias(new Alias("twitter_alias").filter(QueryBuilders.termQuery("user", "kimchy"))); //要定义的别名
<a name="NZy2d"></a>
4.1.6 提供整个源
- 前面我们都是一步一步的设置的,其实也可以提供整个源,包括其所有部分(映射、设置和别名):
request.source("{\n" +" \"settings\" : {\n" +" \"number_of_shards\" : 1,\n" +" \"number_of_replicas\" : 0\n" +" },\n" +" \"mappings\" : {\n" +" \"properties\" : {\n" +" \"message\" : { \"type\" : \"text\" }\n" +" }\n" +" },\n" +" \"aliases\" : {\n" +" \"twitter_alias\" : {}\n" +" }\n" +"}", XContentType.JSON);
作为 JSON 字符串提供的源。它也可以作为 或 提供。MapXContentBuilder
<a name="jpX4e"></a>
4.1.7 可选参数
- 可以选择提供以下参数:
request.setTimeout(TimeValue.timeValueMinutes(2));
超时以等待所有节点将索引创建确认为
TimeValue
request.setMasterTimeout(TimeValue.timeValueMinutes(1));
以作为
TimeValue
request.waitForActiveShards(ActiveShardCount.from(2));
request.waitForActiveShards(ActiveShardCount.DEFAULT);
在创建索引
API
返回响应之前等待的活动分片副本数,作为in
t
在创建索引API
返回响应之前等待的活动分片副本数,作为ActiveShardCount
<a name="5ULKS"></a>
4.1.8 同步执行
- 以下列方式执行 时,客户端将等待 返回 ,然后再继续执行代码:
CreateIndexRequest CreateIndexResponse
CreateIndexResponse createIndexResponse = client.indices().create(request, RequestOptions.DEFAULT);
同步调用可能会引发 在高级 REST 客户端中无法解析 REST 响应、请求会发出时间或类似情况下没有从服务器返回的响应的情况下。
IOException
在服务器返回 或 错误代码的情况下,高级客户端尝试分析响应正文错误详细信息,然后引发泛型,并将原始代码添加为抑制异常。4xx 5xx ElasticsearchExceptionResponseException
<a name="ZQkbc"></a>
4.1.9 异步执行
- 也可以以异步方式执行 ,以便客户端可以直接返回。用户需要指定如何通过将请求和侦听器传递到异步创建索引方法来处理响应或潜在故障:
CreateIndexRequest
client.indices().createAsync(request, RequestOptions.DEFAULT, listener);
执行完成时要执行和要使用的
CreateIndexRequest ActionListener
- 异步方法不会阻止并立即返回。完成后,如果执行成功完成,则使用
onResponse
方法调用 ,如果执行失败,则使用onFailure
该方法。失败方案和预期异常与同步执行案例相同。ActionListener
<br />典型的侦听器如下所示:
ActionListener<CreateIndexResponse> listener =new ActionListener<CreateIndexResponse>() {@Overridepublic void onResponse(CreateIndexResponse createIndexResponse) {//成功执行时调用。}@Overridepublic void onFailure(Exception e) {//当整个失败时调用}
};
<br />
<a name="AbcTK"></a>
4.1.10 创建索引响应
- 返回的允许检索有关执行操作的信息,如下所示:
CreateIndexResponse
boolean acknowledged = createIndexResponse.isAcknowledged(); // <1>
boolean shardsAcknowledged = createIndexResponse.isShardsAcknowledged(); // <2>
<1> 指示所有节点是否都已确认请求
<2> 指示在计时之前是否为索引中的每个分片启动所需的分片副本数
<a name="IFCNb"></a>
4.2 删除索引(Delete Index Api)
<a name="q6BGw"></a>
4.2.1 案例:
/*** 删除索引.* url:https://i-code.online/* @param args*/public static void main(String[] args) {//1. 创建客户端RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("127.0.0.1",9200)));//2. 创建DeleteIndexRequest 接受 index(索引名) 参数DeleteIndexRequest request = new DeleteIndexRequest("student");//超时以等待所有节点确认索引删除 参数为 TimeValue 类型request.timeout(TimeValue.timeValueMinutes(1));//连接master节点的超时时间(使用TimeValue方式)request.masterNodeTimeout(TimeValue.timeValueMinutes(1));try {// 调用deleteAcknowledgedResponse response = client.indices().delete(request, RequestOptions.DEFAULT);System.out.printf("isAcknowledged:%s", response.isAcknowledged());} catch (IOException e) {e.printStackTrace();}}
<a name="oBhDh"></a>
4.2.2 删除索引请求
- 需要参数:
DeleteIndexRequestindex
DeleteIndexRequest request = new DeleteIndexRequest("posts");//<1> <1> 索引(index)名
<1> 索引(index)名
<a name="RaUKi"></a>
4.2.3 可选参数
- 可以选择提供以下参数:
request.timeout(TimeValue.timeValueMinutes(2));
request.timeout("2m");
超时以等待所有节点确认索引删除为
TimeValue
类型
超时以等待所有节点确认索引删除为
String
类型
request.masterNodeTimeout(TimeValue.timeValueMinutes(1));//连接master节点的超时时间(使用TimeValue方式)
request.masterNodeTimeout("1m");//连接master节点的超时时间(使用字符串方式)
连接master节点的超时时间(使用TimeValue方式)
连接master节点的超时时间(使用字符串方式)
request.indicesOptions(IndicesOptions.lenientExpandOpen());
设置控制如何解析不可用的索引以及如何展开通配符表达式IndicesOptions
<a name="ygrLg"></a>
4.2.4 同步执行
- 以下列方式执行
DeleteIndexRequest
时,客户端将等待DeleteIndexResponse
返回 ,然后再继续执行代码:DeleteIndexRequest
DeleteIndexResponse
AcknowledgedResponse deleteIndexResponse = client.indices().delete(request, RequestOptions.DEFAULT);
同步调用可能会引发 在高级
REST
客户端中无法解析REST
响应、请求会发出时间或类似情况下没有从服务器返回的响应的情况下。IOException
在服务器返回 或 错误代码的情况下,高级客户端尝试分析响应正文错误详细信息,然后引发泛型,并将原始代码添加为抑制异常。4xx 5xx ElasticsearchExceptionResponseException
<a name="5Li2Z"></a>
4.2.5 异步执行
- 也可以以异步方式执行 ,以便客户端可以直接返回。用户需要指定如何通过将请求和侦听器传递到异步删除索引方法来处理响应或潜在故障:
DeleteIndexRequest
client.indices().deleteAsync(request, RequestOptions.DEFAULT, listener); //<1>
<1> 执行完成时要执行和要使用的DeleteIndexRequest ActionListener
<br />异步方法不会阻止并立即返回。完成后,如果执行成功完成,则使用 ActionListener#onResponse
方法调用 ,如果执行失败,则使用 ActionListener#
onFailure
该方法。失败方案和预期异常与同步执行案例相同。<br />
<br />典型的侦听器如下所示:delete-index<br />
ActionListener<AcknowledgedResponse> listener =new ActionListener<AcknowledgedResponse>() {@Overridepublic void onResponse(AcknowledgedResponse deleteIndexResponse) {//成功执行时调用。}@Overridepublic void onFailure(Exception e) {//当整个失败时调用。DeleteIndexRequest}
};
<a name="o3Llt"></a>
4.2.6 删除索引响应
- 返回的允许检索有关执行操作的信息,如下所示:
DeleteIndexResponse
boolean acknowledged = deleteIndexResponse.isAcknowledged(); //<1> 指示所有节点是否都已确认请求
<1> 指示所有节点是否都已确认请求
- 如果未找到索引,将引发 :
ElasticsearchException
try {DeleteIndexRequest request = new DeleteIndexRequest("does_not_exist");client.indices().delete(request, RequestOptions.DEFAULT);
} catch (ElasticsearchException exception) {if (exception.status() == RestStatus.NOT_FOUND) {//如果未找到要删除的索引,则进行""}
}
如果未找到要删除的索引,则进行""
<a name="kzTnW"></a>
4.3 索引存在(Index Exists Api)
<a name="ObcxS"></a>
4.3.1 案例:
/*** 索引是否存在Api* url:www.i-code.online* @param args*/public static void main(String[] args) {RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("127.0.0.1",9200)));//创建请求GetIndexRequest request = new GetIndexRequest("student");//<1> 是返回本地信息还是从主节点检索状态request.local(false);//<2> 返回结果为适合人类的格式request.humanReadable(true);try {boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);System.out.println(exists);} catch (IOException e) {e.printStackTrace();}}
<a name="CAr97"></a>
4.3.2 索引存在请求
- 高级 REST 客户端使用 "Index Exists API"。索引名称是必需的。
GetIndexRequest
GetIndexRequest request = new GetIndexRequest("twitter"); //<1> index 名称
<1> index 名称
<a name="A72gS"></a>
4.3.3 可选参数
- 索引存在 API 还接受以下可选参数,通过 :
GetIndexRequest
request.local(false);//<1> 是返回本地信息还是从主节点检索状态
request.humanReadable(true); //<2> 返回结果为适合人类的格式
request.includeDefaults(false); //<3> 是否返回每个索引的所有默认设置
request.indicesOptions(indicesOptions); //<4> 控制如何解析不可用的索引以及如何展开通配符表达式
<1> 是返回本地信息还是从主节点检索状态
<2> 返回结果为适合人类的格式
<3> 是否返回每个索引的所有默认设置
<4> 控制如何解析不可用的索引以及如何展开通配符表达式
<a name="Ew5OZ"></a>
4.3.4 同步执行
- 以下列方式执行 时,客户端将等待 返回 ,然后再继续执行代码:
GetIndexRequest
boolean
boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);
与其他同步的相同
<a name="VKjr1"></a>
4.3.5 异步执行
- 也可以以异步方式执行 ,以便客户端可以直接返回。用户需要指定如何通过将请求和侦听器传递到异步索引存在的方法来处理响应或潜在故障:
GetIndexRequest
client.indices().existsAsync(request, RequestOptions.DEFAULT, listener);//<1>执行完成时要执行和要使用的 GetIndexRequest ActionListener
<1>执行完成时要执行和要使用的
GetIndexRequest
ActionListener
异步的处理逻辑与其他异步的相同,都是实现ActionListener
的方法
<a name="PorCz"></a>
4.3.6 响应
- 响应是一个值,指示索引(或索引)是否存在。
boolean
<a name="SPp7w"></a>
5. 文档 Api (Document APIs)
<a name="veOqv"></a>
5.1 索引 API (Index Api)
<a name="yVMjT"></a>
5.1.1 案例:
- 添加记录
private static void test02() {RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("127.0.0.1",9200)));//创建请求, 参数index名称IndexRequest request = new IndexRequest("student");//请求的模式,CREATE: 创建模式,如果已经存在则报错 Index:存在则不再创建,也不报错request.opType(DocWriteRequest.OpType.INDEX);String json = "{\n" +" \"id\": 12,\n" +" \"name\": \"admin\",\n" +" \"content\": \"步的处理逻辑与其他异步的相同,都是实现ActionListener 的方法\"\n" +"}";request.id("1").source(json,XContentType.JSON);IndexResponse indexResponse = null;try {//调用 index 方法indexResponse = client.index(request, RequestOptions.DEFAULT);System.out.println(indexResponse.getVersion());System.out.println(indexResponse.getIndex());System.out.println(indexResponse.getId());System.out.println(indexResponse.status());} catch (ElasticsearchStatusException | IOException e) {e.printStackTrace();}}
<a name="Ymkfz"></a>
5.1.2 索引请求
- 需要以下参数:
IndexRequest
//创建请求, 参数index名称IndexRequest request = new IndexRequest("student"); //<1> index 名称String json = "{\n" +" \"id\": 12,\n" +" \"name\": \"admin\",\n" +" \"content\": \"步的处理逻辑与其他异步的相同,都是实现ActionListener 的方法\"\n" +"}";request.id("1") // <2> 指定文档 ID .source(json,XContentType.JSON // <3> 指定参数类型,json);
<1> index 名称指数
<2> 请求的文档 ID
<3> 指定参数类型,json
<br />提供文档源<br />
- 除了上面显示的示例之外,还可以以不同的方式提供文档源:
String
Map<String, Object> jsonMap = new HashMap<>();
jsonMap.put("id", 1);
jsonMap.put("name", "Admin);
jsonMap.put("content", "步的处理逻辑与其他异步的相同");
IndexRequest indexRequest = new IndexRequest("student").id("1").source(jsonMap);
文档源作为 自动转换为
JSON
格式的Map
XContentBuilder builder = XContentFactory.jsonBuilder();
builder.startObject();
{
builder.field("id", 1);
builder.field("name", "admin);
builder.field("content", "trying out Elasticsearch");
}
builder.endObject();
IndexRequest indexRequest = new IndexRequest("student").id("1").source(builder);
文档源作为对象提供,弹性搜索内置帮助器生成
JSON
内容XContentBuilder
IndexRequest indexRequest = new IndexRequest("student")
.id("1")
.source("id", 1,
"name", "admin",
"content", "trying out Elasticsearch");
作为密钥对提供的文档源,该源将转换为 JSON 格式Object
<a name="b9Ckb"></a>
5.1.3 可选参数
- 可以选择提供以下参数:
request.routing("routing"); //<1>
<1> 路由值
request.timeout(TimeValue.timeValueSeconds(1)); //<1>
request.timeout("1s"); // <2>
<1> 超时以等待主分片 作为 TimeValue
<2> 超时以等待主分片 作为 String
request.setRefreshPolicy(WriteRequest.RefreshPolicy.WAIT_UNTIL); //<1>
request.setRefreshPolicy("wait_for"); //<2>
<1> 将策略刷新 为实例
WriteRequest.RefreshPolicy
<2> 将策略刷新 为String
request.version(2);
版本
request.versionType(VersionType.EXTERNAL); //版本类型
版本类型
request.opType(DocWriteRequest.OpType.CREATE);//<1>
request.opType("create");//<2>
<1> 作为值提供的操作类型
DocWriteRequest.OpType
<2> 提供的操作类型可以是 或(默认)String
create
index
request.setPipeline("pipeline");
在索引文档之前要执行的包含管道的名称
<a name="HlKss"></a>
5.1.4 同步执行
- 以下列方式执行 时,客户端将等待 返回 ,然后再继续执行代码:
IndexRequest
IndexResponse
IndexResponse indexResponse = client.index(request, RequestOptions.DEFAULT);
- 同步调用可能会引发 在高级 REST 客户端中无法解析 REST 响应、请求会发出时间或类似情况下没有从服务器返回的响应的情况下。
IOException
- 在服务器返回 或 错误代码的情况下,高级客户端尝试分析响应正文错误详细信息,然后引发泛型,并将原始代码添加为抑制异常。
4xx 5xx ElasticsearchExceptionResponseException
<a name="o4vR3"></a>
5.1.5 异步执行
- 也可以以异步方式执行 ,以便客户端可以直接返回。用户需要指定如何通过将请求和侦听器传递到异步索引方法来处理响应或潜在故障:
IndexRequest
client.indexAsync(request, RequestOptions.DEFAULT, listener); //<1>
<1> 执行完成时要执行和要使用的
IndexRequest
ActionListener
- 异步方法不会阻止并立即返回。完成后,如果执行成功完成,则使用 方法调用 ,如果执行失败,则使用 该方法。失败方案和预期异常与同步执行案例相同。
ActionListener
onResponse
onFailure
- 典型的侦听器如下所示:index
listener = new ActionListener<IndexResponse>() {@Overridepublic void onResponse(IndexResponse indexResponse) {//<1> 成功执行时调用。}@Overridepublic void onFailure(Exception e) {//<2> 当整个失败时调用。IndexRequest}
};
<1> 成功执行时调用。
<2> 当整个失败时调用。> IndexRequest
<a name="ZeZlj"></a>
5.1.6 索引响应
- 返回的允许检索有关执行操作的信息,如下所示:
IndexResponse
String index = indexResponse.getIndex();
String id = indexResponse.getId();
if (indexResponse.getResult() == DocWriteResponse.Result.CREATED) {//<1>
} else if (indexResponse.getResult() == DocWriteResponse.Result.UPDATED) {//<2>
}
ReplicationResponse.ShardInfo shardInfo = indexResponse.getShardInfo();
if (shardInfo.getTotal() != shardInfo.getSuccessful()) {// <3>
}
if (shardInfo.getFailed() > 0) {for (ReplicationResponse.ShardInfo.Failure failure :shardInfo.getFailures()) {String reason = failure.reason(); //<4>}
}
<1> 处理(如果需要)首次创建文档的情况
<2> 处理(如果需要)文档被重写的情况,因为它已经存在
<3> 处理成功分片数少于总分片的情况
<4> 处理潜在的故障
- 如果存在版本冲突,将引发 :
ElasticsearchException
IndexRequest request = new IndexRequest("posts").id("1").source("field", "value").setIfSeqNo(10L).setIfPrimaryTerm(20);
try {IndexResponse response = client.index(request, RequestOptions.DEFAULT);
} catch(ElasticsearchException e) {if (e.status() == RestStatus.CONFLICT) {//<1>}
}
<1> 引发异常指示返回版本冲突错误
- 在设置为且已存在具有相同索引和 ID 的文档的情况下,将发生相同的情况:
opTypecreate
IndexRequest request = new IndexRequest("posts").id("1").source("field", "value").opType(DocWriteRequest.OpType.CREATE);
try {IndexResponse response = client.index(request, RequestOptions.DEFAULT);
} catch(ElasticsearchException e) {if (e.status() == RestStatus.CONFLICT) {//<1>}
}
<1>引发异常指示返回版本冲突错误
<br />
<a name="2w2hU"></a>
5.2 获取Api (Get API)
<a name="eV9dO"></a>
5.2.1 案例:
private static void test01(){RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("127.0.0.1",9200)));GetRequest request = new GetRequest("student");// 为特定字段 配置 源包含String[] includs = {"name","id","content"};String[] excluds = {"id"};FetchSourceContext context = new FetchSourceContext(true,includs,excluds);request.id("1").version(2).fetchSourceContext(context);try {GetResponse documentFields = client.get(request, RequestOptions.DEFAULT);if (documentFields.isExists()) {//检索名称System.out.println(documentFields.getIndex());// 获取文档源的 Map 结果System.out.println(documentFields.getSource());// 获取源作为 MapSystem.out.println(documentFields.getSourceAsMap());// 获取源作为 bytesSystem.out.println(documentFields.getSourceAsBytes());}else {System.out.println("不错在该数据");}} catch (IOException e) {e.printStackTrace();}}
<a name="cc0ade06"></a>
5.2.2 获取请求
- 需要以下参数:GetRequest
GetRequest getRequest = new GetRequest(
"posts", //<1>
"1"); //<1>
<1> 索引名称
<2> 文档 ID
<a name="oSdmG"></a>
5.2.3 可选参数
- 可以选择提供以下参数:
request.fetchSourceContext(FetchSourceContext.DO_NOT_FETCH_SOURCE);
禁用源检索,默认情况下启用
String[] includes = new String[]{"message", "*Date"};
String[] excludes = Strings.EMPTY_ARRAY;
FetchSourceContext fetchSourceContext = new FetchSourceContext(true, includes, excludes);
request.fetchSourceContext(fetchSourceContext);
为特定字段 配置 源包含
includes
: 检索结果所包含的字段
excludes
: 检索结果排除的字段
String[] includes = Strings.EMPTY_ARRAY;
String[] excludes = new String[]{"message"};
FetchSourceContext fetchSourceContext =
new FetchSourceContext(true, includes, excludes);
request.fetchSourceContext(fetchSourceContext);
为特定字段配置源排除
request.storedFields("message");
GetResponse getResponse = client.get(request, RequestOptions.DEFAULT);
String message = getResponse.getField("message").getValue();
为特定存储字段配置检索(要求字段单独存储在映射中)
检索存储的字段(要求该字段单独存储在映射中)message
request.routing("routing");
路由值
request.preference("preference");
首选项值
request.realtime(false);
将实时标志设置为(默认情况下)falsetrue
request.refresh(true);
在检索文档之前执行刷新(默认情况下)false
request.version(2);
版本
request.versionType(VersionType.EXTERNAL);
版本类型
<a name="QV9mu"></a>
5.2.4 同步执行
- 以下列方式执行 时,客户端将等待 返回 ,然后再继续执行代码:
GetRequest
GetResponse
GetResponse getResponse = client.get(getRequest, RequestOptions.DEFAULT);
同步调用可能会引发 在高级 REST 客户端中无法解析 REST 响应、请求会发出时间或类似情况下没有从服务器返回的响应的情况下。IOException
在服务器返回 或 错误代码的情况下,高级客户端尝试分析响应正文错误详细信息,然后引发泛型,并将原始代码添加为抑制异常。4xx5xxElasticsearchExceptionResponseException
<a name="H9zB7"></a>
5.2.5 异步执行
- 也可以以异步方式执行 ,以便客户端可以直接返回。用户需要指定如何通过将请求和侦听器传递到异步获取方法来处理响应或潜在故障:
GetRequest
client.getAsync(request, RequestOptions.DEFAULT, listener);
执行完成时要执行和要使用的
GetRequest
ActionListener
异步方法不会阻止并立即返回。完成后,如果执行成功完成,则使用 方法调用 ,如果执行失败,则使用 该方法。失败方案和预期异常与同步执行案例相同。ActionListeneronResponseonFailure
典型的侦听器如下所示:
get
ActionListener<GetResponse> listener = new ActionListener<GetResponse>() {@Overridepublic void onResponse(GetResponse getResponse) {//成功执行时调用}@Overridepublic void onFailure(Exception e) {//当整个失败时调用。GetRequest}
};
<a name="m3CT3"></a>
5.2.6 获取响应
- 返回的允许检索请求的文档及其元数据和最终存储的字段。
GetResponse
String index = getResponse.getIndex();
String id = getResponse.getId();
if (getResponse.isExists()) {long version = getResponse.getVersion();String sourceAsString = getResponse.getSourceAsString(); // <1> Map<String, Object> sourceAsMap = getResponse.getSourceAsMap(); // <2>byte[] sourceAsBytes = getResponse.getSourceAsBytes(); // <3>
} else {// <4>
}
<1> 将文档检索为
String
<2> 将文档检索为Map<String, Object>
<3> 将文档检索为byte[]
<4> 处理找不到文档的方案。请注意,尽管返回的响应具有状态代码,但返回的是有效的,而不是引发异常。此类响应不保存任何源文档,其方法将返回。404 GetResponseisExistsfalse
- 当对不存在的索引执行 get 请求时,响应具有状态代码,即需要按如下方式处理的已引发请求:
404 ElasticsearchException
GetRequest request = new GetRequest("does_not_exist", "1");
try {GetResponse getResponse = client.get(request, RequestOptions.DEFAULT);
} catch (ElasticsearchException e) {if (e.status() == RestStatus.NOT_FOUND) {//<1> 处理引发异常,因为索引不存在}
}
<1> 处理引发异常,因为索引不存在
- 如果请求了特定的文档版本,并且现有文档具有不同的版本号,则引发版本冲突:
try {GetRequest request = new GetRequest("posts", "1").version(2);GetResponse getResponse = client.get(request, RequestOptions.DEFAULT);
} catch (ElasticsearchException exception) {if (exception.status() == RestStatus.CONFLICT) {// <1> }
}
<1> 引发异常指示返回版本冲突错误
<br />
<a name="5sZIL"></a>
6. 结语
其实很多 Api
的使用都是类似相同的,这里我们不再对其他 Api
进行解析,需要了解的完全可以去光网文档查看,文档地址在问上涨上面有。
本文由AnonyStar 发布,可转载但需声明原文出处。
仰慕「优雅编码的艺术」 坚信熟能生巧,努力改变人生
欢迎关注微信公账号 :云栖简码 获取更多优质文章
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务

喜欢的朋友记得点赞、收藏、关注哦!!!
相关文章:
Java操作Elasticsearch 之 [Java High Level REST Clientedit]
<a name"VbjtD"></a> 1. 简述 Elasticsearch 是基于 Lucene 开发的一个分布式全文检索框架,向 Elasticsearch 中存储和从 Elasticsearch 中查询,格式是json。向 Elasticsearch 中存储数据,其实就是向 es 中的 index 下…...
数据集划分与格式转换:从原始数据到模型训练的关键步骤
在计算机视觉项目中,数据集的合理划分和格式转换是实现高效模型训练的基础。本文将详细介绍如何将图片和标注数据按比例切分为训练集和测试集,以及常见的数据格式转换方法,包括 JSON 转 YOLO 格式和 XML 转 TXT 格式。 一、将图片和标注数据…...
MinerU
简介 MinerU 是一款功能全面的文档处理系统,旨在将 PDF 和其他文档格式转换为机器可读的格式,例如 Markdown 和 JSON。该系统专注于在保留文档结构的同时,准确提取文档内容,处理复杂的布局,并转换公式和表格等特殊元素…...
Vue百日学习计划Day46-48天详细计划-Gemini版
Day 46: <KeepAlive> - 组件缓存与优化 (~3 小时) 本日目标: 理解 <KeepAlive> 的作用,学会如何使用它来缓存组件实例,从而优化应用性能和用户体验。所需资源: Vue 3 官方文档 (<KeepAlive>): https://cn.vuejs.org/guide/built-ins/…...
微软的 Windows Linux 子系统现已开源
微软宣布其 Windows Linux 子系统 (WSL) 开源,开放代码供社区成员贡献。自近九年前推出适用于 Windows 10 的 WSL 以来,微软多年来一直致力于开源这项在 Windows 中启用 Linux 环境的功能。 Windows 首席执行官 Pavan Davuluri 表示:“这是开…...
Axure中使用动态面板实现图标拖动交换位置
要在Axure中实现图标拖动交换位置的功能,可以通过动态面板结合交互事件来实现。 实现步骤 准备图标元素 将每个图标转换为动态面板(方便拖动和交互)。 设置拖动交互 选中图标动态面板 → 添加“拖动时”交互 → 选择“移动”当前动态面板&am…...
深入浅出:Spring Cloud Gateway 扩展点实践指南
文章目录 前言一、为什么需要扩展 Spring Cloud Gateway?二、Spring Cloud Gateway 核心扩展点三、扩展点实战:代码与配置详解3.1 全局过滤器(GlobalFilter)3.2 路由过滤器(GatewayFilter)2.3 自定义路由断…...
SCAU18923--二叉树的直径
18923 二叉树的直径 时间限制:1000MS 代码长度限制:10KB 提交次数:0 通过次数:0 题型: 编程题 语言: G;GCC Description 给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点…...
理解 RESTful 风格:现代 Web 服务的基石
在当今的互联网时代,Web 服务成为了连接各种应用和系统的关键。而 RESTful 风格,作为一种广泛采用的架构风格,为设计和实现 Web 服务提供了一套简洁而强大的指导原则。本文将深入探讨 RESTful 风格的核心概念、优势以及如何在实际项目中应用它…...
大模型(3)——RAG(Retrieval-Augmented Generation,检索增强生成)
文章目录 1. 核心组成2. 工作流程3. 训练方式4. 优势与局限5. 应用场景6. 典型模型变体总结 RAG(Retrieval-Augmented Generation,检索增强生成)是一种结合了信息检索与文本生成的技术,旨在通过引入外部知识库提升生成内容的准确性…...
电子科技大学软件工程实践期末
Java基础 面向对象 Java高级编程 2023: 软件工程基础 ch1软件工程概述 软件的概念和特点 软件危机的概念以及产生的原因 软件工程的定义 三要素 应用软件工程的原因 三要素:工具,方法,过程 ch2 软件过程 软件生命周期 软件过程…...
线上jvm假死问题排查
1.线上告警接口超时 看接口是用户服务,查看nacos服务实例,发现有一个节点已经下线了 3.找到对应节点所在服务器,jps -l 命令发现用户服务还在,初步判断是假死 4.使用 jstat -gc 进程id 1000 每秒打印gc情况,发现频繁…...
Redis中SETNX、Lua 脚本和 Redis事务的对比
在 Redis 中,SETNX、Lua 脚本 和 Redis 事务 都可以用于实现原子性操作,但它们的适用场景和能力范围不同。以下是详细对比和原因分析: 1. SETNX 的原子性与局限性 (1) 原子性保证 SETNX(SET if Not eXists) 是 Redis…...
Nginx配置记录访问信息
文章目录 方法一:使用Nginx原生配置记录访问信息方法二:使用Nginx_headers_more模块记录更加详细的信息 Nginx被广泛应用于各种场景如:Web服务器、反向代理服务器、负载均衡器、Web应用防火墙(WAF)等 在实际的产品开发中,无论是功…...
基于机载激光雷达数据的森林生物量估测:AI驱动的遥感革新
一、技术背景与意义 森林生物量是生态系统碳循环和碳汇估算的核心参数。传统遥感方法(如光学影像)在三维结构解析上存在局限,而机载激光雷达(LiDAR)凭借高精度点云数据,能够捕捉森林的垂直结构信息。结合人…...
Redis中的事务和原子性
在 Redis 中,事务 和 原子性 是两个关键概念,用于保证多个操作的一致性和可靠性。以下是 Redisson 和 Spring Data Redis 在处理原子性操作时的区别与对比: 1. Redis 的原子性机制 Redis 本身通过以下方式保证原子性: 单线程模型…...
SSL证书:谷歌算法排名的安全基石与信任杠杆
一、技术演进:从安全信号到算法基石 谷歌对SSL证书的重视始于2014年,当时HTTPS首次被纳入排名算法信号。经过十年迭代,SSL证书已从“加分项”升级为“基础门槛”。2025年算法更新中,其权重占比达2%,与页面加载速度、移…...
XXX企业云桌面系统建设技术方案书——基于超融合架构的安全高效云办公平台设计与实施
目录 1. 项目背景与目标1.1 背景分析1.2 建设目标2. 需求分析2.1 功能需求用户规模与场景终端兼容性2.2 非功能需求3. 系统架构设计3.1 总体架构图流程图说明3.2 技术选型对比3.3 网络设计带宽规划公式4. 详细实施方案4.1 分阶段部署计划4.2 桌面模板配置4.3 测试方案性能测试工…...
【GESP真题解析】第 18 集 GESP 一级 2024 年 12 月编程题 1:温度转换
大家好,我是莫小特。 这篇文章给大家分享 GESP 一级 2024 年 12 月编程题第 1 题:温度转换。 题目链接 洛谷链接:B4062 温度转换 一、完成输入 根据题意,输入只有一行,为实数,数据范围: 0 &l…...
鸿蒙开发进阶:深入解析ArkTS语言特性与高性能编程实践
一、前言 在鸿蒙生态蓬勃发展的当下,开发者对于高效、优质的应用开发语言需求愈发迫切。ArkTS 作为鸿蒙应用开发的核心语言,在继承 TypeScript 优势的基础上,进行了诸多优化与扩展,为开发者带来了全新的编程体验。本文将深入剖析…...
现代计算机图形学Games101入门笔记(十七)
双向路径追踪 外观建模 散射介质 人的头发不能用在动画的毛发上。 动物的髓质Medulla特别大 双层圆柱模型应用 BSSRDF是BRDF的延伸。 天鹅绒用BRDF不合理,转成散射介质。 法线分布 光追很难处理微表面模型 光在微型细节上,光是一个波,会发生衍…...
工单派单应用:5 大核心功能提升协作效率
一、工单管理:全流程一目了然 快速创建:录入任务内容、优先级,从源头明确目标 状态分类:待处理 / 进行中 / 已完成工单一目了然,个人进度随时掌控 灵活分配:公海池抢单机制,成员按能力自主接…...
maven 多个模块之间互相引入加载配置的偶遇问题
因为子项目添加了:<!-- aliyun sms SDK --> <dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-core</artifactId><version>4.6.3</version> </dependency>导致原本运行良好的构建模块,…...
【蓝桥杯嵌入式】【模块】五、ADC相关配置及代码模板
1. 前言 最近在准备16届的蓝桥杯嵌入式赛道的国赛,打算出一个系列的博客,记录STM32G431RBT6这块比赛用板上所有模块可能涉及到的所有考点,如果有错误或者遗漏欢迎各位大佬斧正。 本系列博客会分为以下两大类: 1.1. 单独模块的讲…...
DP2 跳台阶【牛客网】
文章目录 零、原题链接一、题目描述二、测试用例三、解题思路四、参考代码 零、原题链接 DP2 跳台阶 一、题目描述 二、测试用例 三、解题思路 基本思路: 动态规划题目的难点基本在于构造状态转移方程,对应这题,我们可以发现每次跳跃我…...
KC 喝咖啡/书的复制/奶牛晒衣服/ 切绳子
二分的解题思路: 常解决最小值最大化和最大值最小化问题 步骤解析 确定答案范围 设定初始左边界 left 和右边界 right,确保解在此区间内。例如: 求最小最大值时,left 可取单个元素的最大值,right 取所有元素总和。 …...
Jedis快速入门【springboot】
引入依赖 <dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>6.0.0</version> </dependency> 创立jedis对象,建立连接 private Jedis jedis; BeforeEach void setUp(){//1 …...
SpringBoot 商城系统高并发引起的库存超卖库存问题 乐观锁 悲观锁 抢购 商品秒杀 高并发
介绍 在高并发场景下,特别是商品秒杀、抢购等情况下,库存超卖问题是一个常见且棘手的问题。为了解决这个问题,Spring Boot 常使用乐观锁和悲观锁来保证数据的正确性和一致性。 悲观锁 悲观锁假设在多线程或多进程环境中,资源会被…...
[python] 轻量级定时任务调度库schedule使用指北
schedule是一款专为简化定时任务调度而设计的Python库,它通过直观的语法降低了周期性任务的实现门槛。作为进程内调度器,它无需额外守护进程,轻量且无外部依赖,适合快速搭建自动化任务。不过,该库在功能完整性上有所取…...
MySQL:to many connections连接数过多
当你遇到 MySQL: Too many connections 错误时,意味着当前连接数已达到 MySQL 配置的最大限制。这通常是由于并发连接过多或连接未正确关闭导致的。 一、查看当前连接数 查看 MySQL 当前允许的最大连接数 SHOW VARIABLES LIKE max_connections;查看当前使用的最大…...
uthash是一个非常轻量级的库
如大家所知,uthash是一个非常轻量级的库。该库的使用非常简单,无需格外的静态库或动态库,仅需导入目标的头文件即可。 这种配置方式虽然简单,但是使用操作却需要用到大量的宏函数。在使用宏函数时不像使用普通函数一样自由和遍历…...
大模型的开发应用(三):基于LlaMAFactory的LoRA微调(上)
基于LlaMAFactory的LoRA微调(上) 0 前言1 LoRA微调1 LoRA微调的原理1.2 通过peft库为指定模块添加旁支1.3 lora前后结构输出结果对比1.4 使用PyTorch复现 LoRA.Linear1.5 使用peft进行LoRA微调案例 2 LLaMA-Factory2.1 LLaMA-Factory简介2.2 LLaMA-Facto…...
跨域_Cross-origin resource sharing
同源是指"协议域名端口"三者相同,即便两个不同的域名指向同一个ip,也非同源 1.什么是CORS? CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)。它允许浏览器向跨源服务器ÿ…...
奥威BI:打破AI数据分析伪场景,赋能企业真实决策价值
在当今企业数字化转型的浪潮中,AI数据分析产品如雨后春笋般涌现,但许多看似创新的功能设计实则难以落地,沦为“伪需求场景”。这些伪场景不仅浪费企业资源,还可能误导决策,阻碍企业数字化转型进程。在此背景下…...
LLaMA-Factory全解析:大模型微调的开源利器与实战指
技术演进背景与核心价值架构设计与关键技术解析环境搭建与工具链配置全流程微调实战指南企业级应用与高级功能性能优化与安全部署未来发展趋势展望1. 技术演进背景与核心价值 1.1 大模型微调的技术痛点 当前开源大模型(如LLaMA、Qwen、Baichuan等)在通用领域表现优异,但垂…...
python-数据可视化(大数据、数据分析、可视化图像、HTML页面)
通过 Python 读取 XLS 、CSV文件中的数据,对数据进行处理,然后生成包含柱状图、扇形图和折线图的 HTML 报告。这个方案使用了 pandas 处理数据,matplotlib 生成图表,并将图表嵌入到 HTML 页面中。 1.XSL文件生成可视化图像、生成h…...
Jmeter(一) - 环境搭建
1.JMeter 介绍 Apache JMeter是100%纯JAVA桌面应用程序,被设计为用于测试客户端/服务端结构的软件(例如web应用程序)。它可以用来测试静态和动态资源的性能,例如:静态文件,Java Servlet,CGI Scripts,Java Object,数据库和FTP服务器…...
OpenCV CUDA 模块特征检测与描述------在GPU上执行特征描述符匹配的类cv::cuda::DescriptorMatcher
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::cuda::DescriptorMatcher 是 OpenCV 的 CUDA 模块中用于在 GPU 上执行特征描述符匹配的类。它允许你利用 NVIDIA GPU 的并行计算能力来加速特…...
idea如何让文件夹分层显示,而不是圆点分割
网上说是点击小齿轮的都是过时了,对于新版idea不适用,直接上图 1、如图 2、如图 注意也是去掉Compact Middle Packages,只不过新版的方式UI和老版本的不一样了...
5:OpenCV—直方图均衡化
直方图均衡 直方图均衡是一种用于增强和调整图像对比度的图像处理技术。它通过重新分配图像的像素值,使得图像的灰度级在整个范围内均匀分布,从而增强图像的视觉效果。 图像的直方图是像素强度分布的图形表示。它提供了像素值集中位置以及是否存在异常偏…...
内存分页法
现在有个场景,页面需要分页处理,但是后端在查询完数据库后又会进行筛选,就会导致后端的查询数目跟请求的每页条数是不一样。 解决方案:内存分页法 在内存筛选后手动实现分页逻辑,保证返回数量与请求的 pageSize 一致…...
深入解析FramePack:高效视频帧打包技术原理与实践
摘要 本文深入探讨FramePack技术在视频处理领域的核心原理,解析其在不同场景下的应用优势,并通过OpenCV代码示例演示具体实现方法,为开发者提供可落地的技术解决方案。 目录 1. FramePack技术背景 2. 核心工作原理剖析 3. 典型应用场景 …...
【EI会议火热征稿中】第二届云计算与大数据国际学术会议(ICCBD 2025)
# ACM独立出版 | EI检索稳定、往届会后4个半月完成EI检索 # 热门征稿主题:大数据、5G/6G、物联网、云计算 # 早投稿早送审早录用! 重要信息 大会官网:www.iccbd.net 会议主页:【ACM独立出版|EI稳定】第二届云计算与大数据国际…...
对未来软件的看法
有了大模型之后,TypeScript这样增强型javascript语言可能更方便AI来调试。未来的应用会越来越广泛。node.js vue.js会越来越流行。因为方便AI调试,处理错误。 未来,随着 AI 编程工具对 TypeScript 的深度支持(如自动类型推导、错误…...
新兴技术与安全挑战
7.1 云原生安全(K8s安全、Serverless防护) 核心风险与攻击面 Kubernetes配置错误: 风险:默认开放Dashboard未授权访问(如kubectl proxy未鉴权)。防御:启用RBAC,限制ServiceAccount权限。Serverless函数注入: 漏洞代码(AWS Lambda):def lambda_handler(event, cont…...
Prompt Tuning:轻量级大模型微调全攻略
Prompt Tuning(提示调优)步骤金额流程 传统的 Prompt Tuning(提示调优) 是一种轻量级的大模型微调技术,核心是通过优化连续的提示向量(而非模型参数)来适配特定任务。 一、核心步骤概述 准备任务与数据 明确任务类型(如分类、问答等),准备输入文本和目标标签。加载…...
centos7安装mysql8.0
yum install -y mysql-community-server --nogpgcheckcentos7.9安装mysql8.0 在 CentOS 7.9 上安装 MySQL 8.0,你可以通过多种方式实现,但最推荐的方法是使用 MySQL 官方提供的 yum 仓库。这样可以确保安装的 MySQL 版本是最新的,并且易于管理…...
ZooKeeper 原理解析及优劣比较
大家好,这里是架构资源栈!点击上方关注,添加“星标”,一起学习大厂前沿架构! 引言 在分布式系统中,服务注册、配置管理、分布式锁、选举等场景都需要一个高可用、一致性强的协调服务。Apache ZooKeeper 凭…...
OD 算法题 B卷 【需要打开多少监视器】
文章目录 需要打开多少监视器 需要打开多少监视器 某长方形停车场,每个车位上方都有对应监控器,在当前车位和前后左右四个方向任意一个车位范围停车时,监控器才需要打开。给出某一时刻停车场的停车分布,统计最少需要打开多少个监…...
鸿蒙路由参数传递
页面test.ets 代码如下: import router from ohos.router Entry Component struct Test {State message: string Hello WorldState username: string huState password: string 1build() {Row() {Column() {Text(this.message).fontSize(50).fontWeight(FontWe…...