1

前言

最近由于项目要用到全文检索功能,而项目是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();//数据
    }
    

暴力开发
4 声望0 粉丝