springboot3.0整合ElasticSearch

内容分享2周前发布
1 0 0

一、maven依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.0.2</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.dw</groupId>
    <artifactId>estest</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>estest</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>17</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!-- elasticsearch引入依赖  start -->
        <dependency>
            <groupId>co.elastic.clients</groupId>
            <artifactId>elasticsearch-java</artifactId>
        </dependency>

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
        </dependency>


    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

二、es配置

yaml配置

elasticsearch:
  # 多个IP逗号隔开
  hosts: 192.168.199.186:9200

java配置类

package com.dw.estest.config;

import co.elastic.clients.elasticsearch.ElasticsearchAsyncClient;
import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.json.jackson.JacksonJsonpMapper;
import co.elastic.clients.transport.rest_client.RestClientTransport;
import lombok.Setter;
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.StringUtils;

/**
 * Author:daWang
 * Date:2023/7/16  11:58
 */

@ConfigurationProperties(prefix = "elasticsearch") //配置的前缀
@Configuration
public class ClientConfig {

    @Setter
    private String hosts;

    /**
     * 解析配置的字符串,转为HttpHost对象数组
     * @return
     */
    private HttpHost[] toHttpHost() {
        if (!StringUtils.hasLength(hosts)) {
            throw new RuntimeException("invalid elasticsearch configuration");
        }
        String[] hostArray = hosts.split(",");
        HttpHost[] httpHosts = new HttpHost[hostArray.length];
        HttpHost httpHost;
        for (int i = 0; i < hostArray.length; i++) {
            String[] strings = hostArray[i].split(":");
            httpHost = new HttpHost(strings[0], Integer.parseInt(strings[1]), "http");
            httpHosts[i] = httpHost;
        }

        return httpHosts;
    }
    
    //rest客户端
    @Bean
    public ElasticsearchClient elasticsearchClient() {
        HttpHost[] httpHosts = toHttpHost();
        RestClient restClient = RestClient.builder(httpHosts).build();
        RestClientTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());
        return new ElasticsearchClient(transport);
    }
    
    //异步客户端
    @Bean
    public ElasticsearchAsyncClient elasticsearchAsyncClient() {
        HttpHost[] httpHosts = toHttpHost();
        RestClient restClient = RestClient.builder(httpHosts).build();
        RestClientTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());
        return new ElasticsearchAsyncClient(transport);
    }
}

三、功能测试

package com.dw.estest;

import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.elasticsearch._types.FieldSort;
import co.elastic.clients.elasticsearch._types.SortOptions;
import co.elastic.clients.elasticsearch._types.SortOrder;
import co.elastic.clients.elasticsearch._types.query_dsl.MatchAllQuery;
import co.elastic.clients.elasticsearch._types.query_dsl.QueryBuilders;
import co.elastic.clients.elasticsearch.core.*;
import co.elastic.clients.elasticsearch.core.bulk.BulkOperation;
import co.elastic.clients.elasticsearch.core.bulk.CreateOperation;
import co.elastic.clients.elasticsearch.core.search.Hit;
import co.elastic.clients.elasticsearch.indices.ElasticsearchIndicesClient;
import com.dw.estest.bean.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

@SpringBootTest
class EstestApplicationTests {

    @Autowired
    ElasticsearchClient elasticsearchClient;

    @Test
    void contextLoads() throws Exception {
        User user = new User();
        user.setAge(30);
        user.setId(3l);
        user.setName("dd");
        user.setDateTime(new Date());
        user.setUpdate(new Date());
        UpdateRequest request = new UpdateRequest.Builder<>().index("test").id(user.getId().toString()).doc(user).build();
        UpdateResponse update = elasticsearchClient.update(request, User.class);
        System.out.println(update);
    }
    //添加或修改文档
        @Test
    void test04() throws Exception {
        User user = new User();
        user.setAge(30);
        user.setId(3l);
        user.setName("sss");
        user.setDateTime(new Date());
        user.setUpdate(new Date());
        // 构建IndexRequest对象
        IndexRequest request = new IndexRequest.Builder<>().index("test")
                .opType(OpType.Index)
                .document(user)
                .build();

        IndexResponse index = elasticsearchClient.index(request);
        System.out.println(index);
    }

    //根据id查询
    @Test
    void test02() throws Exception {
        GetRequest request = new GetRequest.Builder().id("1").index("test").build();
        GetResponse<User> userGetResponse = elasticsearchClient.get(request, User.class);
        User source = userGetResponse.source();
        System.out.println((source));
    }

    //查询,分页,排序
    @Test
    void test03() throws Exception {
        // 创建搜索请求
        SearchRequest request = new SearchRequest.Builder()
                .index(Arrays.asList("test"))
                .query(fn -> {
                    //fn.term(t -> t.field("age").value(20));
                    //fn.match(m -> m.field("name").query("admin"));
                    fn.matchAll(new MatchAllQuery.Builder().build());
                    return fn;
                })
                .sort(Arrays.asList(SortOptions.of(s -> s.field(FieldSort.of(f -> f.field("age").order(SortOrder.Desc))))))
                .from(0)
                .size(10)
                .build();
        SearchResponse<User> search = elasticsearchClient.search(request, User.class);
        List<Hit<User>> hits = search.hits().hits();
        hits.stream().forEach(item -> {
            User source = item.source();
            System.out.println(source);
        });
    }

    //批量添加
    @Test
    void testo1() throws Exception {
        User user = new User();
        user.setAge(20);
        user.setId(2l);
        user.setName("admin");
        List<BulkOperation> list = new ArrayList<>();
        list.add(BulkOperation.of(f -> f.create(CreateOperation.of(c -> c.id("2").document(user)))));
        BulkRequest request = new BulkRequest.Builder().index("test").operations(list).build();
        BulkResponse bulk = elasticsearchClient.bulk(request);
        System.out.println(bulk);
    }


}

© 版权声明

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
none
暂无评论...