027-从零搭建微服务-搜索服务(一)

写在最前

如果这个项目让你有所收获,记得 Star 关注哦,这对我是非常不错的鼓励与支持。

源码地址(后端):https://gitee.com/csps/mingyue

源码地址(前端):https://gitee.com/csps/mingyue-ui

文档地址:https://gitee.com/csps/mingyue/wikis

搭建 ELK 环境

Docker 安装 ELK 7.17.2

https://blog.csdn.net/csp732171109/article/details/124413138

Docker 安装 ELK 7.17.7

参考 mingyue/docker/elk 目录结构,以及 mingyue/docker/docker-compose.yml 部署 ELK

version: '3.8'
services:mingyue-elasticsearch:image: elasticsearch:7.17.7container_name: mingyue-elasticsearchports:- "9200:9200"- "9300:9300"environment:# 设置集群名称cluster.name: elasticsearch# 以单一节点模式启动discovery.type: single-nodeES_JAVA_OPTS: "-Xms512m -Xmx512m"volumes:- ./elk/elasticsearch/plugins:/usr/share/elasticsearch/plugins- ./elk/elasticsearch/data:/usr/share/elasticsearch/data- ./elk/elasticsearch/logs:/usr/share/elasticsearch/logsmingyue-kibana:image: kibana:7.17.7container_name: mingyue-kibanaports:- "5601:5601"depends_on:# kibana在elasticsearch启动之后再启动- mingyue-elasticsearchenvironment:#设置系统语言文中文I18N_LOCALE: zh-CN# 访问域名# SERVER_PUBLICBASEURL: https://kibana.cloud.comvolumes:- ./elk/kibana/config/kibana.yml:/usr/share/kibana/config/kibana.ymllinks:- mingyue-elasticsearch:es #可以用es这个域名访问elasticsearch服务mingyue-logstash:image: logstash:7.17.7container_name: mingyue-logstashports:- "4560:4560"volumes:- ./elk/logstash/pipeline/logstash.conf:/usr/share/logstash/pipeline/logstash.conf- ./elk/logstash/config/logstash.yml:/usr/share/logstash/config/logstash.ymldepends_on:- mingyue-elasticsearch

测试环境

  • Elasticsearch

访问:http://esIP:9200/

见到如下打印即可

{"name": "1cc13d88bfe7","cluster_name": "elasticsearch","cluster_uuid": "1vZhSxDGTA-oJd-IlqZjWQ","version": {"number": "7.17.7","build_flavor": "default","build_type": "docker","build_hash": "78dcaaa8cee33438b91eca7f5c7f56a70fec9e80","build_date": "2022-10-17T15:29:54.167373105Z","build_snapshot": false,"lucene_version": "8.11.1","minimum_wire_compatibility_version": "6.8.0","minimum_index_compatibility_version": "6.0.0-beta1"},"tagline": "You Know, for Search"
}
  • Kibana
    • 访问首页可以打开即可:http://esIP:5601/app/home#/

Easy-Es

Easy-Es(简称EE)是一款基于 ElasticSearch(简称Es)官方提供的 RestHighLevelClient 打造的 ORM 开发框架,在 RestHighLevelClient 的基础上,只做增强不做改变,为简化开发、提高效率而生,您如果有用过 Mybatis-Plus(简称MP),那么您基本可以零学习成本直接上手EE,EE 是 MP 的 Es 平替版,在有些方面甚至比 MP 更简单,同时也融入了更多 Es 独有的功能,助力您快速实现各种场景的开发。

框架架构

