SpringBoot【集成ElasticSearch 01】2种方式的高级客户端 RestHighLevelClient 使用(依赖+配置+客户端API测试源码

1.方式一

1.1 依赖

【不使用 spring-boot-starter-data-elasticsearch 就可以脱离 springboot 版本的限制,可以自行选择ES的版本】我用的是 springboot 2.2.5.RELEASE 版本,ES部署文件为 elasticsearch-6.4.3.tar.gz,这里只贴出主要依赖:

xml 复制代码
<!-- ElasticSearch Server -->
<dependency>
	<groupId>org.elasticsearch</groupId>
	<artifactId>elasticsearch</artifactId>
	<version>6.4.3</version>
</dependency>
<!-- Java High Level REST Client -->
<dependency>
	<groupId>org.elasticsearch.client</groupId>
	<artifactId>elasticsearch-rest-high-level-client</artifactId>
	<version>6.4.3</version>
</dependency>

1.2 配置信息

这里根据elasticsearch服务端的地址进行配置:

java 复制代码
@Configuration
public class ElasticSearchConfig {
    @Bean
    public RestHighLevelClient restHighLevelClient() {
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(
                        new HttpHost("127.0.0.1", 9200, "http")
                ));
        return client;
    }
}

1.3 客户端使用

java 复制代码
@SpringBootTest
class EsApiApplicationTests {

	@Autowired
	@Qualifier(value = "restHighLevelClient")
	private RestHighLevelClient client;

	/*1.创建索引*/
	@Test
	void createIndex() throws IOException {
		// 创建请求
		CreateIndexRequest request = new CreateIndexRequest("yz_index");
		// 执行请求,获取响应
		CreateIndexResponse response = client.indices().create(request, RequestOptions.DEFAULT);
		System.out.println("creatIndex--" + response);
	}

	/*2.获取索引,判断是否存在*/
	@Test
	void getIndex() throws IOException {
		// 创建请求
		GetIndexRequest request = new GetIndexRequest("yz_index");
		// 执行请求,获取响应
		boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);
		System.out.println("getIndex--exists--" + exists);
	}

	/*3.删除索引*/
	@Test
	void deleteIndex() throws IOException {
		// 创建请求
		DeleteIndexRequest request = new DeleteIndexRequest("yz_index");
		// 执行请求
		AcknowledgedResponse response = client.indices().delete(request, RequestOptions.DEFAULT);
		System.out.println("deleteIndex--" + response);
	}

	/*4.添加文档*/
	@Test
	void addDocument() throws IOException {
		// 创建对象
		User user = new User("Java虚拟机", 30);
		// 创建索引,即获取索引
		IndexRequest indexRequest = new IndexRequest("yz_index");
		// 添加规则 /index/_doc/id
		indexRequest.id("1");
		indexRequest.timeout(TimeValue.timeValueSeconds(1));
		// 存入对象
		indexRequest.source(JSON.toJSONString(user), XContentType.JSON);
		// 发送请求
		IndexResponse response = client.index(indexRequest, RequestOptions.DEFAULT);
		System.out.println("addDocument--" + response);
	}

	/*5.获取文档是否存在*/
	@Test
	void getDocument() throws IOException {
		// 创建get请求
		GetRequest getRequest = new GetRequest("yz_index", "1");
		// 不获取返回的_source的上下文
		getRequest.fetchSourceContext(new FetchSourceContext(false));
		getRequest.storedFields("_none_");
		// 发送请求
		boolean exists = client.exists(getRequest, RequestOptions.DEFAULT);
		System.out.println("addDocument--" + exists);

		/*6.获取文档信息*/
		if (exists) {
			// 创建请求
			GetRequest getRequest1 = new GetRequest("yz_index", "1");
			// 发送请求
			GetResponse response = client.get(getRequest1, RequestOptions.DEFAULT);
			System.out.println("source--" + response.getSource());
			System.out.println("getDocument--" + response.getSourceAsString());
		}

		/*7.更新文档信息*/
		if (exists) {
			// 创建请求
			UpdateRequest updateRequest = new UpdateRequest("yz_index", "1");
			updateRequest.timeout("1s");
			// 修改内容
			User user = new User("小米", 10);
			updateRequest.doc(JSON.toJSONString(user), XContentType.JSON);
			UpdateResponse response = client.update(updateRequest, RequestOptions.DEFAULT);
			System.out.println("updateDocument--" + response.status());
		}

		/*8.删除文档信息*/
		if (exists) {
			// 创建请求
			DeleteRequest deleteRequest = new DeleteRequest("yz_index", "1");
			deleteRequest.timeout("1s");
			// 修改内容
			DeleteResponse response = client.delete(deleteRequest, RequestOptions.DEFAULT);
			System.out.println("deleteDocument--" + response.status());
		}
	}

	/*9.批量添加文档*/
	@Test
	void batchAddDocument() throws IOException {
		// 批量请求
		BulkRequest bulkRequest = new BulkRequest();
		bulkRequest.timeout("10s");
		// 创建对象
		ArrayList<User> userArrayList = new ArrayList<>();
		userArrayList.add(new User("小米1", 1));
		userArrayList.add(new User("小米2", 2));
		userArrayList.add(new User("小米3", 3));
		userArrayList.add(new User("小米4", 4));
		userArrayList.add(new User("小米5", 5));
		// 添加请求
		for (int i = 0; i < userArrayList.size(); i++) {
			bulkRequest.add(new IndexRequest("yz_index")
					.id("" + (i + 2))
					.source(JSON.toJSONString(userArrayList.get(i)), XContentType.JSON));
		}
		// 执行请求
		BulkResponse response = client.bulk(bulkRequest, RequestOptions.DEFAULT);
		System.out.println("batchAddDocument--" + response.status());
	}

	/*10.查询*/
	@Test
	void search() throws IOException {
		// 创建请求
		SearchRequest searchRequest = new SearchRequest("jd_index");
		// 构建搜索条件
		SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
		TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("title", "杜伽");// 精确查询
		searchSourceBuilder.query(termQueryBuilder);
		searchSourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
		searchRequest.source(searchSourceBuilder);
		// 执行请求
		SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
		// 解析查询结果
		System.out.println("search--getHists--" + JSON.toJSONString(response.getHits()));
		for (SearchHit documentFields : response.getHits()) {
			System.out.println("search--getHist--" + documentFields.getSourceAsMap());
		}
	}
}

