springboot集成ElasticSearch的具体操作(系统全文检索)

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: springboot集成ElasticSearch的具体操作(系统全文检索)

es搜索引擎的个人理解:将数据库中 ,在需要做全文检索的业务数据同步一份到es搜索引擎里面,建立在同一个索引下的数据集。

1.项目引入maven依赖

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

2.建立es与数据库数据的实体类
package com.test.model;

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;

import java.util.Date;

/**

  • Es 索引库实体
    *
  • @author wangwei
  • @date 2023-07-31
    */
    @Document(indexName = "rabbit1")
    @Data
    public class EsModel {

    /** 索引id/
    @Field(type = FieldType.Long)
    private Long id;

    /** es中对应的数据库业务单据id*/
    @Field(analyzer = "ik_max_word")
    private Long ctId;

    /** es中业务数据 对应的业务数据库表名称*/
    @Field(analyzer = "ik_max_word")
    private String ctTableName;

    /** es中业务数据 对应的 业务简称*/
    @Field(analyzer = "ik_max_word")
    private String ctName;

/**** es中业务数据 对应的 业务内容详细信息*/
@Field(analyzer = "ik_max_word")
private String ctContent;


/** 备注 */
@Field(analyzer = "ik_max_word")
private String remark;

/** 备用1 */
@Field(analyzer = "ik_max_word")
private String by1;

/** 备用2 */
@Field(analyzer = "ik_max_word")
private String by2;

/** 备用3 */
@Field(analyzer = "ik_max_word")
private String by3;

/** 备用4 */
@Field(analyzer = "ik_max_word")
private String by4;

/** 备用5 */
@Field(analyzer = "ik_max_word")
private String by5;

}
3.建立es操作接口
package com.test.repository;

import com.test.model.EsModel;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;

/**

  • @author wangwei
  • @date 2023-07-31 14:12:36
    */
    @Repository
    public interface EsRepository extends ElasticsearchRepository {
/****
 * 删除es操作
 */
public void deleteById(Long id);

}
4.具体业务使用

package com.test.business.service.impl;
import java.io.IOException;
import java.util.List;
import com.alibaba.fastjson.JSON;
import com.test.business.domain.;
import com.test.business.domain.dto.TbAjkDto;
import com.test.business.domain.dto.TbAjkExportDto;
import com.test.business.mapper.
;
import com.test.common.exception.CustomException;
import com.test.constant.EsConstants;
import com.test.model.EsModel;
import com.test.model.TbAjkEs;
import com.test.model.TbAjkEsRepository;
import com.test.repository.EsRepository;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.xcontent.XContentType;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Service;
import com.test.business.service.ITbAjkService;
import org.springframework.transaction.annotation.Transactional;

