SpringBoot整合Jest和Elasticsearch实践

简介: SpringBoot整合Jest和Elasticsearch实践

如下所示文档举例说明了如何使用ElasticsearchOperations(默认实现是ElasticsearchTemplate ):


【1】Spring Data Elasticsearch

① 添加Elasticsearch-starter

pom文件添加starter如下:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>

SpringBoot默认支持两种技术和Elasticsearch进行交互:Spring Data ElasticsearchJest

Jest默认不生效,需要导入io.searchbox.client.JestClient


maven依赖如下:

<!--导入jest依赖-->
<dependency>
  <groupId>io.searchbox</groupId>
  <artifactId>jest</artifactId>
  <version>5.3.3</version>
</dependency>

② ElasticsearchAutoConfiguration中注册了client,属性有clusterNodes和clusterName。



③ ElasticsearchDataAutoConfiguration注册了ElasticsearchTemplate来操作ES

@Configuration
@ConditionalOnClass({ Client.class, ElasticsearchTemplate.class })
@AutoConfigureAfter(ElasticsearchAutoConfiguration.class)
public class ElasticsearchDataAutoConfiguration {
  @Bean
  @ConditionalOnMissingBean
  @ConditionalOnBean(Client.class)
  public ElasticsearchTemplate elasticsearchTemplate(Client client,
      ElasticsearchConverter converter) {
    try {
      return new ElasticsearchTemplate(client, converter);
    }
    catch (Exception ex) {
      throw new IllegalStateException(ex);
    }
  }
  @Bean
  @ConditionalOnMissingBean
  public ElasticsearchConverter elasticsearchConverter(
      SimpleElasticsearchMappingContext mappingContext) {
    return new MappingElasticsearchConverter(mappingContext);
  }
  @Bean
  @ConditionalOnMissingBean
  public SimpleElasticsearchMappingContext mappingContext() {
    return new SimpleElasticsearchMappingContext();
  }
}

④ ElasticsearchRepositoriesAutoConfiguration 启用了ElasticsearchRepository

@Configuration
@ConditionalOnClass({ Client.class, ElasticsearchRepository.class })
@ConditionalOnProperty(prefix = "spring.data.elasticsearch.repositories", name = "enabled", havingValue = "true", matchIfMissing = true)
@ConditionalOnMissingBean(ElasticsearchRepositoryFactoryBean.class)
@Import(ElasticsearchRepositoriesRegistrar.class)
public class ElasticsearchRepositoriesAutoConfiguration {
}

ElasticsearchRepository接口源码

@NoRepositoryBean
public interface ElasticsearchRepository<T, ID extends Serializable> extends ElasticsearchCrudRepository<T, ID> {
    <S extends T> S index(S var1);
    Iterable<T> search(QueryBuilder var1);
    Page<T> search(QueryBuilder var1, Pageable var2);
    Page<T> search(SearchQuery var1);
    Page<T> searchSimilar(T var1, String[] var2, Pageable var3);
    void refresh();
    Class<T> getEntityClass();
}

【2】JestClient操作测试

① application.properties配置

# jest url配置
spring.elasticsearch.jest.uris=http://192.168.2.110:9200

