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

2024-02-11 00:30
文章标签 服务 搜索 搭建 027

本文主要是介绍027-从零搭建微服务-搜索服务(一),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

写在最前

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

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

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

文档地址:https://gitee.com/csps/mingyue-springcloud-learning/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 服务的增删改查,完善服务。

这篇关于027-从零搭建微服务-搜索服务(一)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/698384

相关文章

使用Python实现快速搭建本地HTTP服务器

《使用Python实现快速搭建本地HTTP服务器》:本文主要介绍如何使用Python快速搭建本地HTTP服务器,轻松实现一键HTTP文件共享,同时结合二维码技术,让访问更简单,感兴趣的小伙伴可以了... 目录1. 概述2. 快速搭建 HTTP 文件共享服务2.1 核心思路2.2 代码实现2.3 代码解读3.

MySQL双主搭建+keepalived高可用的实现

《MySQL双主搭建+keepalived高可用的实现》本文主要介绍了MySQL双主搭建+keepalived高可用的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、测试环境准备二、主从搭建1.创建复制用户2.创建复制关系3.开启复制,确认复制是否成功4.同

Linux上设置Ollama服务配置(常用环境变量)

《Linux上设置Ollama服务配置(常用环境变量)》本文主要介绍了Linux上设置Ollama服务配置(常用环境变量),Ollama提供了多种环境变量供配置,如调试模式、模型目录等,下面就来介绍一... 目录在 linux 上设置环境变量配置 OllamPOgxSRJfa手动安装安装特定版本查看日志在

SpringCloud之LoadBalancer负载均衡服务调用过程

《SpringCloud之LoadBalancer负载均衡服务调用过程》:本文主要介绍SpringCloud之LoadBalancer负载均衡服务调用过程,具有很好的参考价值,希望对大家有所帮助,... 目录前言一、LoadBalancer是什么?二、使用步骤1、启动consul2、客户端加入依赖3、以服务

使用DeepSeek搭建个人知识库(在笔记本电脑上)

《使用DeepSeek搭建个人知识库(在笔记本电脑上)》本文介绍了如何在笔记本电脑上使用DeepSeek和开源工具搭建个人知识库,通过安装DeepSeek和RAGFlow,并使用CherryStudi... 目录部署环境软件清单安装DeepSeek安装Cherry Studio安装RAGFlow设置知识库总

Linux搭建Mysql主从同步的教程

《Linux搭建Mysql主从同步的教程》:本文主要介绍Linux搭建Mysql主从同步的教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux搭建mysql主从同步1.启动mysql服务2.修改Mysql主库配置文件/etc/my.cnf3.重启主库my

国内环境搭建私有知识问答库踩坑记录(ollama+deepseek+ragflow)

《国内环境搭建私有知识问答库踩坑记录(ollama+deepseek+ragflow)》本文给大家利用deepseek模型搭建私有知识问答库的详细步骤和遇到的问题及解决办法,感兴趣的朋友一起看看吧... 目录1. 第1步大家在安装完ollama后,需要到系统环境变量中添加两个变量2. 第3步 “在cmd中

Python使用DeepSeek进行联网搜索功能详解

《Python使用DeepSeek进行联网搜索功能详解》Python作为一种非常流行的编程语言,结合DeepSeek这一高性能的深度学习工具包,可以方便地处理各种深度学习任务,本文将介绍一下如何使用P... 目录一、环境准备与依赖安装二、DeepSeek简介三、联网搜索与数据集准备四、实践示例:图像分类1.

Nginx配置系统服务&设置环境变量方式

《Nginx配置系统服务&设置环境变量方式》本文介绍了如何将Nginx配置为系统服务并设置环境变量,以便更方便地对Nginx进行操作,通过配置系统服务,可以使用系统命令来启动、停止或重新加载Nginx... 目录1.Nginx操作问题2.配置系统服android务3.设置环境变量总结1.Nginx操作问题

springboot的调度服务与异步服务使用详解

《springboot的调度服务与异步服务使用详解》本文主要介绍了Java的ScheduledExecutorService接口和SpringBoot中如何使用调度线程池,包括核心参数、创建方式、自定... 目录1.调度服务1.1.JDK之ScheduledExecutorService1.2.spring