使用了ElasticSearch之后,公司系统查询速度快了50倍,工资直接翻一倍

本文涉及的产品
Elasticsearch Serverless通用抵扣包,测试体验金 200元
简介: 使用了ElasticSearch之后,公司系统查询速度快了50倍,工资直接翻一倍

公司的OA系统在查询我发起的流程的功能的时候需要从Activiti的表中去查询数据的

e8c0e8fd83434f3ba7011309a223f8e9.png


这就会导致一个问题,当数据量越来越大的时候,我们的接口的响应速度就会越来越慢

92fd323675864408972e603b38e93eaf.png

所以我打算重写一下公司的查询流程功能,并且给它来一次系统大升级:可以全文搜索关键字。所以我选择使用了ElasticSearch这个搜索引擎,之前也写过几篇相关于ES的文章,大家可以去看一下:


新年第一天,老板让升级ElasticSearch版本,我说得加钱


同事说关键字查询用Mysql,我上去就是一个高压锅,用ElasticSearch不香吗?


ElasticSearch对标Mysql,谁能拔得头筹?


其实调用es的方法有很多,其中es就提供了java相关的api去使用,但是我这里选择的是使用http的原始方式去操作es。

这里又可以分为几种方式,自己使用原生的http去封装成一个工具类去使用,还有一种如果你们公司用的是SpringCloud的话,就可以使用他的组件Feign去调用es,这样也会更优雅,更高级一点(其实也没有)

@FeignClient(name = "EIP-MAPP-SEARCH-SERVER", url = "${elsearch.url}", fallbackFactory = ElasticHystrix.class)
public interface ElasticSearchApi {
    @PostMapping("/{index}/_doc/{id}")
    Object insertData(@PathVariable(name = "index") String index, @PathVariable(name = "id") String id, @RequestBody JSONObject jsonObject);
    @GetMapping("/{index}/_search")
    Object indexSearch(@PathVariable(name = "index") String index, @RequestBody JSONObject jsonObject);
    @GetMapping("/{aliases}/_search")
    Object aliasesSearch(@PathVariable(name = "aliases") String aliases, @RequestBody JSONObject jsonObject);
    @PutMapping("/{index}")
    Object insertAliases(@PathVariable(name = "index") String index, @RequestBody JSONObject jsonObject);
    @RequestMapping(value = "/{index}",method = RequestMethod.HEAD)
    Object checkIndex(@PathVariable(name = "index") String index);
    @PostMapping("/{index}/_doc/{id}/_update")
    Object updateData(@PathVariable(name = "index") String index, @PathVariable(name = "id") String id, @RequestBody JSONObject jsonObject);
}

然后在yml的配置文件里面配置好es服务器的地址(这个是可以自定义的)

elsearch:
  process:
    enable: true
  url:
    http://10.123.236.106:9200


如果你不知道安装es,请参考我的安装教程:(保姆式教学)


Linux安装ElasticSearch以及Ik分词器(图文解说详细版)


这里好了之后我们就可以在业务中进行数据的插入了,有了数据之后我们自然可以进行查询,但是由于我这里使用的是JsonObject的方式去作为传参,所以我们在查询的时候就需要把他封装成最原始的参数去传参,就像我下面的两个例子一样


封装方法

 private ResultUtils getResultUtils(PageRequestDTO<OAElasticSearchParamDto> pageRequestDTO, String type, String queryParam) {
        JSONObject jsonObject = getPage(pageRequestDTO);
        //查询参数
        OAElasticSearchParamDto params = pageRequestDTO.getParams();
        String keyWord = params.getKeyWord();
        //提交审批、完成审批时间
        List<ColumnOption> optionList = pageRequestDTO.getOptionList();
        JSONArray timeList = new JSONArray();
        if (!optionList.isEmpty()) {
            timeList = getTimeList(optionList);
        }
        //根据关键字查询
        JSONObject elasticMatch = null;
        if (!StringUtils.isEmpty(keyWord)) {
            elasticMatch = getJsonObject(keyWord, "elasticData", "match");
        }
        //查询我发起的
        UserInfoDTO user = UserUtils.getActiveUser().getUser();
        String userId = user.getPsnCode();
        if ("handledUser".equals(type)) {
            userId = "*" + userId + "*";
        }
        JSONObject myStartMatch = getJsonObject(userId, type, queryParam);
        //任务状态
        return getResultUtils(pageRequestDTO, jsonObject, params, elasticMatch, myStartMatch, timeList);
    }


