首页 > 其他分享 >Spring Boot 集成 Easysearch 完整指南

Spring Boot 集成 Easysearch 完整指南

时间:2025-01-05 23:11:07浏览次数:1  
标签:Product Easysearch Spring Boot private elasticsearch spring public

Easysearch 的很多用户都有这样的需要,之前是用的 ES,现在要迁移到 Easysearch,但是业务方使用的是 Spring Boot 集成的客户端,问是否能平滑迁移。

Easysearch 是完全兼容 Spring Boot 的,完全不用修改,本指南将探讨如何将 Spring Boot 和 ES 的 high-level 客户端 与 Easysearch 进行集成,涵盖从基础设置到实现 CRUD 操作和测试的所有内容。

服务器设置

首先,需要修改 Easysearch 节点的 easysearch.yml 文件,打开并配置这 2 个配置项:

elasticsearch.api_compatibility: true

#根据客户端版本配置版本号,我这里配置成 7.17.18
elasticsearch.api_compatibility_version: "7.17.18"

项目设置

然后,让我们设置 Maven 依赖。以下是 pom.xml 中的基本配置:

<properties>
    <java.version>11</java.version>
    <spring-data-elasticsearch.version>4.4.18</spring-data-elasticsearch.version>
    <elasticsearch.version>7.17.18</elasticsearch.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-elasticsearch</artifactId>
        <version>${spring-data-elasticsearch.version}</version>
    </dependency>
    <dependency>
        <groupId>org.elasticsearch</groupId>
        <artifactId>elasticsearch</artifactId>
        <version>${elasticsearch.version}</version>
    </dependency>
    <dependency>
        <groupId>org.elasticsearch.client</groupId>
        <artifactId>elasticsearch-rest-high-level-client</artifactId>
        <version>${elasticsearch.version}</version>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
</dependencies>

客户端连接配置

完全和连接 Elasticsearch 的方式一样,不用修改:

配置 src/main/resources/application.yml 文件

spring:
  elasticsearch:
    rest:
      uris: https://localhost:9202
      username: admin
      password: xxxxxxxxxxx
    ssl:
      verification-mode: none

连接配置类

@Configuration
public class ElasticsearchConfig extends AbstractElasticsearchConfiguration {
    @Value("${spring.elasticsearch.rest.uris}")
    private String elasticsearchUrl;

    @Value("${spring.elasticsearch.rest.username}")
    private String username;

    @Value("${spring.elasticsearch.rest.password}")
    private String password;

    @Override
    @Bean
    public RestHighLevelClient elasticsearchClient() {
        final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
        credentialsProvider.setCredentials(AuthScope.ANY,
                new UsernamePasswordCredentials(username, password));

        SSLContext sslContext = SSLContexts.custom()
                .loadTrustMaterial(null, (x509Certificates, s) -> true)
                .build();

        RestClientBuilder builder = RestClient.builder(HttpHost.create(elasticsearchUrl))
                .setHttpClientConfigCallback(httpClientBuilder -> httpClientBuilder
                        .setDefaultCredentialsProvider(credentialsProvider)
                        .setSSLContext(sslContext)
                        .setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE));

        return new RestHighLevelClient(builder);
    }
}

领域模型

使用 Spring 的 Elasticsearch 注解定义领域模型:

@Data
@Document(indexName = "products")
public class Product {
    @Id
    private String id;

    @Field(type = FieldType.Text, name = "name")
    private String name;

    @Field(type = FieldType.Double, name = "price")
    private Double price;
}

仓库层

创建继承 ElasticsearchRepository 的仓库接口:

@Repository
@EnableElasticsearchRepositories
public interface ProductRepository extends ElasticsearchRepository<Product, String> {
}

服务层

实现服务层来处理业务逻辑:

@Service
public class ProductService {
    private final ProductRepository productRepository;

    @Autowired
    public ProductService(ProductRepository productRepository) {
        this.productRepository = productRepository;
    }

