谷粒商城实战笔记-125-全文检索-ElasticSearch-整合-SpringBoot整合high-level-client

文章目录

一,技术选型

在Java项目中整合Elasticsearch (ES) 的过程中,通常会面临多种客户端的选择。

1. 通过 TCP 连接(9300 端口)

  • Transport API (spring-data-elasticsearch:transport-api.jar) :
    • 与 Spring Boot 版本有关,不同版本的 Spring Boot 需要不同的 Transport API 版本来适配不同的 Elasticsearch 版本。
    • 在 Elasticsearch 7.x 版本开始,官方已经不建议使用 Transport API,并且在 Elasticsearch 8.x 及以上版本中已被废弃。

2. 通过 HTTP 连接(9200 端口)

  • JestClient :
    • 非官方客户端,更新速度较慢,可能会出现与最新版本的 Elasticsearch 兼容性问题。
  • RestTemplate :
    • 使用标准的 HTTP 客户端来发送请求,适用于对 HTTP 协议有深入了解的开发者。

    • 需要手动封装 ES 的各种操作,增加了开发的工作量和复杂度。

    • RestTemplate 需要手动构建 JSON 格式的请求体。

      java 复制代码
      public class ElasticsearchExample {
      
          public static void main(String[] args) {
              RestTemplate restTemplate = new RestTemplate();
              String indexName = "example_index";
              String query = "{\"query\": {\"match_all\": {}}}";
      
              HttpHeaders headers = new HttpHeaders();
              headers.setContentType(org.springframework.http.MediaType.APPLICATION_JSON);
              HttpEntity<String> entity = new HttpEntity<>(query, headers);
      
              ResponseEntity<String> response = restTemplate.exchange(
                      "http://localhost:9200/" + indexName + "/_search",
                      HttpMethod.POST,
                      entity,
                      String.class
              );
      
              System.out.println(response.getBody());
          }
      }

3.最终选择

基于上述分析,推荐使用 Elasticsearch-Rest-High-Level-Client 作为 Java 应用程序与 Elasticsearch 交互的客户端。这是因为它不仅是由 Elasticsearch 官方维护和支持的,而且提供了良好的 API 封装,使得开发者能够更加专注于业务逻辑而不是底层细节。

二,SpringBoot整合Elasticsearch-Rest-High-Level-Client

对于这个模块,做一下基本配置。

  • 配置注册中心地址
  • 配置启动类服务发现注解

1,添加依赖

在search模块的pom文件中添加相应的依赖。

配置如下:

xml 复制代码
<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>7.13.0</version>
</dependency>

2,创建客户端

创建一个 RestHighLevelClient 实例,指定连接信息(如主机名、端口等),通过配置类将其注入到Spring容器中。

dart 复制代码
@Configuration
public class GulimallElasticSearchConfig {
    @Bean
    public RestHighLevelClient esRestClient(){
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(new HttpHost("192.168.56.10", 9200, "http")));
        return  client;
    }

}

3,单元测试

通过如下单元测试,测试客户端实例能否正常注入到容器,如果能,说明整合成功。

dart 复制代码
@SpringBootTest
@RunWith(SpringRunner.class)
class GulimallSearchApplicationTests {
    @Autowired
    private RestHighLevelClient restHighLevelClient;

    @Test
    public void contextLoads() {
    }

    @Test
    public void restHighLevelClient() {
        System.out.println(restHighLevelClient);
    }

}

如下,单元测试通过,说明整合Elasticsearch客户成功。

整合问题记录

运行单元测试报错,如下。

dart 复制代码
19:51:11.026 ERROR [           main]                SpringApplication - Application startup failed
java.lang.ClassNotFoundException: org.elasticsearch.common.CheckedConsumer
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) [1 skipped]
    at com.glassdoor.applicantManagement.aws.AwsAmsElasticsearchClientConfig.getElastics

原因是缺少Elasticsearch的依赖包,把下面两个全部加上。

dart 复制代码
 <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>7.13.3</version>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>7.13.3</version>
        </dependency>
相关推荐
贺一航【Niki】6 小时前
【学习笔记】杂乱知识
笔记·学习
つ安静与叛逆的小籹人7 小时前
小红书API:通过笔记ID获取笔记详情数据教程
笔记·python
ClutchoQ9 小时前
【你指的API是哪个API?软件工程师跨服聊天实录】
笔记·其他
逸Y 仙X11 小时前
文章二十七:ElasticSearch ES查询模板(Search Template)高效复用实战
java·大数据·数据库·elasticsearch·搜索引擎·全文检索
二哈赛车手11 小时前
新人笔记---Spring AI的Advisor以及其底层机制讲解(涉及源码),包含一些遇见的Spring AI的Advisor缺陷问题的解决方案
java·人工智能·spring boot·笔记·spring
AC赳赳老秦11 小时前
接口测试自动化:用 OpenClaw 对接 Postman,实现批量回归测试、测试报告自动生成与推送
java·人工智能·python·算法·elasticsearch·deepseek·openclaw
Tutankaaa12 小时前
知识竞赛软件SaaS版 vs 本地部署
人工智能·经验分享·笔记·学习
许长安13 小时前
RPC 异步调用基本使用方法:基于官方helloworld-async 示例
c++·经验分享·笔记·rpc
逸Y 仙X14 小时前
文章二十六:ElasticSearch 异步查询执行重度任务
java·大数据·linux·运维·elasticsearch·搜索引擎·全文检索
sheeta199814 小时前
苍穹外卖Day12笔记
笔记