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可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
25天前
|
安全 定位技术 API
婚恋交友系统匹配功能 婚恋相亲软件实现定位 语音社交app红娘系统集成高德地图SDK
在婚恋交友系统中集成高德地图,可实现用户定位、导航及基于地理位置的匹配推荐等功能。具体步骤如下: 1. **注册账号**:访问高德开放平台,注册并创建应用。 2. **获取API Key**:记录API Key以备开发使用。 3. **集成SDK**:根据开发平台下载并集成高德地图SDK。 4. **配置功能**:实现定位、导航及基于位置的匹配推荐。 5. **注意事项**:保护用户隐私,确保API Key安全,定期更新地图数据,添加错误处理机制。 6. **测试优化**:完成集成后进行全面测试,并根据反馈优化功能。 通过以上步骤,提升用户体验,提供更便捷的服务。
|
16天前
|
人工智能 数据挖掘 API
R2R:开源的 RAG 集成系统,支持多模态处理、混合搜索、知识图谱构建等增强检索技术
R2R 是一款先进的 AI 检索增强生成平台,支持多模态内容处理、混合搜索和知识图谱构建,适用于复杂数据处理和分析的生产环境。
96 3
R2R:开源的 RAG 集成系统,支持多模态处理、混合搜索、知识图谱构建等增强检索技术
|
12天前
|
存储 安全 Java
Spring Boot 3 集成Spring AOP实现系统日志记录
本文介绍了如何在Spring Boot 3中集成Spring AOP实现系统日志记录功能。通过定义`SysLog`注解和配置相应的AOP切面,可以在方法执行前后自动记录日志信息,包括操作的开始时间、结束时间、请求参数、返回结果、异常信息等,并将这些信息保存到数据库中。此外,还使用了`ThreadLocal`变量来存储每个线程独立的日志数据,确保线程安全。文中还展示了项目实战中的部分代码片段,以及基于Spring Boot 3 + Vue 3构建的快速开发框架的简介与内置功能列表。此框架结合了当前主流技术栈,提供了用户管理、权限控制、接口文档自动生成等多项实用特性。
53 8
|
2月前
|
开发框架 JavaScript 前端开发
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势。通过明确的类型定义,TypeScript 能够在编码阶段发现潜在错误,提高代码质量;支持组件的清晰定义与复用,增强代码的可维护性;与 React、Vue 等框架结合,提供更佳的开发体验;适用于大型项目,优化代码结构和性能。随着 Web 技术的发展,TypeScript 的应用前景广阔,将继续引领 Web 开发的新趋势。
52 2
|
2月前
|
XML Java 数据库连接
SpringBoot集成Flowable:打造强大的工作流管理系统
在企业级应用开发中,工作流管理是一个核心组件,它能够帮助我们定义、执行和管理业务流程。Flowable是一个开源的工作流和业务流程管理(BPM)平台,它提供了强大的工作流引擎和建模工具。结合SpringBoot,我们可以快速构建一个高效、灵活的工作流管理系统。本文将探讨如何将Flowable集成到SpringBoot应用中,并展示其强大的功能。
485 1
|
2月前
|
消息中间件 监控 Java
您是否已集成 Spring Boot 与 ActiveMQ?
您是否已集成 Spring Boot 与 ActiveMQ?
66 0
|
2月前
|
JavaScript Java 项目管理
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。
|
2月前
|
JSON Java API
springboot集成ElasticSearch使用completion实现补全功能
springboot集成ElasticSearch使用completion实现补全功能
53 1
|
3月前
|
存储 安全 Java
打造智能合同管理系统:SpringBoot与电子签章的完美融合
【10月更文挑战第7天】 在数字化转型的浪潮中,电子合同管理系统因其高效、环保和安全的特点,正逐渐成为企业合同管理的新宠。本文将分享如何利用SpringBoot框架实现一个集电子文件签字与合同管理于一体的智能系统,探索技术如何助力合同管理的现代化。
158 4
|
3月前
|
前端开发 Java Apache
SpringBoot实现电子文件签字+合同系统!
【10月更文挑战第15天】 在现代企业运营中,合同管理和电子文件签字成为了日常活动中不可或缺的一部分。随着技术的发展,电子合同系统因其高效性、安全性和环保性,逐渐取代了传统的纸质合同。本文将详细介绍如何使用SpringBoot框架实现一个电子文件签字和合同管理系统。
178 1

热门文章

最新文章