如果这个项目让你有所收获,记得 Star 关注哦,这对我是非常不错的鼓励与支持。
源码地址(后端):https://gitee.com/csps/mingyue-springcloud-learning
源码地址(前端):https://gitee.com/csps/mingyue-springcloud-ui
文档地址:https://gitee.com/csps/mingyue-springcloud-learning/wikis
https://blog.csdn.net/csp732171109/article/details/124413138
参考 mingyue/docker/elk 目录结构,以及 mingyue/docker/docker-compose.yml 部署 ELK
version: '3.8'
services:
mingyue-elasticsearch:
image: elasticsearch:7.17.7
container_name: mingyue-elasticsearch
ports:
- "9200:9200"
- "9300:9300"
environment:
# 设置集群名称
cluster.name: elasticsearch
# 以单一节点模式启动
discovery.type: single-node
ES_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/logs
mingyue-kibana:
image: kibana:7.17.7
container_name: mingyue-kibana
ports:
- "5601:5601"
depends_on:
# kibana在elasticsearch启动之后再启动
- mingyue-elasticsearch
environment:
#设置系统语言文中文
I18N_LOCALE: zh-CN
# 访问域名
# SERVER_PUBLICBASEURL: https://kibana.cloud.com
volumes:
- ./elk/kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml
links:
- mingyue-elasticsearch:es #可以用es这个域名访问elasticsearch服务
mingyue-logstash:
image: logstash:7.17.7
container_name: mingyue-logstash
ports:
- "4560:4560"
volumes:
- ./elk/logstash/pipeline/logstash.conf:/usr/share/logstash/pipeline/logstash.conf
- ./elk/logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml
depends_on:
- mingyue-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"
}
Easy-Es(简称EE)是一款基于 ElasticSearch(简称Es)官方提供的 RestHighLevelClient 打造的 ORM 开发框架,在 RestHighLevelClient 的基础上,只做增强不做改变,为简化开发、提高效率而生,您如果有用过 Mybatis-Plus(简称MP),那么您基本可以零学习成本直接上手EE,EE 是 MP 的 Es 平替版,在有些方面甚至比 MP 更简单,同时也融入了更多 Es 独有的功能,助力您快速实现各种场景的开发。
新建模块 mingyue-common-es
<dependencies>
<dependency>
<groupId>cn.easy-esgroupId>
<artifactId>easy-es-boot-starterartifactId>
dependency>
dependencies>
@AutoConfiguration
@ConditionalOnProperty(value = "easy-es.enable", havingValue = "true")
@EsMapperScan("com.csp.mingyue.**.esmapper")
public class EasyEsConfiguration {
}
com.csp.mingyue.common.config.EasyEsConfiguration
新建模块 mingyue-search
、mingyue-search-api
、mingyue-search-biz
mingyue-search-biz
引入mingyue-common-es
模块
<dependencies>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
dependency>
<dependency>
<groupId>com.csp.mingyuegroupId>
<artifactId>mingyue-common-webartifactId>
dependency>
<dependency>
<groupId>com.csp.mingyuegroupId>
<artifactId>mingyue-common-docartifactId>
dependency>
<dependency>
<groupId>com.csp.mingyuegroupId>
<artifactId>mingyue-common-securityartifactId>
dependency>
<dependency>
<groupId>com.csp.mingyuegroupId>
<artifactId>mingyue-search-apiartifactId>
dependency>
<dependency>
<groupId>com.csp.mingyuegroupId>
<artifactId>mingyue-common-esartifactId>
dependency>
dependencies>
public interface DocumentMapper extends BaseEsMapper<Document> {
}
# 端口
server:
port: 7400
spring:
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
新建 mingyue-search-biz.yml nacos 配置
# 搜索服务配置
easy-es:
# 是否开启EE自动配置
enable: true
# es连接地址+端口 格式必须为ip:port,如果是集群则可用逗号隔开
address : mingyue-es:9200
# 默认为http
schema: http
# 注意ES建议使用账号认证 不使用会报警告日志
# 如果无账号密码则不配置此行
#username:
# 如果无账号密码则不配置此行
#password:
# 心跳策略时间 单位:ms
keep-alive-millis: 18000
# 连接超时时间 单位:ms
connectTimeout: 5000
# 通信超时时间 单位:ms
socketTimeout: 5000
# 请求超时时间 单位:ms
requestTimeout: 5000
# 连接请求超时时间 单位:ms
connectionRequestTimeout: 5000
# 最大连接数 单位:个
maxConnTotal: 100
# 最大连接路由数 单位:个
maxConnPerRoute: 100
global-config:
# 开启控制台打印通过本框架生成的DSL语句,默认为开启,生产环境建议关闭,以提升少量性能
print-dsl: true
# 异步处理索引是否阻塞主线程 默认阻塞 数据量过大时调整为非阻塞异步进行 项目启动更快
asyncProcessIndexBlocking: true
db-config:
# 是否开启下划线转驼峰 默认为false
map-underscore-to-camel-case: true
# id生成策略 customize为自定义,id值由用户生成,比如取MySQL中的数据id,如缺省此项配置,则id默认策略为es自动生成
id-type: customize
# 字段更新策略 默认为not_null
field-strategy: not_null
# 默认开启,查询若指定了size超过1w条时也会自动开启,开启后查询所有匹配数据,若不开启,会导致无法获取数据总条数,其它功能不受影响.
enable-track-total-hits: true
# 数据刷新策略,默认为不刷新
refresh-policy: immediate
# 是否全局开启must查询类型转换为filter查询类型 默认为false不转换
enable-must2-filter: false
断言通过即可
@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 服务的增删改查,完善服务。