Easy-ES 查询框架

Easy-ES 查询框架 #

Easy-ES 是 Dromara 开源社区下的搜索引擎 ORM 框架,类似于 MyBatis-Plus 之于 MySQL。它在 Java 客户端的基础上只做增强不做改变,提供 Lambda 风格的简洁 API,可减少 50%~80% 的代码量。

Easy-ES 提供了专门的 Easysearch 原生分支,底层直接使用 Easysearch Java Client,无需 ES API 兼容模式,具备完整的原生性能和功能支持。

核心优势 #

特性说明
极简开发一行代码完成查询,相比原生 API 代码量减少 50%~80%
自动索引管理索引全生命周期由框架自动托管,零停机更新,无需手动管理
SQL 语法兼容支持 MySQL 风格的 andorlikein 等常用语法查询
Lambda 表达式类型安全的字段访问,避免手写字段名导致的错误
Spring Boot 集成开箱即用的自动配置,完美融入 Spring Boot 生态
原生 Easysearch 支持底层使用 Easysearch Java Client,无需兼容层

快速开始 #

1. 添加依赖 #

Maven #

<properties>
    <maven.compiler.source>11</maven.compiler.source>
    <maven.compiler.target>11</maven.compiler.target>
    <spring-boot.version>2.7.0</spring-boot.version>
