SpringBoot操作Elasticsearch
约 653 字大约 2 分钟
2025-02-28
SpringBoot操作Elasticsearch的方式有哪些?
- Spring Data Elasticsearch
- Elasticsearch Java High Level REST Client
Elasticsearch Java API Client
Elasticsearch Java API Client是官方推荐的Java客户端,它提供了丰富的API,可以方便地操作Elasticsearch。
连接到Elasticsearch
<project>
<dependencies>
<dependency>
<groupId>co.elastic.clients</groupId>
<artifactId>elasticsearch-java</artifactId>
<version>8.17.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.17.0</version>
</dependency>
</dependencies>
</project>
你可以使用API密钥和Elasticsearch端点来连接到Elastic 。
RestClient这个类主要是用作于与服务端IP以及端口的配置,在其的builder()方法可以设置登陆权限的账号密码、连接时长等等。总而言之就是服务端配置。
RestClientTransport 这是Jackson映射器创建传输。建立客户端与服务端之间的连接传输数据。这是在创建ElasticsearchClient需要的参数,而创建RestClientTransport就需要上面创建的RestClient。
ElasticsearchClient 这个就是Elasticsearch的客户端。调用Elasticsearch语法所用到的类,其就需要传入上面介绍的RestClientTransport。
package com.syh.es.config;
import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.json.JsonpMapper;
import co.elastic.clients.json.jackson.JacksonJsonpMapper;
import co.elastic.clients.transport.ElasticsearchTransport;
import co.elastic.clients.transport.rest_client.RestClientTransport;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Lazy;
import java.io.IOException;
/**
* @author shan
* @create 2024/10/16 9:47
*/
@Configuration
public class ElasticSearchConfig {
@Bean
public ElasticsearchClient client(){
RestClient restClient = RestClient.builder(
new HttpHost("192.168.229.133", 9200)).build();
ElasticsearchTransport transport = new RestClientTransport(
restClient, new JacksonJsonpMapper());
ElasticsearchClient client = new ElasticsearchClient(transport);
return client;
}
}
或者使用直接封装好的pom依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
然后在application.properties中配置Elasticsearch的连接信息:
spring:
elasticsearch:
uris: http://192.168.229.161:9200 # ES服务器地址
索引和映射、文档操作
- 建议采用 ElasticsearchTemplate 类来操作索引和文档,它提供了丰富的索引、查询、更新、删除等方法。
高级查询
- 查询所有
@Test
public void test01() throws IOException {
SearchResponse<HotelDoc> search = esClient.search(
req -> req.index("hotel")
, HotelDoc.class);
log.info("search:{}", search.hits().total().value());
List<Hit<HotelDoc>> hits = search.hits().hits();
for (Hit<HotelDoc> hit : hits) {
System.out.println(hit.source());
}
}
如果报错:
在文档实体类上添加注解:
@Data
@NoArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true) // 忽略未知属性
@Document(indexName = "hotel") //写在类上,表示该类是一个文档对象,indexName指定索引名称
public class HotelDoc {}
- 其他查询
@Test
public void test02() throws IOException {
SearchResponse<HotelDoc> search = esClient.search(
req -> req.index("hotel")
.query(q -> q.match(m -> m.field("name").query("北京"))),
HotelDoc.class
);
List<Hit<HotelDoc>> hits = search.hits().hits();
for (Hit<HotelDoc> hit : hits) {
System.out.println(hit.source());
}
}
或者
@Test
public void test02() throws IOException {
Query q = Query.of(m -> m.match( match -> match.field("name").query("北京")));
SearchResponse<HotelDoc> search = esClient.search(
req -> req.index("hotel")
.query(q),
HotelDoc.class
);
List<Hit<HotelDoc>> hits = search.hits().hits();
for (Hit<HotelDoc> hit : hits) {
System.out.println(hit.source());
}
}
图示:
Spring Data Elasticsearch
Spring Data Elasticsearch是Spring官方提供的Elasticsearch的ORM框架,它可以自动配置Elasticsearch Java API Client,并提供丰富的查询方法。