2.方式二

2.1 依赖

我用的是 springboot 2.5.4【所以spring-boot-starter-data-elasticsearch 的版本也是 2.5.4】此时对应的 elasticsearch 服务端和客户端的版本是 7.12.1 那要部署的ES版本也要是 7.12.1:

xml 复制代码
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-elasticsearch -->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>

2.2 配置信息

yaml 复制代码
spring:
  elasticsearch:
    rest:
      uris: localhost:9200

2.3 客户端使用

java 复制代码
@SpringBootTest
class EsStarterApplicationTests {
    
    @Autowired
    private RestHighLevelClient restHighLevelClient;

    @Test
    void contextLoads() {
    // 由于不同版本的API不同【没有参考价值】,这里不再贴出测试代码。
    }
    
}

3.注意事项

不同的 elasticsearch 版本有不同的 API 这就给升级造成了阻碍,为了避免这种情况,我们可以使用elasticsearch的 HTTP 客户端 Jest,下篇文章会详细说明。

4.小小的总结

本文介绍了不使用spring-boot-starter-data-elasticsearch的情况下,如何通过ElasticSearch REST High Level Client与ElasticSearch 6.4.3进行交互。主要内容包括:

    1. 依赖配置,使用elasticsearch和elasticsearch-rest-high-level-client 6.4.3版本;
    1. 创建RestHighLevelClient客户端配置;
    1. 详细演示了索引的创建、查询和删除操作;
    1. 文档的增删改查及批量操作实现;
    1. 最后展示了查询功能的基本使用。 该方案避免了Spring Boot版本限制,可直接控制ES版本。
相关推荐
追逐时光者14 分钟前
精选 2 款 .NET 开源、实用的缓存框架,帮助开发者更轻松地处理系统缓存!
后端·.net
David爱编程1 小时前
指令重排与内存屏障:并发语义的隐形守护者
java·后端
胡gh2 小时前
数组开会:splice说它要动刀,map说它只想看看。
javascript·后端·面试
Pure_Eyes2 小时前
go 常见面试题
开发语言·后端·golang
Cisyam3 小时前
使用Bright Data API轻松构建LinkedIn职位数据采集系统
后端
float_六七3 小时前
Spring Boot 3为何强制要求Java 17?
java·spring boot·后端
bobz9653 小时前
ovs arp
后端
用户21411832636023 小时前
dify案例分享-零基础上手 Dify TTS 插件!从开发到部署免费文本转语音,测试 + 打包教程全有
后端
架构师沉默3 小时前
Java 开发者别忽略 return!这 11 种写法你写对了吗?
java·后端·架构