封装方法

private ResultUtils getResultUtils(PageRequestDTO<OAElasticSearchParamDto> pageRequestDTO, JSONObject jsonObject,
                                       OAElasticSearchParamDto params, JSONObject elasticMatch, JSONObject myHandleJson, JSONArray timeList) {
        String taskStatus = pageRequestDTO.getParams().getTaskStatus();
        //组合查询
        JSONArray mustJsonArray = new JSONArray();
        mustJsonArray.add(elasticMatch);
        mustJsonArray.add(myHandleJson);
        mustJsonArray.addAll(timeList);
        if (!StringUtils.isEmpty(taskStatus)) {
            JSONObject taskStatusMatch = getJsonObject(taskStatus, "taskStatus", "match");
            mustJsonArray.add(taskStatusMatch);
        }
        JSONObject mustJson = new JSONObject();
        mustJson.put("must", mustJsonArray);
        // "bool"封装
        JSONObject boolJson = new JSONObject();
        boolJson.put("bool", mustJson);
        jsonObject.put("query", boolJson);
        //排除返回字段
        JSONObject excludes = new JSONObject();
        excludes.put("excludes", "elasticData");
        jsonObject.put("_source", excludes);
        //微服务名称
        String serveName = params.getServeName();
        Object search = elasticSearchApi.aliasesSearch(serveName, jsonObject);
        return ResultUtils.success(search);
    }


调用方法

@Override
    public ResultUtils myStart(PageRequestDTO<OAElasticSearchParamDto> pageRequestDTO) {
        return getResultUtils(pageRequestDTO, "taskStartUser", "match");
    }
    /**
     * 我的待办
     *
     * @Param: [pageRequestDTO]
     * @return: com.lydsoft.eip.mapp.common.utils.ResultUtils
     * @Author: MaSiyi
     * @Date: 2022/1/26
     */
    @Override
    public ResultUtils myHandling(PageRequestDTO<OAElasticSearchParamDto> pageRequestDTO) {
        return getResultUtils(pageRequestDTO, "assignee", "match");
    }
    /**
     * 我处理的
     *
     * @Param: [pageRequestDTO]
     * @return: com.lydsoft.eip.mapp.common.utils.ResultUtils
     * @Author: MaSiyi
     * @Date: 2022/1/26
     */
    @Override
    public ResultUtils myHandled(PageRequestDTO<OAElasticSearchParamDto> pageRequestDTO) {
        return getResultUtils(pageRequestDTO, "handledUser", "wildcard");
    }

这里再教大家一个小技巧:idea可以抽取重复的代码片段出来组成一个新的方法,所以我们在写代码的时候可以偷一下懒,把抽取方法交给idea去做。


具体的快捷键是Ctrl+Atl+M


使用了es之后,这几个接口就会直接从es里面去查询数据,我们只需要在新建流程的时候将数据同时存到es中就行了。这样速度就会快很多!!


今天就是这篇文章的总结了,如果你从中学到了一些皮毛,也希望鼓励一下博主,给博主一个点赞收藏加关注,就是博主继续创作的最大动力!!!