优势

  • 全自动索引托管: 全球开源首创的索引托管模式,开发者无需关心索引的创建更新及数据迁移等繁琐步骤,索引全生命周期皆可托管给框架,由框架自动完成,过程零停机,用户无感知,彻底解放开发者
  • 智能字段类型推断: 根据索引类型和当前查询类型上下文综合智能判断当前查询是否需要拼接.keyword 后缀,减少小白误用的可能
  • 屏蔽语言差异: 开发者只需要会 MySQL 语法即可使用 Es,真正做到一通百通,无需学习枯燥易忘的 Es 语法,Es 使用相对 MySQL 较低频,学了长期不用也会忘,没必要浪费这时间.开发就应该专注于业务,省下的时间去撸铁,去陪女朋友陪家人,不做资本家的韭菜
  • 代码量极少: 与直接使用 RestHighLevelClient 相比,相同的查询平均可以节省3-5倍左右的代码量
  • 零魔法值: 字段名称直接从实体中获取,无需输入字段名称字符串这种魔法值,提高代码可读性,杜绝因字段名称修改而代码漏改带来的Bug
  • 零额外学习成本: 开发者只要会国内最受欢迎的 Mybatis-Plus 语法,即可无缝迁移至EE,EE采用和前者相同的语法,消除使用者额外学习成本,直接上手,爽
  • 降低开发者门槛: Es 通常需要中高级开发者才能驾驭,但通过接入 EE,即便是只了解 ES 基础的初学者也可以轻松驾驭 ES 完成绝大多数需求的开发,可以提高人员利用率,降低企业成本

特性

  • 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
  • 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
  • 强大的 CRUD 操作:内置通用 Mapper,仅仅通过少量配置即可实现大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
  • 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错段
  • 支持主键自动生成:支持2 种主键策略,可自由配置,完美解决主键问题
  • 支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
  • 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
  • 内置分页插件:基于RestHighLevelClient 物理分页,开发者无需关心具体操作,且无需额外配置插件,写分页等同于普通 List 查询,且保持和PageHelper插件同样的分页返回字段,无需担心命名影响
  • MySQL功能全覆盖:MySQL中支持的功能通过EE都可以轻松实现
  • 支持ES高阶语法:支持高亮搜索,分词查询,权重查询,Geo地理位置查询,IP查询,聚合查询等高阶语法
  • 良好的拓展性:底层仍使用RestHighLevelClient,可保持其拓展性,开发者在使用EE的同时,仍可使用RestHighLevelClient的功能

集成 Easy-Es

新建模块 mingyue-common-es

引入依赖

<dependencies><dependency><groupId>cn.easy-es</groupId><artifactId>easy-es-boot-starter</artifactId></dependency>
</dependencies>

添加 Easy-Es 配置

@AutoConfiguration
@ConditionalOnProperty(value = "easy-es.enable", havingValue = "true")
@EsMapperScan("com.csp.mingyue.**.esmapper")
public class EasyEsConfiguration {}

自动注入

com.csp.mingyue.common.config.EasyEsConfiguration

搜索服务

新建模块 mingyue-searchmingyue-search-apimingyue-search-biz

引入依赖

mingyue-search-biz 引入 mingyue-common-es 模块

<dependencies><!-- SpringCloud Alibaba Nacos --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!-- SpringCloud Alibaba Nacos Config --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><!-- web容器 --><dependency><groupId>com.csp.mingyue</groupId><artifactId>mingyue-common-web</artifactId></dependency><!-- 接口文档 --><dependency><groupId>com.csp.mingyue</groupId><artifactId>mingyue-common-doc</artifactId></dependency><!-- 认证工具类 --><dependency><groupId>com.csp.mingyue</groupId><artifactId>mingyue-common-security</artifactId></dependency><dependency><groupId>com.csp.mingyue</groupId><artifactId>mingyue-search-api</artifactId></dependency><!-- ES 搜索依赖 --><dependency><groupId>com.csp.mingyue</groupId><artifactId>mingyue-common-es</artifactId></dependency>
</dependencies>

添加 Document Mapper

public interface DocumentMapper extends BaseEsMapper<Document> {
}

添加 application.yml

# 端口
server:port: 7400spring:application:name: @artifactId@profiles:# 环境配置active: @profiles.active@cloud:nacos:# nacos 服务地址server-addr: @nacos.server@username: @nacos.username@password: @nacos.password@discovery:# 注册组group: @nacos.discovery.group@namespace: ${spring.profiles.active}config:# 配置组group: @nacos.config.group@namespace: ${spring.profiles.active}config:import:- optional:nacos:application-common.yml- optional:nacos:${spring.application.name}.yml

