利用springboot+elasticSearch,实现数据高效搜索,实战开发(三)

简介: 在2018年10月5日,一个做数据搜索服务的软件初创公司 Elastic,在纳斯达克上市。

四、SpringBoot 整合 ElasticSearch

对于 SpringBoot 来说,ElasticSearch 其实只是一个中间件,用途在于提供高效的搜索服务,比较幸运的是 SpringBoot 也为我们提供了 ElasticSearch 依赖库,添加依赖包,通过 JPA 访问非常方便,整合过程如下!

4.1、创建一个SpringBoot项目

pom.xml中,添加依赖库 ElasticSearch 依赖包

<!--jpa 支持-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!--elasticsearch-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>

application.properties中添加配置,其中节点名称cluster-name需要与上面的配置保持一致!

spring.data.elasticsearch.cluster-name=my-es
spring.data.elasticsearch.cluster-nodes=197.168.24.207:9300

4.1、编写 CURD

我们先写一个的实体类Student,借助这个实体类来完成基础的 CRUD 功能。

  • 新增实体类Student,其中indexName表示索引,type表示索引类别
@Data
@Accessors(chain = true)
@Document(indexName = "student", type = "school")
public class Student {
    private static final long serialVersionUID = 1l;
    @Id
    private String id;
    private String name;
    private String gender;
    private Integer age;
}

注意id字段是必须的,可以不写注解@Id

  • 使用 JPA 作为数据持久层,接口继承自ElasticsearchRepository,同时新增两个自定义查询方法
public interface StudentRepository extends ElasticsearchRepository<Student, String> {
    /**
     * 通过姓名模拟查询学生信息
     * @param keyword
     * @return
     */
    List<Student> findByNameLike(String keyword);
    /**
     * 自定义查询,固定匹配查询学生信息
     * @param keyword
     * @return
     */
    @Query("{\"match_phrase\":{\"name\":\"?0\"}}")
    List<Student> findByNameCustom(String keyword);
}
  • 创建控制层,编写基础的 CRUD 功能
@RestController
@RequestMapping("/student")
public class StudentController {
    @Autowired
    private StudentRepository studentRepository;
    @Autowired
    private ElasticsearchTemplate elasticsearchTemplate;
    /**
     * 批量添加
     * @param students
     * @return
     */
    @PostMapping("/batchAdd")
    public void add(@RequestBody List<Student> students){
        studentRepository.saveAll(students);
    }
    /**
     * 添加
     * @param student
     * @return
     */
    @PostMapping("/add")
    public void add(@RequestBody Student student){
        studentRepository.save(student);
    }
    /**
     * 修改
     * @param student
     * @return
     */
    @PostMapping("/update")
    public void updateById(@RequestBody Student student){
        studentRepository.save(student);
    }
    /**
     * 删除
     * @param id
     * @return
     */
    @PostMapping("/delete/{id}")
    public void deleteById(@PathVariable String id){
        studentRepository.deleteById(id);
    }
    /**
     * 获取所有信息
     * @return
     */
    @GetMapping("/get")
    public Object getAll(){
        Iterable<Student> iterable = studentRepository.findAll();
        List<Student> list = new ArrayList<>();
        iterable.forEach(list :: add);
        return list;
    }
    /**
     * 查询指定ID
     * @param id
     * @return
     */
    @GetMapping("/get/{id}")
    public Object getById(@PathVariable String id){
        if(StringUtils.isEmpty(id)){
            return Result.error();
        }
        Optional<Student> studentOptional = studentRepository.findById(id);
        if(studentOptional.isPresent()){
            return studentOptional.get();
        }
        return null;
    }
    /**
     * 普通搜索
     * @param keyword
     * @return
     */
    @GetMapping("/search/name")
    public Object searchName(String keyword){
        List<Student> students = studentRepository.findByNameLike(keyword);
        return students;
    }
    /**
     * 自定义匹配
     * 普通搜索
     * @param keyword
     * @return
     */
    @GetMapping("/search/name/custom")
    public Object searchTitleCustom(String keyword){
        List<Student> students = studentRepository.findByNameCustom(keyword);
        return students;
    }
    /**
     * 高级搜索,可以自定义添加搜索字段
     * @param keyword
     * @return
     */
    @GetMapping("/top/search/name")
    public Object topSearchTitle(String keyword){
        SearchQuery searchQuery = new NativeSearchQueryBuilder()
                .withQuery(queryStringQuery(keyword))
                .build();
  //使用searchQuery进行搜索
        List<Student> students = elasticsearchTemplate.queryForList(searchQuery, Student.class);
        return students;
    }
}