相关实践学习
以电商场景为例搭建AI语义搜索应用
本实验旨在通过阿里云Elasticsearch结合阿里云搜索开发工作台AI模型服务,构建一个高效、精准的语义搜索系统,模拟电商场景,深入理解AI搜索技术原理并掌握其实现过程。
ElasticSearch 最新快速入门教程
本课程由千锋教育提供。全文搜索的需求非常大。而开源的解决办法Elasricsearch(Elastic)就是一个非常好的工具。目前是全文搜索引擎的首选。本系列教程由浅入深讲解了在CentOS7系统下如何搭建ElasticSearch,如何使用Kibana实现各种方式的搜索并详细分析了搜索的原理,最后讲解了在Java应用中如何集成ElasticSearch并实现搜索。 &nbsp;
相关文章
|
4月前
|
JSON 安全 数据可视化
Elasticsearch(es)在Windows系统上的安装与部署(含Kibana)
Kibana 是 Elastic Stack(原 ELK Stack)中的核心数据可视化工具,主要与 Elasticsearch 配合使用,提供强大的数据探索、分析和展示功能。elasticsearch安装在windows上一般是zip文件,解压到对应目录。文件,elasticsearch8.x以上版本是自动开启安全认证的。kibana安装在windows上一般是zip文件,解压到对应目录。elasticsearch的默认端口是9200,访问。默认用户是elastic,密码需要重置。
1943 0
|
6月前
|
数据采集 JSON 数据挖掘
Elasticsearch 的DSL查询,聚合查询与多维度数据统计
Elasticsearch的DSL查询与聚合查询提供了强大的数据检索和统计分析能力。通过合理构建DSL查询,用户可以高效地搜索数据,并使用聚合查询对数据进行多维度统计分析。在实际应用中,灵活运用这些工具不仅能提高查询效率,还能为数据分析提供深入洞察。理解并掌握这些技术,将显著提升在大数据场景中的分析和处理能力。
295 20
|
11月前
|
存储 JSON 监控
大数据-167 ELK Elasticsearch 详细介绍 特点 分片 查询
大数据-167 ELK Elasticsearch 详细介绍 特点 分片 查询
473 4
|
JSON 自然语言处理 算法
ElasticSearch基础2——DSL查询文档,黑马旅游项目查询功能
DSL查询文档、RestClient查询文档、全文检索查询、精准查询、复合查询、地理坐标查询、分页、排序、高亮、黑马旅游案例
ElasticSearch基础2——DSL查询文档,黑马旅游项目查询功能
|
存储 自然语言处理 关系型数据库
Elasticsearch 查询时 term、match、match_phrase、match_phrase_prefix 的区别
【7月更文挑战第3天】Elasticsearch 查询时 term、match、match_phrase、match_phrase_prefix 的区别
|
11月前
|
自然语言处理 搜索推荐 Java
SpringBoot 搜索引擎 海量数据 Elasticsearch-7 es上手指南 毫秒级查询 包括 版本选型、操作内容、结果截图(一)
SpringBoot 搜索引擎 海量数据 Elasticsearch-7 es上手指南 毫秒级查询 包括 版本选型、操作内容、结果截图
229 0
|
11月前
|
存储 自然语言处理 搜索推荐
SpringBoot 搜索引擎 海量数据 Elasticsearch-7 es上手指南 毫秒级查询 包括 版本选型、操作内容、结果截图(二)
SpringBoot 搜索引擎 海量数据 Elasticsearch-7 es上手指南 毫秒级查询 包括 版本选型、操作内容、结果截图(二)
189 0
|
消息中间件 监控 Kafka
Filebeat+Kafka+Logstash+Elasticsearch+Kibana 构建日志分析系统
【8月更文挑战第13天】Filebeat+Kafka+Logstash+Elasticsearch+Kibana 构建日志分析系统
940 3
|
自然语言处理 Java 关系型数据库
ElasticSearch 实现分词全文检索 - 聚合查询 cardinality
ElasticSearch 实现分词全文检索 - 聚合查询 cardinality
381 1
|
存储 数据库 索引
面试题ES问题之动态映射的定义如何解决
面试题ES问题之动态映射的定义如何解决
126 1