Nacos 配置添加

新建 mingyue-search-biz.yml nacos 配置

# 搜索服务配置
easy-es:# 是否开启EE自动配置enable: true# es连接地址+端口 格式必须为ip:port,如果是集群则可用逗号隔开address : mingyue-es:9200# 默认为httpschema: http# 注意ES建议使用账号认证 不使用会报警告日志# 如果无账号密码则不配置此行#username:# 如果无账号密码则不配置此行#password:# 心跳策略时间 单位:mskeep-alive-millis: 18000# 连接超时时间 单位:msconnectTimeout: 5000# 通信超时时间 单位:mssocketTimeout: 5000# 请求超时时间 单位:msrequestTimeout: 5000# 连接请求超时时间 单位:msconnectionRequestTimeout: 5000# 最大连接数 单位:个maxConnTotal: 100# 最大连接路由数 单位:个maxConnPerRoute: 100global-config:# 开启控制台打印通过本框架生成的DSL语句,默认为开启,生产环境建议关闭,以提升少量性能print-dsl: true# 异步处理索引是否阻塞主线程 默认阻塞 数据量过大时调整为非阻塞异步进行 项目启动更快asyncProcessIndexBlocking: truedb-config:# 是否开启下划线转驼峰 默认为falsemap-underscore-to-camel-case: true# id生成策略 customize为自定义,id值由用户生成,比如取MySQL中的数据id,如缺省此项配置,则id默认策略为es自动生成id-type: customize# 字段更新策略 默认为not_nullfield-strategy: not_null# 默认开启,查询若指定了size超过1w条时也会自动开启,开启后查询所有匹配数据,若不开启,会导致无法获取数据总条数,其它功能不受影响.enable-track-total-hits: true# 数据刷新策略,默认为不刷新refresh-policy: immediate# 是否全局开启must查询类型转换为filter查询类型 默认为false不转换enable-must2-filter: false

单元测试测试 Easy-Es Api

测试新增

断言通过即可

@DisplayName("测试新增一条数据")
@Test
public void testTest() {// 测试插入数据Document document = new Document();document.setId("1");document.setTitle("登高");document.setContent("风急天高猿啸哀,渚清沙白鸟飞回。");Assertions.assertTrue(documentMapper.insert(document) > 0);
}

测试查询

断言通过即可

@DisplayName("测试查询一条数据")
@Test
public void testSelect() {// 测试查询 写法和MP一样 可以用链式,也可以非链式 根据使用习惯灵活选择即可String title = "登高";LambdaEsQueryWrapper<Document> wrapper = new LambdaEsQueryWrapper<>();wrapper.like(Document::getTitle, title);Document document = documentMapper.selectOne(wrapper);Assertions.assertEquals(title, document.getTitle());
}

执行日志如下:

2023-09-19 15:22:10.708  INFO 43316 --- [           main] easy-es                                  : ===> Execute By Easy-Es: 
index-name: document
DSL:{"size":10000,"query":{"bool":{"must":[{"wildcard":{"title":{"wildcard":"*登高*","boost":1.0}}}],"adjust_pure_negative":true,"boost":1.0}},"track_total_hits":2147483647}

测试更新

断言通过即可

@DisplayName("测试更新一条数据")
@Test
public void testUpdateById() {// 测试更新 更新有两种情况 1.已知id, 根据id更新;2.id未知, 根据条件更新Document document = new Document();document.setId("1");document.setContent("风急天高猿啸哀,渚清沙白鸟飞回。无边落木萧萧下,不尽长江滚滚来。");Assertions.assertTrue(documentMapper.updateById(document) > 0);
}

测试删除

断言通过即可

@DisplayName("测试删除一条数据")
@Test
public void testDeleteById() {// 测试删除数据 删除有两种情况:根据id删或根据条件删Assertions.assertTrue(documentMapper.deleteById("1") > 0);
}