    public Product saveProduct(Product product) {
        return productRepository.save(product);
    }

    public Product findProductById(String id) {
        return productRepository.findById(id).orElse(null);
    }
}

测试

编写集成测试类:

@SpringBootTest
public class ProductServiceIntegrationTest {
    @Autowired
    private ElasticsearchOperations elasticsearchOperations;

    @Autowired
    private ProductService productService;

    private static final String INDEX_NAME = "products";

    @BeforeEach
    public void setUp() {
        IndexOperations indexOperations = elasticsearchOperations.indexOps(IndexCoordinates.of(INDEX_NAME));
        if (indexOperations.exists()) {
            indexOperations.delete();
        }

        // 定义 mapping
        Document mapping = Document.create()
                .append("properties", Document.create()
                        .append("name", Document.create()
                                .append("type", "text")
                                .append("analyzer", "standard"))
                        .append("price", Document.create()
                                .append("type", "double")));

        // 创建索引并应用 mapping
        indexOperations.create(Collections.EMPTY_MAP, mapping);
    }

    @Test
    public void testSaveAndFindProduct() {
         List<Product> products = Arrays.asList(
                new Product("Test Product 1", 99.99),
                new Product("Test Product 2", 199.99),
                new Product("Test Product 3", 299.99)
        );

        List<IndexQuery> queries = products.stream()
            .map(product -> new IndexQueryBuilder()
                .withObject(product)
                .withIndex(INDEX_NAME)
                .build())
            .collect(Collectors.toList());

        List<IndexedObjectInformation> indexedInfos = elasticsearchOperations.bulkIndex(
            queries,
            IndexCoordinates.of(INDEX_NAME)
        );

        // 验证结果
        List<String> ids = indexedInfos.stream()
            .map(IndexedObjectInformation::getId)
            .collect(Collectors.toList());

        assertFalse(ids.isEmpty());
        assertEquals(products.size(), ids.size());
    }
}

结论

本指南展示了 Easysearch 与 Elasticsearch 的高度兼容性:

  1. 配置方式相同,仅需启用 Easysearch 的 API 兼容模式。
  2. 可直接使用现有 Elasticsearch 客户端。
  3. Maven 依赖无需更改。
  4. API、注解和仓库接口完全兼容。
  5. 现有测试代码可直接应用。

这种兼容性使得从 Elasticsearch 迁移到 Easysearch 成为一个简单、低风险的过程。Spring Boot 项目可以几乎无缝地切换到 Easysearch,同时获得其性能和资源利用方面的优势。

关于 Easysearch

INFINI Easysearch 是一个分布式的搜索型数据库,实现非结构化数据检索、全文检索、向量检索、地理位置信息查询、组合索引查询、多语种支持、聚合分析等。Easysearch 可以完美替代 Elasticsearch,同时添加和完善多项企业级功能。Easysearch 助您拥有简洁、高效、易用的搜索体验。

官网文档:https://infinilabs.cn/docs/latest/easysearch

作者:张磊,极限科技(INFINI Labs)搜索引擎研发负责人,对 Elasticsearch 和 Lucene 源码比较熟悉,目前主要负责公司的 Easysearch 产品的研发以及客户服务工作。
原文:https://infinilabs.cn/blog/2024/use-spring-boot-for-easysearch-connection/

标签:Product,Easysearch,Spring,Boot,private,elasticsearch,spring,public
From: https://www.cnblogs.com/infinilabs/p/18654129

