1.部署环境
(1)从ruoyi-cloud-plus中拷贝docker下的elk文件夹到docker目录下,记得给权限777
(2)运行使用docker-compose.yml运行,(logstash可选)
version: '3'
services:
elasticsearch:
image: elasticsearch:7.17.6
container_name: elasticsearch
ports:
- "9200:9200"
- "9300:9300"
environment:
# 设置集群名称
cluster.name: elasticsearch
# 以单一节点模式启动
discovery.type: single-node
ES_JAVA_OPTS: "-Xms512m -Xmx512m"
volumes:
- /docker/elk/elasticsearch/plugins:/usr/share/elasticsearch/plugins
- /docker/elk/elasticsearch/data:/usr/share/elasticsearch/data
- /docker/elk/elasticsearch/logs:/usr/share/elasticsearch/logs
network_mode: "host"
kibana:
image: kibana:7.17.6
container_name: kibana
ports:
- "5601:5601"
depends_on:
# kibana在elasticsearch启动之后再启动
- elasticsearch
environment:
#设置系统语言文中文
I18N_LOCALE: zh-CN
# 访问域名
# SERVER_PUBLICBASEURL: https://kibana.cloud.com
volumes:
- /docker/elk/kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml
network_mode: "host"
logstash:
image: logstash:7.17.6
container_name: logstash
ports:
- "4560:4560"
volumes:
- /docker/elk/logstash/pipeline/logstash.conf:/usr/share/logstash/pipeline/logstash.conf
- /docker/elk/logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml
depends_on:
- elasticsearch
network_mode: "host"
(3)验证discover面板 ip:5601
(4)验证es是否成功ip:9200
2.测试
(1)结构
(2)编写配置文件,记得把ip改为部署的ip
easy-es:
# 是否开启EE自动配置
enable: true
# es连接地址+端口 格式必须为ip:port,如果是集群则可用逗号隔开
address : ip: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
(3)编写实体类
package com.ruoyi.demo.domain;
import lombok.Data;
/**
* 文档实体
*/
@Data
public class Document {
/**
* es中的唯一id
*/
private String id;
/**
* 文档标题
*/
private String title;
/**
* 文档内容
*/
private String content;
}
(4)创建mapper
package com.ruoyi.demo.esmapper;
import cn.easyes.core.conditions.interfaces.BaseEsMapper;
import com.ruoyi.demo.domain.Document;
public interface DocumentMapper extends BaseEsMapper<Document> {
}
(5)测试类依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>ruoyi-extend</artifactId>
<groupId>com.ruoyi</groupId>
<version>4.8.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>ruoyi-test</artifactId>
<dependencies>
<dependency>
<groupId>cn.easy-es</groupId>
<artifactId>easy-es-boot-starter</artifactId>
</dependency>
<!-- SpringBoot Web容器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<artifactId>spring-boot-starter-tomcat</artifactId>
<groupId>org.springframework.boot</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
(6)测试类:注意此测试文件的路径必须和上面的java主路径相同
package com.ruoyi.demo;
import cn.easyes.core.conditions.LambdaEsQueryWrapper;
import cn.easyes.core.toolkit.EsWrappers;
import com.ruoyi.demo.domain.Document;
import com.ruoyi.demo.esmapper.DocumentMapper;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import javax.annotation.Resource;
import java.util.List;
@SpringBootTest
public class TestEs {
@Resource
private DocumentMapper documentMapper;
/**
* 测试创建索引库
*/
@org.junit.jupiter.api.Test
public void testCreateIndex() {
//创建索引,根据当前mapper对应实体类信息及其注解配置生成索引信息
Boolean success = documentMapper.createIndex("cccccc");
System.out.println(success ? "创建索引成功" : "创建索引失败");
}
@org.junit.jupiter.api.Test
public void testInsert() {
// 测试插入数据
Document document = new Document();
document.setId("1");
document.setTitle("老汉");
document.setContent("推*技术过硬");
int successCount = documentMapper.insert(document);
System.out.println(successCount);
}
@org.junit.jupiter.api.Test
public void testSelect() {
// 测试查询 写法和MP一样 可以用链式,也可以非链式 根据使用习惯灵活选择即可
String title = "老汉";
LambdaEsQueryWrapper<Document> limit = EsWrappers.lambdaQuery(Document.class)
.eq(Document::getTitle, title);
Document document = documentMapper.selectOne(limit);
System.out.println(document);
// Assert.doesNotContain(title, document.getTitle());
}
@org.junit.jupiter.api.Test
public void testUpdate() {
// 测试更新 更新有两种情况 分别演示如下:
// case1: 已知id, 根据id更新 (为了演示方便,此id是从上一步查询中复制过来的,实际业务可以自行查询)
String id = "1";
String title1 = "隔壁老王22222";
Document document1 = new Document();
document1.setId(id);
document1.setTitle(title1);
documentMapper.updateById(document1);
//
// // case2: id未知, 根据条件更新
// LambdaEsUpdateWrapper<Document> wrapper = new LambdaEsUpdateWrapper<>();
// wrapper.eq(Document::getTitle,title1);
// Document document2 = new Document();
// document2.setTitle("隔壁老李");
// document2.setContent("推*技术过软");
// documentMapper.update(document2,wrapper);
// 关于case2 还有另一种省略实体的简单写法,这里不演示,后面章节有介绍,语法与MP一致
}
@org.junit.jupiter.api.Test
public void testDelete() {
// 测试删除数据 删除有两种情况:根据id删或根据条件删
// 鉴于根据id删过于简单,这里仅演示根据条件删,以老李的名义删,让老李心理平衡些
LambdaEsQueryWrapper<Document> wrapper = new LambdaEsQueryWrapper<>();
String title = "隔壁老王22222";
wrapper.eq(Document::getTitle,title);
int successCount = documentMapper.delete(wrapper);
System.out.println(successCount);
}
@Test
public void testMatch(){
// 会对输入做分词,只要所有分词中有一个词在内容中有匹配就会查询出该数据,无视分词顺序
LambdaEsQueryWrapper<Document> wrapper = new LambdaEsQueryWrapper<>();
wrapper.like(Document::getContent,"过");
List<Document> documents = documentMapper.selectList(wrapper);
System.out.println(documents);
}
}
3.实际使用:直接在要使用的模块添加elasticsearch模块
(1)新增一个模块,也可以就直接放在common里面,结构如下:
(2)添加依赖
<dependency>
<groupId>cn.easy-es</groupId>
<artifactId>easy-es-boot-starter</artifactId>
</dependency>
(3) 其他配置
package com.ruoyi.config;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.env.EnvironmentPostProcessor;
import org.springframework.core.Ordered;
import org.springframework.core.env.ConfigurableEnvironment;
/**
* 健康检查配置注入
*
* @author
*/
public class ActuatorEnvironmentPostProcessor implements EnvironmentPostProcessor, Ordered {
@Override
public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
System.setProperty("management.health.elasticsearch.enabled", "false");
}
@Override
public int getOrder() {
return Ordered.HIGHEST_PRECEDENCE;
}
}
package com.ruoyi.config;
import cn.easyes.starter.register.EsMapperScan;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
/**
* easy-es 配置
*
* @author
*/
@AutoConfiguration
@ConditionalOnProperty(value = "easy-es.enable", havingValue = "true")
@EsMapperScan("com.ruoyi.**.esmapper")
public class EasyEsConfiguration {
}
com.ruoyi.config.EasyEsConfiguration
org.springframework.boot.env.EnvironmentPostProcessor=\
com.ruoyi.config.ActuatorEnvironmentPostProcessor
(4)模块引用
最后就是按照测试类一样,编写对应的esmapper,指向对应的实体类
注意改一下前面EasyEsConfiguration的扫包路径,在插入es数据的时候会自动使用实体类的名称做索引,其他的操作可以参考下面的链接
www.easy-es.cn