/**

  • 库详情Service业务层处理
    *
  • @author wangwei
  • @date 2023-07-18
    */
    @Service
    public class TbAjkServiceImpl implements ITbAjkService {
    @Autowired
    private TbAjkMapper tbAjkMapper;
    @Autowired
    private TbAjgjcMapper tbAjgjcMapper;
    @Autowired
    private TbAjxyrMapper tbAjxyrMapper;
    @Autowired
    private TbAjxxlMapper tbAjxxlMapper;
    @Autowired
    private TbAjwllMapper tbAjwllMapper;
    @Autowired
    private TbAjzjlMapper tbAjzjlMapper;
    @Autowired
    private TbAjtxlMapper tbAjtxlMapper;
    @Autowired
    private PublicSqlMapper publicSqlMapper;
    @Autowired
    private TbAjkEsRepository tbAjkEsRepository;
    @Autowired
    private EsRepository esRepository;
    @Autowired
    private RestHighLevelClient client;
/**
 * 查询库详情
 *
 * @param id 详情主键
 * @return 库详情
 */
@Override
public TbAjk selectTbAjkById(Long id) {
    return tbAjkMapper.selectTbAjkByCtId(id);
}

/**
 * 查询详情列表
 *
 * @param 库详情
 * @return 库详情
 */
@Override
public List<TbAjk> selectTbAjkList(TbAjk tbAjk) {
    return tbAjkMapper.selectTbAjkList(tbAjk);
}

/**
 * 新增库详情
 * 新增es中的信息
 *
 * @param tbAjk 详情
 * @return 结果
 */
@Transactional(rollbackFor = Exception.class)
@Override
public int insertTbAjk(TbAjk tbAjk) {
    int i = tbAjkMapper.insertTbAjk(tbAjk);
    if (i == 1) {
        EsModel esModel = new EsModel();
        Integer integer = publicSqlMapper.selectInsertId();
        esModel.setId(Long.valueOf(integer));
        esModel.setCtId(Long.valueOf(integer));
        esModel.setCtTableName("tb_ajk");
        esModel.setCtName(tbAjk.getAjmc());
        esModel.setCtContent(tbAjk.getCjsy());//处事由
        esModel.setBy1(tbAjk.getLaay());//案由
        esModel.setBy2(tbAjk.getAjlb());//类别
        esModel.setBy3(tbAjk.getCjnr());//内容
        esModel.setBy4(tbAjk.getContent());//出内容
        esModel.setBy5(tbAjk.getCbpcs());//承办
        esModel.setRemark(tbAjk.getJyaq());//简要情
        try {
            esRepository.save(esModel);
        } catch (Exception e) {
            throw new CustomException("ES数据同步失败,请联系管理员处理!");
        }
    } else {
        throw new CustomException("数据库操作失败,请联系管理员处理!");
    }
    return 1;
}

/**
 * 修改库详情
 * 修改es中的信息
 * es: 1. 查询es中的数据
 * es: 2. 修改es中的数据
 *
 * @param 库详情
 * @return 结果
 */
@Transactional(rollbackFor = Exception.class)
@Override
public int updateTbAjk(TbAjk tbAjk) {
    int i = tbAjkMapper.updateTbAjk(tbAjk);
    if (i == 1) {
        // public UpdateRequest(String index, String type, String id) {
        //  es-update  https://www.jb51.net/article/246798.htm
        UpdateRequest updateRequest = new UpdateRequest(EsConstants.ES_INDEX, EsConstants.ES_INDEX_TYPE, String.valueOf(tbAjk.getCtId()));
        EsModel esModel = new EsModel();
        esModel.setId(Long.valueOf(tbAjk.getCtId()));
        esModel.setCtId(Long.valueOf(tbAjk.getCtId()));
        esModel.setCtName(tbAjk.getAjmc());
        esModel.setCtContent(tbAjk.getCjsy());//事由
        esModel.setBy1(tbAjk.getLaay());//案由
        esModel.setBy2(tbAjk.getAjlb());//类别
        esModel.setBy3(tbAjk.getCjnr());//内容
        esModel.setBy4(tbAjk.getContent());//出内容
        esModel.setBy5(tbAjk.getCbpcs());//承办
        esModel.setRemark(tbAjk.getJyaq());//简要情
        //更新    将对象转换为json
        updateRequest.doc(JSON.toJSONString(esModel), XContentType.JSON);
        //客户端发送请求,进行更新
        UpdateResponse update = null;
        try {
            update = client.update(updateRequest, RequestOptions.DEFAULT);
        } catch (IOException e) {
            throw new CustomException("ES数据同步失败可能原因是es中的业务ctId在数据库中不存在,请查看es客户端查询验证,请联系管理员处理!");
        }

        if (!"OK".equals(update.status().toString())) {
            throw new CustomException("ES数据同步失败,请联系管理员处理!");
        }
    } else {
        throw new CustomException("数据库操作失败,请联系管理员处理!");
    }
    return 1;
}

/**
 * 批量删除库详情
 *
 * @param ids 需要删除的详情主键
 * @return 结果
 */
@Transactional(rollbackFor = Exception.class)
@Override
public int deleteTbAjkByIds(Long[] ids) {
    int i = tbAjkMapper.deleteTbAjkByCtIds(ids);
    if (i != 1) {
        throw new CustomException("数据库操作失败,请联系管理员处理!");
    }
    for (int ii = 0; ii < ids.length; ii++) {
        try {
            esRepository.deleteById(ids[ii]);
        } catch (Exception e) {
            throw new CustomException("ES同步数据失败,请联系管理员处理!");
        }
    }
    return 1;
}

/**
 * 删除详情信息
 *
 * @param id 详情主键
 * @return 结果
 */
@Transactional(rollbackFor = Exception.class)
@Override
public int deleteTbAjkById(Long id) {
    int i = tbAjkMapper.deleteTbAjkByCtId(id);
    if (i != 1) {
        throw new CustomException("数据库操作失败,请联系管理员处理!");
    }
    try {
        esRepository.deleteById(id);
    } catch (Exception e) {
        throw new CustomException("ES同步数据失败,请联系管理员处理!");
    }
    return 1;
}

}

5.es查询说明

5.1 es案字段key查询
@Override
public AjaxResult searchES(String key) {
Pageable pageable = null;
Page byAjmc = tbAjkEsRepository.findByAjmc(key, pageable);
return AjaxResult.success(byAjmc);
}

5.2 全文检索(高阶用法)

说明:按业务需要在withQuery(matchQuery("", key))中天剑需要检索的字段键值,进行全文检索
/*

 * //全文检索
 * @param key
 * @return
 */
