SpringBoot RestHighLevelClient 按版本更新
- [1 查询](#1 查询)
- [2 更新](#2 更新)
RestHighLevelClient 是 Elasticsearch 提供的一个用于与 Elasticsearch 集群交互的高级 REST 客户端。它是基于 Java 的客户端,旨在提供一种简单且功能丰富的方式来执行各种 Elasticsearch 操作,包括索引、搜索、更新和删除文档,以及管理索引和集群。
主要特点 | 解释 |
---|---|
高级 API | 提供了一组高级 API,简化了与 Elasticsearch 交互的复杂性。 |
线程安全 | 设计为线程安全,可以在多线程环境中使用。 |
轻松配置 | 可以通过简单的配置连接到 Elasticsearch 集群。 |
支持所有 Elasticsearch 功能 | 几乎支持所有 Elasticsearch 提供的功能,包括文档操作、搜索、聚合、索引管理、集群管理等。 |
同步和异步操作 | 支持同步和异步两种操作方式,满足不同的使用场景。 |
xml
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.13.4</version>
</dependency>
1 查询
java
import lombok.extern.slf4j.Slf4j;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.jeecg.modules.demo.cate.entity.CateRule;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class NewTest {
@Autowired
private ObjectMapper objectMapper;
@Autowired
private RestHighLevelClient client;
@Test
public void test() {
search("student_test", "1", CateRule.class);
}
/**
* 查询
*
* @param index 索引
* @param id ID
* @param cls 类
* @param <T> 类
* @return 类
*/
private <T> T search(String index, String id, Class<T> cls) {
try {
GetRequest get = new GetRequest(index, id);
GetResponse response = client.get(get, RequestOptions.DEFAULT);
if (response.isExists()) {
return objectMapper.readValue(response.getSourceAsString(), cls);
} else {
return null;
}
} catch (Exception e) {
log.error("查询失败!", e);
}
return null;
}
}
2 更新
java
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.elasticsearch.core.document.Document;
import org.springframework.test.context.junit4.SpringRunner;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.rest.RestStatus;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class NewTest {
@Autowired
private RestHighLevelClient client;
@Test
public void test() {
forceUpdate(Document.create(), "student_test", "1");
}
/**
* 按版本更新
*
* @param doc Document
* @param index 索引
* @param id ID
* @return 结果
*/
private boolean forceUpdate(Document doc, String index, String id) {
try {
// 查询
GetRequest get = new GetRequest(index, id);
GetResponse rep1 = client.get(get, RequestOptions.DEFAULT);
if (!rep1.isExists()) {
return false;
}
long seqNo = rep1.getSeqNo();
long primaryTerm = rep1.getPrimaryTerm();
// 更新
UpdateRequest update = new UpdateRequest(index, id)
.doc(doc.toJson(), XContentType.JSON)
.setIfSeqNo(seqNo)
.setIfPrimaryTerm(primaryTerm);
UpdateResponse rep2 = client.update(update, RequestOptions.DEFAULT);
if (rep2.status() == RestStatus.OK) {
return true;
}
} catch (Exception e) {
log.error("更新失败!", e);
}
return false;
}
}