</properties>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>${spring-boot.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<dependencies>
    <dependency>
        <groupId>org.dromara.easy-es</groupId>
        <artifactId>easy-es-boot-starter</artifactId>
        <version>2.1.0-easysearch</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

Gradle #

plugins {
    id 'java'
    id 'org.springframework.boot' version '2.7.0'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
}

sourceCompatibility = '11'

dependencies {
    implementation 'org.dromara.easy-es:easy-es-boot-starter:2.1.0-easysearch'
    implementation 'org.springframework.boot:spring-boot-starter-web'
}

2. 配置连接 #

# application.yml
easy-es:
  enable: true
  address: localhost:9200
  schema: https
  username: admin
  password: your_password_here
  keep-alive-millis: 18000

  global-config:
    process-index-mode: smoothly
    async-process-index-blocking: true
    print-dsl: false
    db-config:
      map-underscore-to-camel-case: true
      id-type: customize
      field-strategy: not_empty
      refresh-policy: immediate
      enable-track-total-hits: true

配置说明

参数说明
addressEasysearch 服务地址(host:port
schema协议,Easysearch 默认启用 HTTPS,填 https
username / passwordEasysearch 用户认证凭据
keep-alive-millis连接保持时间(毫秒)
process-index-mode索引处理模式:smoothly(平滑零停机)、manual(手动)
print-dsl是否打印 DSL 语句(开发调试时设为 true
refresh-policy刷新策略:immediate(立即)、wait_untilnone

3. 定义实体类 #

import org.dromara.easyes.annotation.*;
import org.dromara.easyes.annotation.rely.*;

@Settings(shardsNum = 3, replicasNum = 2)
@IndexName(value = "easyes_document", keepGlobalPrefix = true)
public class Document {

    @IndexId(type = IdType.CUSTOMIZE)
    private String id;

    /** 标题 - 默认 keyword 类型 */
    private String title;

    /** 内容 - TEXT 类型,使用 IK 分词器,支持高亮 */
    @HighLight(mappingField = "highlightContent")
    @IndexField(fieldType = FieldType.TEXT, analyzer = Analyzer.IK_SMART)
    private String content;

    /** 创建者 */
    @IndexField(strategy = FieldStrategy.NOT_EMPTY)
    private String creator;

    /** 创建时间 */
    @IndexField(fieldType = FieldType.DATE, dateFormat = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime gmtCreate;

    /** 高亮结果映射字段 */
    private String highlightContent;

    /** 点赞数 */
    private Integer starNum;

    /** 地理位置 */
    @IndexField(fieldType = FieldType.GEO_POINT)
    private String location;

    // getters & setters ...
}

常用注解

注解说明
@IndexName指定索引名,keepGlobalPrefix 启用全局前缀
@IndexId主键标识,IdType.CUSTOMIZE 为自定义 ID
@IndexField字段映射,指定字段类型、分词器、更新策略等
@HighLight高亮配置,mappingField 指定高亮结果映射的字段
@Settings索引设置,分片数、副本数等

4. 定义 Mapper #

import org.dromara.easyes.core.kernel.BaseEsMapper;

public interface DocumentMapper extends BaseEsMapper<Document> {
}

5. 启动类配置 #

import org.dromara.easyes.spring.annotation.EsMapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@EsMapperScan("com.example.mapper")
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

6. 业务使用 #

import org.dromara.easyes.core.conditions.select.LambdaEsQueryWrapper;
import org.easysearch.action.search.SearchResponse;

@RestController
public class DocumentController {

    @Resource
    private DocumentMapper documentMapper;

    /** 插入文档 */
    @GetMapping("/insert")
    public Integer insert() {
        Document doc = new Document();
        doc.setId("1");
        doc.setTitle("Easy-ES 入门");
        doc.setContent("这是一篇关于 Easy-ES 与 Easysearch 集成的教程");
        doc.setCreator("admin");
        doc.setGmtCreate(LocalDateTime.now());
        doc.setStarNum(100);
        return documentMapper.insert(doc);
    }

    /** Lambda 条件查询 */
    @GetMapping("/search")
    public List<Document> search(@RequestParam String keyword) {
        LambdaEsQueryWrapper<Document> wrapper = new LambdaEsQueryWrapper<>();
        wrapper.match(Document::getContent, keyword)
               .ge(Document::getStarNum, 10)
               .orderByDesc(Document::getStarNum);
        return documentMapper.selectList(wrapper);
    }

    /** 高亮搜索 */
    @GetMapping("/highlight")
    public List<Document> highlight(@RequestParam String content) {
        LambdaEsQueryWrapper<Document> wrapper = new LambdaEsQueryWrapper<>();
        wrapper.match(Document::getContent, content);
        return documentMapper.selectList(wrapper);
    }

    /** 聚合查询 */
    @GetMapping("/agg")
    public Aggregations aggregation() {
        LambdaEsQueryWrapper<Document> wrapper = new LambdaEsQueryWrapper<>();
        wrapper.groupBy(Document::getGmtCreate)
               .max(Document::getStarNum)
               .min(Document::getStarNum);
        SearchResponse response = documentMapper.search(wrapper);
        return response.getAggregations();
    }

    /** SQL 查询 */
    @GetMapping("/sql")
    public String queryBySQL(@RequestParam String title) {
        String sql = String.format(
            "SELECT * FROM dev_easyes_document WHERE title = '%s'", title);
        return documentMapper.executeSQL(sql);
    }
}

与 ES 通用版的区别 #

对比项Easysearch 原生版ES 通用版
Maven 坐标org.dromara.easy-es:easy-es-boot-starter:2.1.0-easysearchorg.dromara.easy-es:easy-es-boot-starter:2.x.x
底层客户端Easysearch Java ClientElasticsearch RestHighLevelClient
API 兼容模式不需要需要开启 elasticsearch.api_compatibility: true
源码分支easy-es4easySearchmaster
import 包名org.easysearch.*org.elasticsearch.*

如果您从 Easy-ES 的 ES 通用版本迁移到 Easysearch 原生版,只需更换 Maven 依赖并将 import 中的 org.elasticsearch 替换为 org.easysearch


注意事项 #

注意项说明
Java 版本需要 JDK 11 及以上
Spring Boot 版本推荐 2.7.x
HTTPSEasysearch 默认启用 HTTPS,配置 schema: https
认证配置 usernamepassword
索引前缀通过 db-config.index-prefix 设置全局索引前缀

相关链接 #

延伸阅读 #