ElasticSearch经典入门(十一) SpringBoot整合ElasticSearch7

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: SpringBoot整合ElasticSearch7

前言

你可以通过官网文档看到ElasticSearch7和6的变化,本文的重点在于在SpringBoot环境中使用ElasticSearch7。

软件安装

从官网下载ElasticSearch ,我这里使用的是7.9.3版本下载Kibana也是7.9.3,以及IK分词器,下载好之后把ElasticSearch进行解压:
image.png

把IK分词器解压到plugins/ik目录中,如下:
image.png

解压Kibana,目录结构如下
image.png

启动ElasticSearch : elasticsearch-7.9.3\bin\elasticsearch.bat , 然后启动Kibana :\kibana-7.9.3-windows-x86_64\bin\kibana.bat ,访问kibana: http://localhost:5601
image.png

Spring整合ES7

第一步:导入依赖,SpringBoot使用的是2.4;需要注意版本兼容7.9.3
image.png

 <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.0</version>
        <relativePath/>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.12</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.71</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

第二步:启动类常规写法,yaml配置es地址

server:
  port: 1000
spring:
  elasticsearch:
    rest:
      uris:
        - http://localhost:9200

第三步:编写ES的Doc对象

@Data
//定义索引,7以上的版本去掉了type属性
@Document(indexName = "goodsorder", shards = 1, replicas = 1)
@AllArgsConstructor
@NoArgsConstructor
public class OrderDoc implements Serializable {
   
   
    @Id
    @Field(type = FieldType.Keyword)
    private String id;

    @Field(type = FieldType.Long)
    private Long orderNo;

    @Field(type = FieldType.Text, analyzer = "ik_smart", searchAnalyzer = "ik_max_word")
    private String title;

    //用来封装高亮的结果
    private Map<String, List<String>> highlights;

    public OrderDoc(String id, Long orderNo ,String title){
   
   
        this.id = id;
        this.orderNo = orderNo;
        this.title =title;
    }
}

第四步:编写Repository接口

@Repository
//泛型是Doc对象和ID的类型
public interface OrderRepository extends ElasticsearchRepository<OrderDoc, String> {
   
   

}

第五步:编写Service接口,定义基本的CRUD方法

public interface OrderDocService {
   
   

    void saveAll(List<OrderDoc> orderDocs);

    OrderDoc findById(String id);

    void deleteById(String id);

    void updateById(OrderDoc orderDoc);

    PageResponse<OrderDoc> findList(OrderDoc orderDoc, Integer pageIndex, Integer pageSize);

    PageResponse<OrderDoc> findAll(Integer pageIndex, Integer pageSize);

    PageResponse<OrderDoc> findHighlight(OrderDoc orderDoc, Integer pageIndex, Integer pageSize);
}

下面是实现类,注入OrderRepository和ElasticsearchRestTemplate实现CRUD工作

@Service
public class OrderDocServiceImpl implements OrderDocService {
   
   

    @Autowired
    private OrderRepository orderRepository;
    @Autowired
    private ElasticsearchRestTemplate template;

    @Override
    public void saveAll(List<OrderDoc> orderDocs) {
   
   
        orderRepository.saveAll(orderDocs);
    }

    @Override
    public OrderDoc findById(String id) {
   
   
        return orderRepository.findById(id).orElse(null);
    }

    @Override
    public void deleteById(String id) {
   
   
        orderRepository.deleteById(id);
    }

    @Override
    public void updateById(OrderDoc orderDoc) {
   
   
        orderRepository.save(orderDoc);
    }

    @Override
    public PageResponse<OrderDoc> findList(OrderDoc orderDoc, Integer pageIndex, Integer pageSize) {
   
   
        CriteriaQuery criteriaQuery = new CriteriaQuery(
                new Criteria().and("title").contains(orderDoc.getTitle()),PageRequest.of(pageIndex,pageSize));

        SearchHits<OrderDoc> searchHits = template.search(criteriaQuery, OrderDoc.class);

        List<OrderDoc> orderDocList = searchHits.getSearchHits().stream()
                .map(orderDocSearchHit -> orderDocSearchHit.getContent()).collect(Collectors.toList());

        return new PageResponse<OrderDoc>(searchHits.getTotalHits() ,orderDocList);
    }