小结

现在通过单元测试打通了代码与 Elasticsearch 服务,完成了增删改查。接下来通过接口的方式来支持代码对 Elasticsearch 服务的增删改查,完善服务。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/82858.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

理解QT信号和槽

进入QT官网&#xff0c;注册&#xff0c;创建账号&#xff0c;登录&#xff1b; 下载在线安装程序&#xff1b;10天试用版本&#xff1b;安装&#xff1b;完成后如下&#xff1b; 新建一个widgets项目&#xff0c;也就是桌面的窗口应用&#xff1b; 按向导新建完成项目&#x…

【云原生】k8s-----集群调度

目录 1.k8s的list-watch机制 1.1 list-watc机制简介 1.2 根据list-watch机制&#xff0c;pod的创建流程 2.scheduler的调度策略 2.1 scheduler的调度策略简介 2.2 Scheduler预选策略的算法 2.3 Scheduler优选策略的算法 3. k8s中的标签管理及nodeSelector和nodeName的 调…

Hadoop的HDFS高可用方案

一、Hadoop高可用简介 Hadoop 高可用 (High Availability) 分为 HDFS 高可用和 YARN 高可用&#xff0c;两者的实现基本类似&#xff0c;但 HDFSNameNode 对数据存储及其一致性的要求比 YARN ResourceManger 高得多&#xff0c;所以它的实现也更加复杂 1、HDFS系统高可用简介…

八大排序(二)--------冒泡排序

本专栏内容为&#xff1a;八大排序汇总 通过本专栏的深入学习&#xff0c;你可以了解并掌握八大排序以及相关的排序算法。 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;八大排序汇总 &#x1f69a;代码仓库&#xff1a;小小unicorn的代码仓库…

Mac cocoapod 3分钟安装教程( 国内镜像源方法)

参考链接&#xff1a;2023最新总结&#xff0c;Mac下使用Homebrew完全指南&#xff01; - 知乎 1.打开终端&#xff0c; 执行&#xff1a; /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" 2.运行&#xff0c;可以选择清…

Java多线程篇(3)——线程池

文章目录 线程池ThreadPoolExecutor源码分析1、如何提交任务2、如何执行任务3、如何停止过期的非核心线程4、如何使用拒绝策略 ScheduledThreadPoolExecutor源码分析 线程池 快速过一遍基础知识 7大参数 corePoolSize &#xff1a; 核心线程数 maximumPoolSize&#xff1a; 最…

Java基于SpringBoot的藏区特产销售系统的研究与实现

今天为大家带来的是基于 Java SpringBootVue 的藏区特产销售系统&#xff0c;大家有兴趣的可以看一下 博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W,Csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 文章目…

提升效率,实现组织与创造的完美结合——Agenda for Mac

现代快节奏的生活中&#xff0c;时间管理和任务协调变得尤为关键。如果您正在寻找一个功能全面、简洁易用的日历、任务和笔记管理工具&#xff0c;那么Agenda for Mac定会成为您的得力助手。这款强大的应用程序将帮助您提高工作效率&#xff0c;实现组织与创造的完美结合。 Ag…

北邮22级信通院数电:Verilog-FPGA(2)modelsim北邮信通专属下载、破解教程

北邮22信通一枚~ 跟随课程进度更新北邮信通院数字系统设计的笔记、代码和文章 持续关注作者 迎接数电实验学习~ 获取更多文章&#xff0c;请访问专栏&#xff1a; 北邮22级信通院数电实验_青山如墨雨如画的博客-CSDN博客 目录 1.下载 2.解压打开 3.modelsim初安装 4.…

Java代码质量评估工具

概述 Java代码的质量评估主要包括代码的可维护性、健壮性、以及在运行时能达到既定的性能目标&#xff0c;可维护性主要包括代码的可读性、在关键的代码上提供详细注释、在设计类、方法以及代码逻辑时符合设定的编码规范&#xff0c;健壮性主要包括编写代码时应使用常用的设计…

k8s(Kubernetes)集群部署--使用 kubeadm方式部署

