前言
最近由于项目要用到全文检索功能,而项目是springboot2,es服务使用的新版本,查看了es官网发发现官方已经在7.15.0放弃对旧版本中的Java REST Client (High Level Rest Client (HLRC))的支持,从而替换为推荐使用的Java API Client 8.x,根据官网推荐使用RestClient工具。
引入依赖
- 由于我的项目使用SpringBoot2.1.x版本,项目会默认引入6.4.3版本的es所以要手动添加依赖的版本号
<properties>
<elasticsearch.version>8.2.3</elasticsearch.version>
<jakartajson.version>2.0.1</jakartajson.version>
<httpclient.version>4.5.13</httpclient.version>
</properties>
<dependencies>
<!--elasticsearch依赖-->
<dependency>
<groupId>co.elastic.clients</groupId>
<artifactId>elasticsearch-java</artifactId>
<version>${elasticsearch.version}</version>
<!--由于版本冲突忽略引入的依赖-->
<exclusions>
<exclusion>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-client</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-client</artifactId>
<version>${elasticsearch.version}</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>${httpclient.version}</version>
</dependency>
<dependency>
<groupId>jakarta.json</groupId>
<artifactId>jakarta.json-api</artifactId>
<version>${jakartajson.version}</version>
</dependency>
</dependencies>
添加配置类
import co.elastic.clients.elasticsearch.ElasticsearchAsyncClient;
import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.json.jackson.JacksonJsonpMapper;
import co.elastic.clients.transport.ElasticsearchTransport;
import co.elastic.clients.transport.rest_client.RestClientTransport;
import org.apache.http.Header;
import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.message.BasicHeader;
import org.elasticsearch.client.RestClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ElasticsearchConfig {
@Value("${elasticsearch.scheme}")
private String scheme;
@Value("${elasticsearch.host}")
private String host;
@Value("${elasticsearch.port}")
private int port;
@Value("${elasticsearch.enable}")
private boolean enable;
@Value("${elasticsearch.username}")
private String username;
@Value("${elasticsearch.password}")
private String password;
//注入IOC容器
@Bean
public ElasticsearchClient elasticsearchClient(){
ElasticsearchClient client = new ElasticsearchClient(null);
if (enable){
final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
if (username != null && !username.isEmpty() && password != null && !password.isEmpty()) {
//设置账号密码
credentialsProvider.setCredentials(
AuthScope.ANY, new UsernamePasswordCredentials(username, password));
}
Header[] defaultHeaders = new Header[]{new BasicHeader("header", "value")};
RestClient restClient = RestClient.builder(new HttpHost(host, port, scheme))
.setHttpClientConfigCallback(httpClientBuilder -> httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider))
.setDefaultHeaders(defaultHeaders)
.build();
ElasticsearchTransport transport = new RestClientTransport(restClient,new JacksonJsonpMapper());
client = new ElasticsearchClient(transport);
}
return client;
}
//注入IOC容器
@Bean
public ElasticsearchAsyncClient elasticsearchAsyncClient(){
ElasticsearchAsyncClient syncClient = new ElasticsearchAsyncClient(null);
if (enable){
final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
if (username != null && !username.isEmpty() && password != null && !password.isEmpty()) {
//设置账号密码
credentialsProvider.setCredentials(
AuthScope.ANY, new UsernamePasswordCredentials(username, password));
}
Header[] defaultHeaders = new Header[]{new BasicHeader("header", "value")};
RestClient restClient = RestClient.builder(new HttpHost(host, port, scheme))
.setHttpClientConfigCallback(httpClientBuilder -> httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider))
.setDefaultHeaders(defaultHeaders)
.build();
ElasticsearchTransport transport = new RestClientTransport(restClient,new JacksonJsonpMapper());
syncClient = new ElasticsearchAsyncClient(transport);
}
return syncClient;
}
}
代码测试
@Autowired
private ElasticsearchClient esClient;
1. 根据索引查询全部
@Test
public void matchDataTest() throws IOException {
TrackHits.Builder trackHitsbuilder = new TrackHits.Builder();//设置是否精确查询
SearchResponse<Map> searchResponse = esClient.search(srBuilder ->
srBuilder
.trackTotalHits(trackHitsbuilder.enabled(true)//默认false 返回总数为10000
.index("esTest")
, Map.class);
HitsMetadata<Map> hitsMetadata = searchResponse.hits();
System.out.println(hitsMetadata.total());//文件返回的总数
List<Hit<Map>> hitList = hitsMetadata.hits();//数据
}
2.分页查询
size 关键字:指定查询结果中返回指定条数。 默认返回值10条。
from 关键字:用来指定起始返回位置默认位置为0,和size关键字连用可实现分页效果。
【分页原理from * size + size】
@Test
public void matchDataTest() throws IOException {
TrackHits.Builder trackHitsbuilder = new TrackHits.Builder();//设置是否精确查询
SearchResponse<Map> searchResponse = esClient.search(srBuilder ->
srBuilder
.trackTotalHits(trackHitsbuilder.enabled(true)//默认false 返回总数为10000
.index("esTest")
.from(0)
.size(20)
, Map.class);
HitsMetadata<Map> hitsMetadata = searchResponse.hits();
System.out.println(hitsMetadata.total());//文件返回的总数
List<Hit<Map>> hitList = hitsMetadata.hits();//数据
}
3.多字段分词查询
@Test
public void matchDataTest() throws IOException {
TrackHits.Builder trackHitsbuilder = new TrackHits.Builder();//设置是否精确查询
SearchResponse<Map> searchResponse = esClient.search(srBuilder ->
srBuilder
.trackTotalHits(trackHitsbuilder.enabled(true)//默认false 返回总数为10000
.index("esTest")
..query(queryBuilder -> queryBuilder
.multiMatch(matchQueryBuilder -> matchQueryBuilder
.fields("name").query("张三")))
.from(0)
.size(20)
, Map.class);
HitsMetadata<Map> hitsMetadata = searchResponse.hits();
System.out.println(hitsMetadata.total());//文件返回的总数
List<Hit<Map>> hitList = hitsMetadata.hits();//数据
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。