4.2、CRUD 测试

CRUD 编写完了,我们验证一下是否可以正常操作,启动 springboot 项目,使用 postman 进行测试。

  • 批量新增、新增功能测试

109.jpg109.jpg


执行之后,登录可视化界面查询界面,选择索引student,可以很清晰的看到数据已经进去了

110.jpg

修改功能测试,修改时需要传入ID

111.jpg

王小贱从26岁修改为30岁,登录可视化界面查询数据也已经修改成功!

112.jpg

删除功能测试,只需要传入ID

113.jpg

删除李四,登录可视化界面查询数据也已经删除成功!

114.jpg

查询功能测试,查询所有数据

115.jpg

查询功能测试,查询指定ID信息

116.jpg

查询功能测试,普通模糊查询,ElasticSearch 会对关键词进行拆分,只要有包含关键字的都会查询出来,例如输入王张,会将包含或者的姓名信息查询出来117.jpg

查询功能测试,高级查询,这个是使用官方api提供的查询入口,可以在方法中进行自定义搜索

118.jpg

五、总结

elasticsearch 在海量数据查询方面,非常高效,本来想写在大量数据查询方面,数据库与 elasticsearch 的查询效率比对,由于篇幅较长会造成阅读体验降低,后在下篇文章中再次介绍这个部分。

对于想学习 elasticsearch 的新手,尤其是安装部分可能比较困难,因此花的编写时间比较多,后续的整合都比较简单,elasticsearch 真正的强大的地方在于高效信息搜索,本篇对 elasticsearch 的搜索只是做一个基础的介绍,具体的高级搜索方法大家可以参考官方文档 API,本篇可以看作为 elasticsearch 搜索服务入门的教程,可能也有遗漏的地方,欢迎网友点评、吐槽!