k8s集群部署--使用 kubeadm方式部署 一、测试所需环境&#xff08;三台均要执行&#xff09;二、配置准备&#xff08;三台均要执行&#xff09;1. 重命名hostname、添加hosts2. 关闭防火墙、selinux与swap3. 添加网桥过滤及内核转发配置文件4.同步时间5.安装ipset及ipvsadm 三…

Mysql002:(库和表)操作SQL语句

目录&#xff1a; 》SQL通用规则说明 SQL分类&#xff1a; 》DDL&#xff08;数据定义&#xff1a;用于操作数据库、表、字段&#xff09; 》DML&#xff08;数据编辑&#xff1a;用于对表中的数据进行增删改&#xff09; 》DQL&#xff08;数据查询&#xff1a;用于对表中的数…

【Verilog教程】2.3 Verilog 数据类型

Verilog 最常用的 2 种数据类型就是线网&#xff08;wire&#xff09;与寄存器&#xff08;reg&#xff09;&#xff0c;其余类型可以理解为这两种数据类型的扩展或辅助。 线网&#xff08;wire&#xff09; wire 类型表示硬件单元之间的物理连线&#xff0c;由其连接的器件输…

十分钟理解OSPF路由协议

十分钟理解OSPF路由协议 1.RIP的缺陷以跳数为度量值最大跳数为15更新路由表采用全更新收敛速度慢 2.RIP与OSPF比较OSPF概述运行OSPF协议之前运行OSPF协议之后 3.OSPF协议工作过程1.发现邻居2.建立邻接关系3.传递链路状态信息4.计算路由 4.OSPF分区域管理 有RIP协议&#xff0c;…

Visual Studio Code配置开发Maven项目、Spring Boot项目

配置开发Maven项目、Spring Boot项目 配置全局配置项目配置注意 Maven项目开发安装插件创建项目启动项目 Spring Boot项目开发安装插件创建项目启动项目 其他插件 配置 全局配置 ctrlshiftp打开搜索setting.json&#xff0c;这个setting.json配置属于全局配置 配置全局的Java与…

Python配置与测试利器:Hydra + pytest的完美结合

简介&#xff1a;Hydra 和 pytest 可以一起使用&#xff0c;基于 Hydra Pytest 的应用可以轻松地管理复杂配置&#xff0c;并编写参数化的单元测试&#xff0c;使得Python开发和测试将变得更为高效。 安装&#xff1a; pip install hydra-core pytest案例源码&#xff1a;my…

毕业设计|基于stm32单片机的app视频遥控抽水灭火小车设计

基于stm32单片机的app视频遥控抽水灭火水泵小车设计 1、项目简介1.1 系统构成1.2 系统功能 2、部分电路设计2.1 L298N电机驱动电路设计2.2 继电器控制电路设计 3、部分代码展示3.1 小车控制代码3.1 水泵控制代码 4 演示视频及代码资料获取 1、项目简介 视频简介中包含资料http…

用selenium和xpath定位元素并获取属性值以及str字符型转json型

页面html如图所示&#xff1a; 要使用xpath定位这个div元素&#xff0c;并且获取其属性data-config的内容值。 from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.chrome.options import Optionshost127.0.0.1 port10808 …

(图论) 1020. 飞地的数量 ——【Leetcode每日一题】

❓ 1020. 飞地的数量 难度&#xff1a;中等 给你一个大小为 m x n 的二进制矩阵 grid &#xff0c;其中 0 表示一个 海洋单元格、1 表示一个 陆地单元格。 一次 移动 是指从一个陆地单元格走到另一个相邻&#xff08;上、下、左、右&#xff09;的陆地单元格或跨过 grid 的边…

python基础语法(四)

感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接 &#x1f412;&#x1f412;&#x1f412;个人主页 &#x1f978;&#x1f978;&#x1f978;C语言 &#x1f43f;️&#x1f43f;️&#x1f43f;️C语言例题 &#x1f423;&#x1f413;&#x1f3c0;python 这…