测试类

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringBootJestTest {
    @Autowired
    JestClient jestClient;
    @Test
    public void index(){
        Article article = new Article();
        article.setId(1);
        article.setAuthor("Tom");
        article.setContent("hello world !");
        article.setTitle("今日消息");
        //构建一个索引功能,类型为news
        Index index = new Index.Builder(article).index("jest").type("news").build();
        try {
            jestClient.execute(index);
            System.out.println("数据索引成功!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    @Test
    public void search(){
        //查询表达式
        String json = "{\n" +
                "    \"query\" : {\n" +
                "        \"match\" : {\n" +
                "            \"content\" : \"hello\"\n" +
                "        }\n" +
                "    }\n" +
                "}";
        //构建搜索功能
        Search search = new Search.Builder(json).addIndex("jest").addType("news").build();
        try {
            SearchResult result = jestClient.execute(search);
            System.out.println(result.getJsonString());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

③ 测试存储数据结果



④ 测试查询数据结果


【3】 Elasticsearch版本调整

① application.properties进行配置

# Spring data elasticsearch配置
spring.data.elasticsearch.cluster-name=elasticsearch
spring.data.elasticsearch.cluster-nodes=192.168.2.110:9300

这里节点名取自如下图:


启动主程序,可能报错如下(ES版本不合适):



查看Spring Data官网,其中spring data elasticsearch与elasticsearch适配表如下:

我们在上篇博文中安装的ES版本为5.6.10,项目中SpringBoot版本为1.5.12,spring-boot-starter-data-elasticsearch为2.1.11,elasticsearch版本为2.4.6。

两种解决办法:① 升级SpringBoot版本;② 安装2.4.6版本的elasticsearch。

这里修改暴露的端口,重新使用docker安装2.4.6版本:

# 拉取2.4.6 镜像
docker pull registry.docker-cn.com/library/elasticsearch:2.4.6
# 启动容器
docker run -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -d -p 9201:9200 -p 9301:9300 --name ES02 bc337c8e4f

application.properties配置文件同步修改:

# jest url配置
spring.elasticsearch.jest.uris=http://192.168.2.110:9201
# Spring data elasticsearch配置
spring.data.elasticsearch.cluster-name=elasticsearch
spring.data.elasticsearch.cluster-nodes=192.168.2.110:9301

此时再次启动程序:

【4】ElasticsearchRepository使用

我们这里以BookRepository 为例说明。

① BookRepository

类似于JPA,编写自定义Repository接口,继承自ElasticsearchRepository:

public interface BookRepository extends ElasticsearchRepository<Book,Integer> {
    public List<Book> findByBookNameLike(String bookName);
}

这里第一个参数为对象类型,第二个参数为对象的主键类型。

BookRepository 所拥有的方法如下图:


② Book实体

// 这里注意注解
@Document(indexName = "elastic",type = "book")
public class Book {
    private Integer id;
    private String bookName;
    private String author;
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getBookName() {
        return bookName;
    }
    public void setBookName(String bookName) {
        this.bookName = bookName;
    }
    public String getAuthor() {
        return author;
    }
    public void setAuthor(String author) {
        this.author = author;
    }
    @Override
    public String toString() {
        return "Book{" +
                "id=" + id +
                ", bookName='" + bookName + '\'' +
                ", author='" + author + '\'' +
                '}';
    }
}

③ 测试保存

@Autowired
BookRepository bookRepository;
@Test
public void testRepository(){
    Book book = new Book();
    book.setAuthor("吴承恩");
    book.setBookName("西游记");
    book.setId(1);
    bookRepository.index(book);
    System.out.println("BookRepository 存入数据成功!");
}

测试结果


④ 测试查询

@Test
public void testRepository2(){
    for (Book book : bookRepository.findByBookNameLike("游")) {
        System.out.println("获取的book : "+book);
    } ;
    Book book = bookRepository.findOne(1);
    System.out.println("根据id查询 : "+book);
}

测试结果



⑤ Elasticsearch支持方法关键字图示

即,在BookRepository中使用上述关键字构造方法,即可使用,Elastic自行实现其功能!



⑥ 支持@Query注解

如下所示,直接在方法上使用注解:

public interface BookRepository extends ElasticsearchRepository<Book, String> {
    @Query("{"bool" : {"must" : {"field" : {"name" : "?0"}}}}")
    Page<Book> findByName(String name,Pageable pageable);
}

【5】ElasticsearchTemplate使用

封装的就是High Level REST Client,这是基于HTTP协议的客户端,是ES官方推荐使用的。但是要求对ES的DSL语句熟悉,方便自己做复杂的增删改查。

① 存入数据

@Autowired
ElasticsearchTemplate elasticsearchTemplate;
@Test
public void testTemplate01(){
   Book book = new Book();
   book.setAuthor("曹雪芹");
   book.setBookName("红楼梦");
   book.setId(2);
   IndexQuery indexQuery = new IndexQueryBuilder().withId(String.valueOf(book.getId())).withObject(book).build();
   elasticsearchTemplate.index(indexQuery);
}

测试结果如下:



② 查询数据

@Test
public void testTemplate02(){
    QueryStringQueryBuilder stringQueryBuilder = new QueryStringQueryBuilder("楼");
    stringQueryBuilder.field("bookName");
    SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(stringQueryBuilder).build();
    Page<Book> books = elasticsearchTemplate.queryForPage(searchQuery,Book.class);
    Iterator<Book> iterator = books.iterator();
    while(iterator.hasNext()){
        Book book = iterator.next();
        System.out.println("该次获取的book:"+book);
    }
}

测试结果如下:




相关实践学习
以电商场景为例搭建AI语义搜索应用
本实验旨在通过阿里云Elasticsearch结合阿里云搜索开发工作台AI模型服务,构建一个高效、精准的语义搜索系统,模拟电商场景,深入理解AI搜索技术原理并掌握其实现过程。
ElasticSearch 最新快速入门教程
本课程由千锋教育提供。全文搜索的需求非常大。而开源的解决办法Elasricsearch(Elastic)就是一个非常好的工具。目前是全文搜索引擎的首选。本系列教程由浅入深讲解了在CentOS7系统下如何搭建ElasticSearch,如何使用Kibana实现各种方式的搜索并详细分析了搜索的原理,最后讲解了在Java应用中如何集成ElasticSearch并实现搜索。 &nbsp;
目录
相关文章
存储 JSON Java
775 0
|
11月前
|
JSON 前端开发 Java
深入理解 Spring Boot 中日期时间格式化:@DateTimeFormat 与 @JsonFormat 完整实践
在 Spring Boot 开发中,日期时间格式化是前后端交互的常见痛点。本文详细解析了 **@DateTimeFormat** 和 **@JsonFormat** 两个注解的用法,分别用于将前端传入的字符串解析为 Java 时间对象,以及将时间对象序列化为指定格式返回给前端。通过完整示例代码,展示了从数据接收、业务处理到结果返回的全流程,并总结了解决时区问题和全局配置的最佳实践,助你高效处理日期时间需求。
1748 0
|
11月前
|
存储 Java 数据库
Spring Boot 注册登录系统:问题总结与优化实践
在Spring Boot开发中,注册登录模块常面临数据库设计、密码加密、权限配置及用户体验等问题。本文以便利店销售系统为例,详细解析四大类问题:数据库字段约束(如默认值缺失)、密码加密(明文存储风险)、Spring Security配置(路径权限不当)以及表单交互(数据丢失与提示不足)。通过优化数据库结构、引入BCrypt加密、完善安全配置和改进用户交互,提供了一套全面的解决方案,助力开发者构建更 robust 的系统。
382 0
|
11月前
|
JSON 前端开发 Java
深入理解 Spring Boot 中日期时间格式化:@DateTimeFormat 与 @JsonFormat 完整实践
在 Spring Boot 开发中,处理前后端日期交互是一个常见问题。本文通过 **@DateTimeFormat** 和 **@JsonFormat** 两个注解,详细讲解了如何解析前端传来的日期字符串以及以指定格式返回日期数据。文章从实际案例出发,结合代码演示两者的使用场景与注意事项,解决解析失败、时区偏差等问题,并提供全局配置与局部注解的实践经验。帮助开发者高效应对日期时间格式化需求,提升开发效率。
3343 2
|
前端开发 Java Nacos
🛡️Spring Boot 3 整合 Spring Cloud Gateway 工程实践
本文介绍了如何使用Spring Cloud Alibaba 2023.0.0.0技术栈构建微服务网关,以应对微服务架构中流量治理与安全管控的复杂性。通过一个包含鉴权服务、文件服务和主服务的项目,详细讲解了网关的整合与功能开发。首先,通过统一路由配置,将所有请求集中到网关进行管理;其次,实现了限流防刷功能,防止恶意刷接口;最后,添加了登录鉴权机制,确保用户身份验证。整个过程结合Nacos注册中心,确保服务注册与配置管理的高效性。通过这些实践,帮助开发者更好地理解和应用微服务网关。
2238 0
🛡️Spring Boot 3 整合 Spring Cloud Gateway 工程实践
|
存储 运维 监控
金融场景 PB 级大规模日志平台:中信银行信用卡中心从 Elasticsearch 到 Apache Doris 的先进实践
中信银行信用卡中心每日新增日志数据 140 亿条(80TB),全量归档日志量超 40PB,早期基于 Elasticsearch 构建的日志云平台,面临存储成本高、实时写入性能差、文本检索慢以及日志分析能力不足等问题。因此使用 Apache Doris 替换 Elasticsearch,实现资源投入降低 50%、查询速度提升 2~4 倍,同时显著提高了运维效率。
883 3
金融场景 PB 级大规模日志平台:中信银行信用卡中心从 Elasticsearch 到 Apache Doris 的先进实践
|
数据采集 人工智能 运维
从企业级 RAG 到 AI Assistant,阿里云Elasticsearch AI 搜索技术实践
本文介绍了阿里云 Elasticsearch 推出的创新型 AI 搜索方案。
1025 5
|
数据采集 人工智能 运维
从企业级 RAG 到 AI Assistant,阿里云Elasticsearch AI 搜索技术实践
本文介绍了阿里云 Elasticsearch 推出的创新型 AI 搜索方案
817 3
从企业级 RAG 到 AI Assistant,阿里云Elasticsearch AI 搜索技术实践
|
负载均衡 Java 开发者
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
852 5
|
安全 Java 数据安全/隐私保护
如何使用Spring Boot进行表单登录身份验证:从基础到实践
如何使用Spring Boot进行表单登录身份验证:从基础到实践
462 5