1. Descripción general de Easy-ES
Easy-Es (EE para abreviar) es un marco ElasticSearch-ORM creado por desarrolladores nacionales y de código completamente abierto. Basado en el RestHighLevelClient nativo, solo se realizan mejoras sin cambios y se crea para simplificar el desarrollo y mejorar la eficiencia. Easy-Es adopta el mismo diseño de sintaxis que MP, lo que reduce el umbral para usar el motor de búsqueda ElasticSearch y los costos de aprendizaje adicionales, también reduce significativamente la carga de trabajo de los desarrolladores y ayuda a las empresas a reducir costos y mejorar la eficiencia. En algunos aspectos, es incluso más simple que MP y también incorpora características más exclusivas de ElasticSearch para ayudarlo a implementar rápidamente el desarrollo de varios escenarios. (También puede entenderse como mp que opera es)
Dirección del sitio web oficial: https://www.easy-es.cn/
Dirección del proyecto: https://gitee.com/dromara/easy-es/
Comunidad de código abierto: https://gitee.com/dromara/
Características EE:
-
No intrusivo : solo se realizan mejoras y no se realizan cambios. Su introducción no afectará a los proyectos existentes y es tan suave como la seda.
-
Baja pérdida : CURD básico se inyectará automáticamente al inicio, básicamente sin pérdida de rendimiento y operación directa orientada a objetos.
-
Potentes operaciones CRUD : Mapper universal incorporado, la mayoría de las operaciones CRUD se pueden implementar con solo una pequeña cantidad de configuración y también existen potentes constructores condicionales para satisfacer diversas necesidades de uso.
-
Admite llamadas de formularios Lambda : a través de expresiones Lambda, puede escribir fácilmente varias condiciones de consulta sin preocuparse por escribir los campos incorrectos.
-
Admite la generación automática de claves primarias : admite 2 estrategias de clave primaria, que se pueden configurar libremente para resolver perfectamente el problema de la clave primaria.
-
Admite el modo ActiveRecord : admite llamadas de formularios ActiveRecord, las clases de entidad solo necesitan heredar la clase Modelo para realizar potentes operaciones CRUD.
-
Admite operaciones universales globales personalizadas : admite inyección de método universal global (escribe una vez, úsalo en cualquier lugar).
-
Complemento de paginación incorporado : basado en la paginación física RestHighLevelClient, los desarrolladores no necesitan preocuparse por operaciones específicas y no es necesario configurar complementos adicionales. Escribir paginación es equivalente a consultas de Lista ordinarias y mantiene la misma paginación. devuelve campos como el complemento PageHelper, sin preocuparse por los efectos de nombres.
-
Cobertura completa de las funciones de MySQL : todas las funciones admitidas en MySQL se pueden implementar fácilmente a través de EE.
-
Admite sintaxis de alto nivel de ES : admite búsqueda destacada, consulta de segmentación de palabras, consulta de peso, consulta de ubicación geográfica, consulta de IP, consulta de agregación y otra sintaxis de alto nivel.
-
Buena escalabilidad : La capa inferior todavía usa RestHighLevelClient, que puede mantener su escalabilidad. Los desarrolladores aún pueden usar las funciones de RestHighLevelClient mientras usan EE.
Estructura marco de EE:
Comparación de las tecnologías EE y Spring Data ES:
2. Inicio rápido con Easy-ES
1. Crea un proyecto maven
2. Introducir dependencias:
<?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">
<modelVersion>4.0.0</modelVersion>
<!-- springboot工程 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.5</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>cn.aopmin</groupId>
<artifactId>EE-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!--es相对稳定版本,esay-es会依赖这个版本的jar包-->
<elasticsearch.version>7.14.0</elasticsearch.version>
</properties>
<dependencies>
<!-- web,排除springboot内置的es依赖,以防和easy-es中的依赖冲突 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
</exclusion>
<exclusion>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- elasticsearch -->
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>${elasticsearch.version}</version>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>${elasticsearch.version}</version>
</dependency>
<!-- easy-es -->
<dependency>
<groupId>org.dromara.easy-es</groupId>
<artifactId>easy-es-boot-starter</artifactId>
<version>2.0.0-beta3</version>
</dependency>
<!-- junit -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<!--打包插件-->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
3. Cree una clase de inicio:
package cn.aopmin;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class EEApplication {
public static void main(String[] args) {
SpringApplication.run(EEApplication.class, args);
}
}
4. Configure easy-es en application.yml:
easy-es:
address: 192.168.150.123:9200
# username: XXXX #如果es无账号密码则可不配置此行
# password: XXXX #如果es无账号密码则可不配置此行
5. Cree una clase de entidad:
package cn.aopmin.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.dromara.easyes.annotation.IndexField;
import org.dromara.easyes.annotation.IndexId;
import org.dromara.easyes.annotation.IndexName;
import org.dromara.easyes.annotation.rely.Analyzer;
import org.dromara.easyes.annotation.rely.FieldType;
import org.dromara.easyes.annotation.rely.IdType;
/**
* ES实体类
*
* @author 白豆五
* @version 2023/07/26
* @since JDK8
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@IndexName("document") // 指定索引名称
public class Document {
/**
* es中的唯一id
*/
@IndexId(type = IdType.CUSTOMIZE) //id生成策略为自定义
private String id;
/**
* 文档标题
*/
@IndexField( fieldType = FieldType.TEXT, analyzer = Analyzer.IK_MAX_WORD, searchAnalyzer = Analyzer.IK_SMART)
private String title;
/**
* 文档内容
*/
@IndexField( fieldType = FieldType.KEYWORD)
private String content;
}
6. Cree una interfaz de mapeador:
package cn.aopmin.mapper;
import cn.aopmin.pojo.Document;
import org.dromara.easyes.core.core.BaseEsMapper;
/**
* Mapper接口
*
* @author 白豆五
* @version 2023/07/26
* @since JDK8
*/
public interface DocumentMapper extends BaseEsMapper<Document> {
}
7. Configure el escaneo de paquetes en la clase de inicio: (@EsMapperScan)
package cn.aopmin;
import org.dromara.easyes.starter.register.EsMapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@EsMapperScan("cn.aopmin.mapper") // 指定Mapper接口所在的包名
@SpringBootApplication
public class EEApplication {
public static void main(String[] args) {
SpringApplication.run(EEApplication.class, args);
}
}
8. Prueba
Ejemplo 1: crear una biblioteca de índice
package cn.aopmin.test;
import cn.aopmin.mapper.DocumentMapper;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import javax.annotation.Resource;
/**
* EasyEs快速入门测试类
*
* @author 白豆五
* @version 2023/07/26
* @since JDK8
*/
@SpringBootTest
public class EasyEsTest {
@Resource
private DocumentMapper documentMapper;
/**
* 测试创建索引库
*/
@Test
public void testCreateIndex() {
//创建索引,根据当前mapper对应实体类信息及其注解配置生成索引信息
Boolean success = documentMapper.createIndex();
System.out.println(success ? "创建索引成功" : "创建索引失败");
}
}
Ejemplo 2: Agregar documentos
/**
* 测试添加文档
*/
@Test
public void testAddDocument() {
// 持久层添加数据跟mp类似也是insert方法
documentMapper.insert(new Document("1", "程序员的幽默", "为了让你开心,我特意编写了一段关于程序员的小笑话,希望你能喜欢。"));
}
Ejemplo 3: el título de la consulta de prueba contiene la lista de documentos del programador (incluso el análisis de los resultados lo realizamos nosotros)
/**
* 测试查询title中包含程序员的文档列表
*/
@Test
public void testSearch() {
// 条件构造器
LambdaEsQueryWrapper<Document> wrapper = new LambdaEsQueryWrapper<>();
wrapper.eq(Document::getTitle, "程序"); // 类似match查询
// 查询文档列表
List<Document> list = documentMapper.selectList(wrapper);
list.forEach(System.out::println);
}