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

本文涉及的产品
Elasticsearch Serverless检索通用型,资源抵扣包 100CU*H
简介: 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可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
17天前
|
JavaScript 前端开发 Java
制造业ERP源码,工厂ERP管理系统,前端框架:Vue,后端框架:SpringBoot
这是一套基于SpringBoot+Vue技术栈开发的ERP企业管理系统,采用Java语言与vscode工具。系统涵盖采购/销售、出入库、生产、品质管理等功能,整合客户与供应商数据,支持在线协同和业务全流程管控。同时提供主数据管理、权限控制、工作流审批、报表自定义及打印、在线报表开发和自定义表单功能,助力企业实现高效自动化管理,并通过UniAPP实现移动端支持,满足多场景应用需求。
|
24天前
|
前端开发 Java 关系型数据库
基于Java+Springboot+Vue开发的鲜花商城管理系统源码+运行
基于Java+Springboot+Vue开发的鲜花商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的鲜花商城管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。技术学习共同进步
115 7
|
1月前
|
存储 Java 数据库
Spring Boot 注册登录系统:问题总结与优化实践
在Spring Boot开发中,注册登录模块常面临数据库设计、密码加密、权限配置及用户体验等问题。本文以便利店销售系统为例,详细解析四大类问题:数据库字段约束(如默认值缺失)、密码加密(明文存储风险)、Spring Security配置(路径权限不当)以及表单交互(数据丢失与提示不足)。通过优化数据库结构、引入BCrypt加密、完善安全配置和改进用户交互,提供了一套全面的解决方案,助力开发者构建更 robust 的系统。
64 0
|
18天前
|
供应链 JavaScript BI
ERP系统源码,基于SpringBoot+Vue+ElementUI+UniAPP开发
这是一款专为小微企业打造的 SaaS ERP 管理系统,基于 SpringBoot+Vue+ElementUI+UniAPP 技术栈开发,帮助企业轻松上云。系统覆盖进销存、采购、销售、生产、财务、品质、OA 办公及 CRM 等核心功能,业务流程清晰且操作简便。支持二次开发与商用,提供自定义界面、审批流配置及灵活报表设计,助力企业高效管理与数字化转型。
ERP系统源码,基于SpringBoot+Vue+ElementUI+UniAPP开发
|
3天前
|
JSON 安全 数据可视化
Elasticsearch(es)在Windows系统上的安装与部署(含Kibana)
Kibana 是 Elastic Stack(原 ELK Stack)中的核心数据可视化工具,主要与 Elasticsearch 配合使用,提供强大的数据探索、分析和展示功能。elasticsearch安装在windows上一般是zip文件,解压到对应目录。文件,elasticsearch8.x以上版本是自动开启安全认证的。kibana安装在windows上一般是zip文件,解压到对应目录。elasticsearch的默认端口是9200,访问。默认用户是elastic,密码需要重置。
57 0
|
2月前
|
人工智能 自然语言处理 Java
对话即服务:Spring Boot整合MCP让你的CRUD系统秒变AI助手
本文介绍了如何通过Model Context Protocol (MCP) 协议将传统Spring Boot服务改造为支持AI交互的智能系统。MCP作为“万能适配器”,让AI以统一方式与多种服务和数据源交互,降低开发复杂度。文章以图书管理服务为例,详细说明了引入依赖、配置MCP服务器、改造服务方法(注解方式或函数Bean方式)及接口测试的全流程。最终实现用户通过自然语言查询数据库的功能,展示了MCP在简化AI集成、提升系统易用性方面的价值。未来,“对话即服务”有望成为主流开发范式。
3048 7
|
2月前
|
JSON Java 数据格式
微服务——SpringBoot使用归纳——Spring Boot中的全局异常处理——处理系统异常
本文介绍了在Spring Boot项目中如何通过创建`GlobalExceptionHandler`类来全局处理系统异常。通过使用`@ControllerAdvice`注解,可以拦截项目中的各种异常,并结合`@ExceptionHandler`注解针对特定异常(如参数缺失、空指针等)进行定制化处理。文中详细展示了处理参数缺失异常和空指针异常的示例代码,并说明了通过拦截`Exception`父类实现统一异常处理的方法。虽然拦截`Exception`可一劳永逸,但为便于问题排查,建议优先处理常见异常,最后再兜底处理未知异常,确保返回给调用方的信息友好且明确。
180 0
微服务——SpringBoot使用归纳——Spring Boot中的全局异常处理——处理系统异常
|
3月前
|
人工智能 运维 自然语言处理
Elasticsearch AI Assistant 集成 DeepSeek,1分钟搭建智能运维助手
Elasticsearch 新支持 DeepSeek 系列模型,使用 AI 助手,通过自然语言交互,为可观测性分析、安全运维管理及数据智能处理提供一站式解决方案。
655 3
Elasticsearch AI Assistant 集成 DeepSeek,1分钟搭建智能运维助手
|
2月前
|
人工智能 自然语言处理 前端开发
20分钟上手DeepSeek开发:SpringBoot + Vue2快速构建AI对话系统
本文介绍如何使用Spring Boot3与Vue2快速构建基于DeepSeek的AI对话系统。系统具备实时流式交互、Markdown内容渲染、前端安全防护等功能,采用响应式架构提升性能。后端以Spring Boot为核心,结合WebFlux和Lombok开发;前端使用Vue2配合WebSocket实现双向通信,并通过DOMPurify保障安全性。项目支持中文语义优化,API延迟低,成本可控,适合个人及企业应用。跟随教程,轻松开启AI应用开发之旅!
|
4月前
|
前端开发 JavaScript Java
springboot图书馆管理系统前后端分离版本
springboot图书馆管理系统前后端分离版本
79 12

热门文章

最新文章