相关实践学习
以电商场景为例搭建AI语义搜索应用
本实验旨在通过阿里云Elasticsearch结合阿里云搜索开发工作台AI模型服务,构建一个高效、精准的语义搜索系统,模拟电商场景,深入理解AI搜索技术原理并掌握其实现过程。
ElasticSearch 最新快速入门教程
本课程由千锋教育提供。全文搜索的需求非常大。而开源的解决办法Elasricsearch(Elastic)就是一个非常好的工具。目前是全文搜索引擎的首选。本系列教程由浅入深讲解了在CentOS7系统下如何搭建ElasticSearch,如何使用Kibana实现各种方式的搜索并详细分析了搜索的原理,最后讲解了在Java应用中如何集成ElasticSearch并实现搜索。 &nbsp;
相关文章
|
5月前
|
缓存 监控 前端开发
顺企网 API 开发实战:搜索 / 详情接口从 0 到 1 落地(附 Elasticsearch 优化 + 错误速查)
企业API开发常陷参数、缓存、错误处理三大坑?本指南拆解顺企网双接口全流程,涵盖搜索优化、签名验证、限流应对,附可复用代码与错误速查表,助你2小时高效搞定开发,提升响应速度与稳定性。
|
5月前
|
存储 Linux iOS开发
Elasticsearch Enterprise 9.1.5 发布 - 分布式搜索和分析引擎
Elasticsearch Enterprise 9.1.5 (macOS, Linux, Windows) - 分布式搜索和分析引擎
435 0
|
6月前
|
JSON 监控 Java
Elasticsearch 分布式搜索与分析引擎技术详解与实践指南
本文档全面介绍 Elasticsearch 分布式搜索与分析引擎的核心概念、架构设计和实践应用。作为基于 Lucene 的分布式搜索引擎,Elasticsearch 提供了近实时的搜索能力、强大的数据分析功能和可扩展的分布式架构。本文将深入探讨其索引机制、查询 DSL、集群管理、性能优化以及与各种应用场景的集成,帮助开发者构建高性能的搜索和分析系统。
460 0
存储 JSON Java
764 0
|
8月前
|
JSON Java 数据格式
Spring Boot返回Json数据及数据封装
在Spring Boot中,接口间及前后端的数据传输通常使用JSON格式。通过@RestController注解,可轻松实现Controller返回JSON数据。该注解是Spring Boot新增的组合注解,结合了@Controller和@ResponseBody的功能,默认将返回值转换为JSON格式。Spring Boot底层默认采用Jackson作为JSON解析框架,并通过spring-boot-starter-json依赖集成了相关库,包括jackson-databind、jackson-datatype-jdk8等常用模块,简化了开发者对依赖的手动管理。
763 3
|
10月前
|
存储 安全 Linux
Elasticsearch Enterprise 9.0 发布 - 分布式搜索和分析引擎
Elasticsearch Enterprise 9.0 (macOS, Linux, Windows) - 分布式搜索和分析引擎
427 0
|
10月前
|
存储 Linux iOS开发
Elasticsearch Enterprise 8.18 发布 - 分布式搜索和分析引擎
Elasticsearch Enterprise 8.18 (macOS, Linux, Windows) - 分布式搜索和分析引擎
385 0
|
12月前
|
JSON Java 数据格式
微服务——SpringBoot使用归纳——Spring Boot返回Json数据及数据封装——封装统一返回的数据结构
本文介绍了在Spring Boot中封装统一返回的数据结构的方法。通过定义一个泛型类`JsonResult&lt;T&gt;`,包含数据、状态码和提示信息三个属性,满足不同场景下的JSON返回需求。例如,无数据返回时可设置默认状态码&quot;0&quot;和消息&quot;操作成功!&quot;,有数据返回时也可自定义状态码和消息。同时,文章展示了如何在Controller中使用该结构,通过具体示例(如用户信息、列表和Map)说明其灵活性与便捷性。最后总结了Spring Boot中JSON数据返回的配置与实际项目中的应用技巧。
900 0
|
12月前
|
JSON Java fastjson
微服务——SpringBoot使用归纳——Spring Boot返回Json数据及数据封装——使用 fastJson 处理 null
本文介绍如何使用 fastJson 处理 null 值。与 Jackson 不同,fastJson 需要通过继承 `WebMvcConfigurationSupport` 类并覆盖 `configureMessageConverters` 方法来配置 null 值的处理方式。例如,可将 String 类型的 null 转为 &quot;&quot;,Number 类型的 null 转为 0,避免循环引用等。代码示例展示了具体实现步骤,包括引入相关依赖、设置序列化特性及解决中文乱码问题。
617 0
|
12月前
|
JSON Java fastjson
微服务——SpringBoot使用归纳——Spring Boot返回Json数据及数据封装——Spring Boot 默认对Json的处理
本文介绍了在Spring Boot中返回Json数据的方法及数据封装技巧。通过使用`@RestController`注解,可以轻松实现接口返回Json格式的数据,默认使用的Json解析框架是Jackson。文章详细讲解了如何处理不同数据类型(如类对象、List、Map)的Json转换,并提供了自定义配置以应对null值问题。此外,还对比了Jackson与阿里巴巴FastJson的特点,以及如何在项目中引入和配置FastJson,解决null值转换和中文乱码等问题。
1629 0