@Override
public AjaxResult searchWhole(String key) {
    Pageable pageable = null;

    if (StringUtils.isEmpty(key)) {
        System.out.println("key is null");
    }
    //全文检索
    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

    SearchQuery searchQuery = new NativeSearchQueryBuilder()
            .withQuery(matchQuery("ctName", key))
            .withQuery(matchQuery("ctContent", key))
            .withQuery(matchQuery("remark", key))
           // .withPageable(pageable)
            .build();

    Page<EsModel> esModels = elasticsearchRestTemplate.queryForPage(searchQuery, EsModel.class);
    return AjaxResult.success(esModels);
}

6.es客户端查看数据的操作
image.png

image.png
image.png
image.png

相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
4天前
|
存储 前端开发 Java
Spring Boot 集成 MinIO 与 KKFile 实现文件预览功能
本文详细介绍如何在Spring Boot项目中集成MinIO对象存储系统与KKFileView文件预览工具,实现文件上传及在线预览功能。首先搭建MinIO服务器,并在Spring Boot中配置MinIO SDK进行文件管理;接着通过KKFileView提供文件预览服务,最终实现文档管理系统的高效文件处理能力。
|
9天前
|
XML Java 关系型数据库
springboot 集成 mybatis-plus 代码生成器
本文介绍了如何在Spring Boot项目中集成MyBatis-Plus代码生成器,包括导入相关依赖坐标、配置快速代码生成器以及自定义代码生成器模板的步骤和代码示例,旨在提高开发效率,快速生成Entity、Mapper、Mapper XML、Service、Controller等代码。
springboot 集成 mybatis-plus 代码生成器
|
9天前
|
Java Spring
springboot 集成 swagger 2.x 和 3.0 以及 Failed to start bean ‘documentationPluginsBootstrapper‘问题的解决
本文介绍了如何在Spring Boot项目中集成Swagger 2.x和3.0版本,并提供了解决Swagger在Spring Boot中启动失败问题“Failed to start bean ‘documentationPluginsBootstrapper’; nested exception is java.lang.NullPointerEx”的方法,包括配置yml文件和Spring Boot版本的降级。
springboot 集成 swagger 2.x 和 3.0 以及 Failed to start bean ‘documentationPluginsBootstrapper‘问题的解决
|
2月前
|
网络协议 Java API
SpringBoot整合Elasticsearch-Rest-Client、测试保存、复杂检索
这篇文章介绍了如何在SpringBoot中整合Elasticsearch-Rest-Client,并提供了保存数据和进行复杂检索的测试示例。
SpringBoot整合Elasticsearch-Rest-Client、测试保存、复杂检索
|
1月前
|
机器学习/深度学习 存储 数据采集
Elasticsearch 与机器学习的集成
【9月更文第3天】Elasticsearch 不仅仅是一个强大的分布式搜索和分析引擎,它还是一个完整的数据平台,通过与 Kibana、Logstash 等工具结合使用,能够提供从数据采集、存储到分析的一站式解决方案。特别是,Elasticsearch 集成了机器学习(ML)功能,使得在实时数据流中进行异常检测和趋势预测成为可能。本文将详细介绍如何利用 Elasticsearch 的 ML 功能来检测异常行为或预测趋势。
33 4
|
2月前
|
NoSQL 关系型数据库 MySQL
SpringBoot 集成 SpringSecurity + MySQL + JWT 附源码,废话不多直接盘
SpringBoot 集成 SpringSecurity + MySQL + JWT 附源码,废话不多直接盘
93 2
|
2月前
|
JSON 自然语言处理 Java
ElasticSearch 实现分词全文检索 - 搜素关键字自动补全(Completion Suggest)
ElasticSearch 实现分词全文检索 - 搜素关键字自动补全(Completion Suggest)
55 1
|
2月前
|
机器学习/深度学习 存储 搜索推荐
Elasticsearch与深度学习框架的集成案例研究
Elasticsearch 是一个强大的搜索引擎和分析引擎,广泛应用于实时数据处理和全文搜索。深度学习框架如 TensorFlow 和 PyTorch 则被用来构建复杂的机器学习模型。本文将探讨如何将 Elasticsearch 与这些深度学习框架集成,以实现高级的数据分析和预测任务。
27 0
|
2月前
|
机器学习/深度学习 数据采集 缓存
Elasticsearch与机器学习集成的最佳实践
【8月更文第28天】Elasticsearch 提供了强大的搜索和分析能力,而机器学习则能够通过识别模式和预测趋势来增强这些能力。将两者结合可以实现更智能的搜索体验、异常检测等功能。
48 0
|
2月前
|
Java Spring
【Azure Developer】Springboot 集成 中国区的Key Vault 报错 AADSTS90002: Tenant 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' not found
【Azure Developer】Springboot 集成 中国区的Key Vault 报错 AADSTS90002: Tenant 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' not found
下一篇
无影云桌面