    @Override
    public PageResponse<OrderDoc> findAll(Integer pageIndex, Integer pageSize) {
   
   
        Page<OrderDoc> page = orderRepository.findAll(PageRequest.of(pageIndex, pageSize));
        return new PageResponse<OrderDoc>(page.getTotalElements(),page.getContent());
    }

    @Override
    public PageResponse<OrderDoc> findHighlight(OrderDoc orderDoc, Integer pageIndex, Integer pageSize) {
   
   
        //查询条件
        CriteriaQuery criteriaQuery = new CriteriaQuery(
                new Criteria().and("title").contains(orderDoc.getTitle()),
                PageRequest.of(pageIndex,pageSize));
        //高亮字段
        HighlightBuilder highlightBuilder = new HighlightBuilder();
        highlightBuilder.field("title").preTags("<font style='color:red'>").postTags("</font>");
        criteriaQuery.setHighlightQuery(new HighlightQuery(highlightBuilder));
        //搜索结果
        SearchHits<OrderDoc> searchHits = template.search(criteriaQuery, OrderDoc.class);

        List<OrderDoc> orderDocList = searchHits.get().map(searchHit -> {
   
   
            //把高亮结果添加到doc中中
            OrderDoc doc = searchHit.getContent();
            //获取高亮
            doc.setHighlights(searchHit.getHighlightFields());
            return doc;
        }).collect(Collectors.toList());

        //处理结果
        return new PageResponse<>(searchHits.getTotalHits() , orderDocList);
    }
}

下面是需要的结果对象

@Data
@AllArgsConstructor
@NoArgsConstructor
public class PageResponse<T> {
   
   
    private Long total;
    private List<T> list;
}

第六步:编写单元测试

@RunWith(SpringRunner.class)
@SpringBootTest(classes = ApplicationStarter.class)
public class OrderDocServiceTest {
   
   

    @Autowired
    private OrderDocService orderDocService;

    @Test
    public void saveAll() {
   
   
        orderDocService.saveAll(Arrays.asList(
                new OrderDoc("1",100000l,"苹果电脑"),
                new OrderDoc("2",100000l,"苹果电脑"),
                new OrderDoc("3",100000l,"苹果电脑"),
                new OrderDoc("4",100000l,"苹果电脑"),
                new OrderDoc("5",100000l,"苹果电脑"),
                new OrderDoc("6",100000l,"苹果电脑"),
                new OrderDoc("7",100000l,"苹果电脑")
        ));
    }


    @Test
    public void findById() {
   
   
        System.out.println(orderDocService.findById("1"));
    }

    @Test
    public void deleteById() {
   
   
        orderDocService.deleteById("1");
    }

    @Test
    public void updateById() {
   
   
        OrderDoc orderDoc = orderDocService.findById("1");
        orderDoc.setTitle("华为电脑");
        orderDocService.updateById(orderDoc);
    }

    @Test
    public void findList() {
   
   
        OrderDoc orderDoc = new OrderDoc(null, 100l, "电脑");
        PageResponse<OrderDoc> response = orderDocService.findList(orderDoc, 0, 10);
        System.out.println(response.getTotal());
        response.getList().forEach(System.out::println);

    }

    @Test
    public void findAll() {
   
   
        PageResponse<OrderDoc> response = orderDocService.findAll( 0, 10);
        System.out.println(response.getTotal());
        response.getList().forEach(System.out::println);
    }