相关文章

  • 基于java的SpringBoot/SSM+Vue+uniapp的德云社票务系统的详细设计和实现(源码+lw+部署
    文章目录前言详细视频演示具体实现截图技术栈后端框架SpringBoot前端框架Vue持久层框架MyBaitsPlus系统测试系统测试目的系统功能测试系统测试结论为什么选择我代码参考数据库参考源码获取前言......
  • Bootkitty:Linux uefi bootkit 分析
    目录Bootkitty:Linuxuefibootkit分析文件信息0、ModuleEntryPoint入口函数1、hookdo_start_imagehook_grub_1_mods__do_start_image_18000EFB0do_start_image(目标函数)hook_grub_f1__do_start_image_18000DE20(do_start_image的hook函数)hook_and_patch_kernel_18000F5C0(安......
  • SpringBoot进阶教程(八十四)spring-retry
    在日常的一些场景中,很多需要进行重试的操作.而spring-retry是spring提供的一个基于spring的重试框架,某些场景需要对一些异常情况下的方法进行重试就会用到spring-retry。spring-retry可以帮助我们以标准方式处理任何特定操作的重试。在spring-retry中,所有配置都是基于简单注释......
  • Spring Boot注解大揭秘:掌握Spring Boot精髓
    首先,想象一下你正在搭建一个超级英雄团队,每个注解就像是团队里不同的角色,他们都有各自的任务。1.@SpringBootApplication:这是团队的队长,也就是“启动者”。当你把这个注解放在一个类上时,它就像是告诉SpringBoot:“嘿,从这里开始,准备启动我的超级英雄团队啦!”然后,它会去找到团......
  • 为了解决服务启动慢的问题,我为什么要给Apollo和Spring提交PR?
    最近在整理之前记录的工作笔记时,看到之前给团队内一组服务优化启动耗时记录的笔记,简单整理了一下分享出来。问题原因并不复杂,主要是如何精准测量和分析,优化后如何定量测量优化效果,说人话就是用实际数据证明优化效果。背景团队内有一组服务启动明显较其它服务要慢(线上启动超过2分......
  • 快速构建企业级Java应用的利器——SpringBoot脚手架
     GitHub: 项目地址_GitHub(推荐github访问)Gitee: 项目地址_国内访问你是否在开发企业级Java应用时,被繁琐的配置和集成所困扰?是否希望有一个功能齐全、开箱即用的框架来加速你的项目开发?一款集成了主流技术组件的企业级SpringBoot脚手架项目。这个项目已经在GitHub和Gitee上......
  • springboot儿童疫苗预约系统-计算机毕业设计源码58516
    摘  要随着人们对健康的重视和疫苗接种意识的提高,疫苗预约系统成为一种重要的健康管理工具。本研究旨在基于SpringBoot框架开发儿童疫苗预约系统,包括首页、网站公告、疫苗资讯和儿童疫苗预约模块,旨在为家长和监护人提供方便快捷的儿童疫苗预约服务,促进儿童健康管理和疫......
  • springboot一德餐厅点餐系统-毕业设计源码83801
    摘 要本文介绍了基于SpringBoot框架开发的一德餐厅点餐系统的设计与实现。随着餐饮行业的数字化转型,点餐系统的重要性日益凸显。该系统旨在提供顾客便捷的点餐体验,包括菜单浏览、下单支付等功能,提升餐厅服务效率和顾客满意度。通过充分利用SpringBoot框架的优势,点餐系......
  • springboot闲置物品交易系统-计算机毕业设计源码01364
    摘 要本项目是一个基于SpringBoot的闲置物品交易系统。该平台旨在为大学生提供一个便捷、高效的交易平台,使他们能够在校园内买卖闲置物品。通过该平台,学生们可以方便地找到自己需要的物品,同时也可以将自己不再使用的物品转让给其他有需求的同学。这样的"买卖同体"理念促......
  • SpringBooot3.4.x,Mybatis-Plus3.5.x报错:Invalid value type for attribute 'factoryBe
    SpringBooot3.4.x,Mybatis-Plus3.5.x报错:Invalidvaluetypeforattribute'factoryBeanObjectType':java.lang.String解决方案原因mybatis-plus-boot-starter中mybatis-spring版本与SpringBooot3不兼容方式1将mybatis-plus-boot-starter替换为mybatis-plus-spring-boot3-sta......