    @Test
    public void findHighlight() {
   
   
        OrderDoc orderDoc = new OrderDoc(null, 100l, "电脑",null);
        PageResponse<OrderDoc> response = orderDocService.findHighlight( orderDoc,0, 10);
        System.out.println(response.getTotal());
        response.getList().forEach(System.out::println);
    }
}
相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
目录
相关文章
|
7天前
|
数据可视化 Java Windows
Elasticsearch入门-环境安装ES和Kibana以及ES-Head可视化插件和浏览器插件es-client
本文介绍了如何在Windows环境下安装Elasticsearch(ES)、Elasticsearch Head可视化插件和Kibana,以及如何配置ES的跨域问题,确保Kibana能够连接到ES集群,并提供了安装过程中可能遇到的问题及其解决方案。
Elasticsearch入门-环境安装ES和Kibana以及ES-Head可视化插件和浏览器插件es-client
|
1月前
|
存储 关系型数据库 MySQL
浅谈Elasticsearch的入门与实践
本文主要围绕ES核心特性:分布式存储特性和分析检索能力,介绍了概念、原理与实践案例,希望让读者快速理解ES的核心特性与应用场景。
|
8天前
|
SQL JSON Java
springboot 如何编写增删改查后端接口,小白极速入门,附完整代码
本文为Spring Boot增删改查接口的小白入门教程,介绍了项目的构建、配置YML文件、代码编写(包括实体类、Mapper接口、Mapper.xml、Service和Controller)以及使用Postman进行接口测试的方法。同时提供了SQL代码和完整代码的下载链接。
springboot 如何编写增删改查后端接口,小白极速入门,附完整代码
|
2月前
|
小程序 前端开发 Java
SpringBoot+uniapp+uview打造H5+小程序+APP入门学习的聊天小项目
JavaDog Chat v1.0.0 是一款基于 SpringBoot、MybatisPlus 和 uniapp 的简易聊天软件,兼容 H5、小程序和 APP,提供丰富的注释和简洁代码,适合初学者。主要功能包括登录注册、消息发送、好友管理及群组交流。
62 0
SpringBoot+uniapp+uview打造H5+小程序+APP入门学习的聊天小项目
|
2月前
|
网络协议 Java API
SpringBoot整合Elasticsearch-Rest-Client、测试保存、复杂检索
这篇文章介绍了如何在SpringBoot中整合Elasticsearch-Rest-Client,并提供了保存数据和进行复杂检索的测试示例。
SpringBoot整合Elasticsearch-Rest-Client、测试保存、复杂检索
|
2月前
|
JSON 搜索推荐 数据挖掘
ElasticSearch的简单介绍与使用【入门篇】
这篇文章是Elasticsearch的入门介绍,涵盖了Elasticsearch的基本概念、特点、安装方法以及如何进行基本的数据操作,包括索引文档、查询、更新、删除和使用bulk API进行批量操作。
ElasticSearch的简单介绍与使用【入门篇】
|
1月前
|
JSON 监控 Java
Elasticsearch 入门:搭建高性能搜索集群
【9月更文第2天】Elasticsearch 是一个分布式的、RESTful 风格的搜索和分析引擎,基于 Apache Lucene 构建。它能够处理大量的数据,提供快速的搜索响应。本教程将指导你如何从零开始搭建一个基本的 Elasticsearch 集群,并演示如何进行简单的索引和查询操作。
73 3
|
2月前
|
前端开发 IDE Java
"揭秘前端转Java的秘径:SpringBoot Web极速入门,掌握分层解耦艺术,让你的后端代码飞起来,你敢来挑战吗?"
【8月更文挑战第19天】面向前端开发者介绍Spring Boot后端开发,通过简化Spring应用搭建,快速实现Web应用。本文以创建“Hello World”应用为例,展示项目基本结构与运行方式。进而深入探讨三层架构(Controller、Service、DAO)下的分层解耦概念,通过员工信息管理示例,演示各层如何协作及依赖注入的使用,以此提升代码灵活性与可维护性。
39 2
|
2月前
|
JSON 测试技术 API
黑马商城 Elasticsearch从入门到部署 RestClient操作文档
这篇文章详细介绍了如何使用Java的RestHighLevelClient客户端与Elasticsearch进行文档操作,包括新增、查询、删除、修改文档以及批量导入文档的方法,并提供了相应的代码示例和操作步骤。
|
2月前
|
JSON 自然语言处理 Java
Elasticsearch从入门到部署 文档操作 RestAPI
这篇文章详细介绍了Elasticsearch中文档的增删改查操作,并通过Java的RestHighLevelClient客户端演示了如何通过REST API与Elasticsearch进行交云,包括初始化客户端、索引库的创建、删除和存在性判断等操作。
下一篇
无影云桌面