Easysearch
APM(二):监控 Python 服务
Easysearch • INFINI Labs 小助手 发表了文章 • 0 个评论 • 1748 次浏览 • 3 天前
上一篇我们已经安装好了 Skywalking 和 Easysearch,这次我们来写个简单的 Python 服务,并把它的服务调用信息发送给 Skywalking,通过 Skywalking 的 Web UI 进行展示。
启动后端服务
先启动好后端服务,包括 Skywalking 和 Easysearch。启动完成后能通过 Web UI 访问 Skywalking。

构建 Python 服务
我们编写一个简单的 Flask 服务程序,只要访问 localhost:8081/a 就会返回 "Hello, I'm Service A!" 信息。
from flask import Flask
app = Flask(__name__)
@app.route('/a', methods=['GET'])
def service_b():
return "Hello, I'm Service A!"
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8081)
运行前,要安装好依赖。
pip3 install flask
pip3 install apache-skywalking
依赖关系展示如下:

设置环境变量
为了让服务能成功把相关信息发送到 Skywalking 后端,启动前我们还要设置两个环境变量告诉服务程序该往哪里发送信息。
export SW_AGENT_COLLECTOR_BACKEND_SERVICES=localhost:11800
export SW_AGENT_NAME=AService-python
启动 Python 程序
一切准备妥当后,运行我们的服务程序。
sw-python run python3 AService.py
程序启动后会监听 8081 端口。

我们通过浏览器访问下。

在 Skywalking 的 Web UI 上查看服务的信息是否采集到。




可以看到服务 A 的调用信息都已经被记录到 Skywalking 中了。
作者:杨帆,极限科技(INFINI Labs)高级解决方案架构师、《老杨玩搜索》栏目 B 站 UP 主,拥有十余年金融行业服务工作经验,熟悉 Linux、数据库、网络等领域。目前主要从事 Easysearch、Elasticsearch 等搜索引擎的技术支持工作,服务国内私有化部署的客户。
INFINI Labs 产品更新 | Coco AI v0.10 × Easysearch v2.0 联袂上线:UI 全面重构,体验焕然一新
资讯动态 • INFINI Labs 小助手 发表了文章 • 0 个评论 • 6149 次浏览 • 2025-12-20 16:34

此次更新主要包括 Coco AI v0.10.0 更换全新的 UI 组件,服务端新增 milvus 和 dropbox 连接器;Easysearch v2.0.2 正式发布, 新增嵌入文档语义搜索,优化内置 UI 响应速度,无需依赖 Kibana,实现集群“开箱即管”;INFINI Console、Gateway、Agent、Loadgen v1.30.1 统一基于 Framework v1.4.0 升级,优化本地磁盘队列数据消费。详情见 Release Notes。
Coco AI 0.10
Coco AI 是一款完全开源、跨平台的企业级智能搜索与助手系统,专为现代企业打造。它通过统一搜索入口,连接企业内外部的异构数据源,融合大模型能力,帮助团队高效访问知识,智能决策协作。
Coco AI 本次详细更新记录如下:
Coco AI 客户端 0.10
🚀 功能特性 (Features)
- 扩展程序 UI 支持可调整窗口大小

- 添加打开按钮以启动已安装的扩展程序

✈️ 改进优化 (Improvements)
- 将应用程序和文件搜索视为普通扩展
- 通过深度链接安装扩展失败时,显示错误消息(而非错误代码)
- 用 shadcn/ui 组件替换旧组件

🐛 问题修复(Bug Fixes)
- 修复输入框高度异常问题
- 为 Extension.minimum_coco_version 实现自定义序列化
Coco AI 服务端 0.10
🚀 功能特性 (Features)
- 新增 milvus 连接器

- 新增 dropbox 连接器

🐛 问题修复(Bug Fixes)
- 修复搜索 API 中图标绝对 URL 的解析问题
- 修复集成商店读取剪贴板数据后的显示问题
✈️ 改进优化 (Improvements)
- 移除分页并在全屏模式下添加无限滚动
Easysearch v2.0.2
INFINI Easysearch 是一个分布式的搜索型数据库,实现非结构化数据检索、全文检索、向量检索、地理位置信息查询、组合索引查询、多语种支持、聚合分析等。Easysearch 可以完美替代 Elasticsearch,同时添加和完善多项企业级功能。Easysearch 助您拥有简洁、高效、易用的搜索体验。
Easysearch 本次更新如下:
💥 重大变更(Breaking Changes)
- 正式发布 Easysearch 2.0.2 版本,底层 Lucene 更新到 9.12.2
- 新增 ui 插件,为 Easysearch 提供了轻量级界面化管理功能,不再依赖第三方对集群进行管理,真正做到开箱即用
🚀 功能特性 (Features)
- 语义搜索新增支持 NestedQueryBuilder
- KNN mapping 的 L 和 k 参数支持大小写不敏感,提升易用性
✈️ 改进优化 (Improvements)
- UI 插件静态文件支持 gzip 压缩,加快页面加载
- 优化了图标资源大小
- 调整了内部构建流程和 CSP 策略
🐛 问题修复(Bug Fixes)
- 修复了开发者工具的主题颜色显示问题
Console v1.30.1
INFINI Console 是一款开源的非常轻量级的多集群、跨版本的搜索基础设施统一管控平台。通过对流行的搜索引擎基础设施进行跨版本、多集群的集中纳管,企业可以快速方便的统一管理企业内部的不同版本的多套搜索集群。
Console 本次详细更新记录如下:
🚀 功能特性 (Features)
- 支持 Easysearch 2.x 和 Opensearch 3.x
✈️ 改进优化 (Improvements)
- 此版本包含了底层 Framework v1.4.0 的更新,解决了一些常见问题,并增强了整体稳定性和性能。虽然 Console 本身没有直接的变更,但从 Framework 中继承的改进间接地使 Console 受益。
Gateway v1.30.1
INFINI Gateway 是一个开源的面向搜索场景的高性能数据网关,所有请求都经过网关处理后再转发到后端的搜索业务集群。基于 INFINI Gateway 可以实现索引级别的限速限流、常见查询的缓存加速、查询请求的审计、查询结果的动态修改等等。
Gateway 本次更新如下:
✈️ 改进优化 (Improvements)
- 此版本包含了底层 Framework v1.4.0 的更新,解决了一些常见问题,并增强了整体稳定性和性能。虽然 Gateway 本身没有直接的变更,但从 Framework 中继承的改进间接地使 Gateway 受益。
Agent v1.30.1
INFINI Agent 负责采集和上传 Elasticsearch, Easysearch, Opensearch 集群的日志和指标信息,通过 INFINI Console 管理,支持主流操作系统和平台,安装包轻量且无任何外部依赖,可以快速方便地安装。
Agent 本次更新如下:
🚀 功能特性 (Features)
- 在 Kubernetes 环境下通过环境变量 http.port 探测 Easysearch 的 HTTP 端口
✈️ 改进优化 (Improvements)
- 此版本包含了底层 Framework v1.4.0 的更新,解决了一些常见问题,并增强了整体稳定性和性能。虽然 Agent 本身没有直接的变更,但从 Framework 中继承的改进间接地使 Agent 受益。
Loadgen v1.30.1
INFINI Loadgen 是一款开源的专为 Easysearch、Elasticsearch、OpenSearch 设计的轻量级性能测试工具。
Loadgen 本次更新如下:
✈️ 改进优化 (Improvements)
- 此版本包含了底层 Framework v1.4.0 的更新,解决了一些常见问题,并增强了整体稳定性和性能。虽然 Loadgen 本身没有直接的变更,但从 Framework 中继承的改进间接地使 Loadgen 受益。
Framework 1.4.0
INFINI Framework 是 INFINI Labs 基于 Golang 的产品的核心基础,已开源。该框架以开发者为中心设计,简化了构建高性能、可扩展且可靠的应用程序的过程。
Framework 本次更新如下:
🚀 功能特性 (Features)
- 为 curl 添加 p12 证书支持(#239)
- 从 util 中移除 curl(#242)
- 优先使用集群名称(#243)
- 为 access_token 添加标签(#244)
- 为用户主体(principal)添加头像配置(#246)
🐛 问题修复 (Bug Fixes)
- 修复重复写入和未写入的问题(#234)
- 当 filePath 为绝对路径时,检查其是否存在(#241)
✈️ 改进 (Improvements)
- 改进 TryGetFileAbsPath() 的 panic 错误信息(#240)
更多详情请查看以下各产品的 Release Notes 或联系我们的技术支持团队!
- Coco AI App
- Coco AI Server
- INFINI Easysearch
- INFINI Gateway
- INFINI Console
- INFINI Agent
- INFINI Loadgen
- INFINI Framework
期待反馈
欢迎下载体验使用,如果您在使用过程中遇到如何疑问或者问题,欢迎前往 INFINI Labs Github(https://github.com/infinilabs) 中的对应项目中提交 Feature Request 或提交 Bug。
下载地址: https://infinilabs.cn/download
邮件:hello@infini.ltd
电话:(+86) 400-139-9200
Discord:https://discord.gg/4tKTMkkvVX
也欢迎大家微信扫码添加小助手(INFINI-Labs),加入用户群一起讨论交流。

关于极限科技(INFINI Labs)

极限科技,全称极限数据(北京)科技有限公司,是一家专注于实时搜索与数据分析的软件公司。旗下品牌极限实验室(INFINI Labs)致力于打造极致易用的数据探索与分析体验。
极限科技是一支年轻的团队,采用天然分布式的方式来进行远程协作,员工分布在全球各地,希望通过努力成为中国乃至全球企业大数据实时搜索分析产品的首选,为中国技术品牌输出添砖加瓦。
Easy-Es 2.1.0-easysearch 版本发布
Easysearch • INFINI Labs 小助手 发表了文章 • 0 个评论 • 8117 次浏览 • 2025-12-15 17:42

01 | 版本更新概述
经过极限科技与 Dromara 开源社区下 Easy-Es 项目的紧密合作与共同努力,我们很荣幸地联合推出 Easy-Es 2.1.0-easysearch 版本!
作为双方携手打造的第一个合作成果,本版本已正式发布:
- 源码仓库:https://gitee.com/dromara/easy-es/tree/easy-es4easySearch/
- Maven 依赖:https://mvnrepository.com/artifact/org.dromara.easy-es/easy-es-boot-starter/2.1.0-easysearch
本次更新的核心内容是将 Easy-Es 框架底层增加兼容极限科技自主研发的 Easysearch 搜索引擎,这标志着国产搜索引擎与国内优秀开源项目深度融合的重要里程碑,是极限科技与 Dromara 社区携手共建国产技术生态的创新实践。
02 | 迁移至 Easysearch 的背景与优势
随着国内对自主可控技术需求的日益增长,特别是在基础设施软件领域,企业对于信创合规的要求不断提升。极限科技自主研发的 Easysearch 搜索引擎具备以下显著优势:
- 国产化自主可控:完全自主研发,符合信创要求,无许可证风险,为企业提供安全可靠的技术保障
- 轻量级架构:相比传统搜索引擎,资源占用更少,启动更快速,显著降低企业运维成本
- 卓越性能表现:查询性能优异,能够满足大部分业务场景需求,用户体验流畅
- 良好兼容性:与 Elasticsearch 的 API 接口基本兼容,迁移成本较低,保护用户现有投资
基于以上优势,双方决定共同将 Easy-Es 框架底层迁移至 Easysearch,这不仅为用户提供更多选择,更是双方携手推动国产搜索引擎生态建设的重要举措。
03 | Easy-Es 框架优势
Easy-Es 框架在搜索开发领域具备以下核心优势:
- 极简代码开发:相比原生 API 可减少 50%-80% 的代码量,大幅提升开发效率。
// 使用 Easy-Es 仅需一行代码完成查询
List<Document> documents = documentMapper.selectList(
EsWrappers.lambdaQuery(Document.class).eq(Document::getTitle, "测试")
);
-
自动索引管理: 框架提供全自动智能索引托管功能,开发者无需关心索引的创建、更新及数据迁移等复杂操作,索引全生命周期由框架自动管理,过程零停机。
-
SQL 语法兼容: 支持使用 MySQL 语法完成搜索查询操作,无需学习复杂的 DSL 语句。支持 and、or、like、in 等常用 SQL 语法。
-
Lambda 表达式支持: 采用 Lambda 风格编程,提供类型安全的字段访问,避免手动输入字段名可能产生的错误,提升代码可读性和开发效率。
-
无缝 Spring Boot 集成: 与 Spring Boot 生态深度集成,提供开箱即用的自动配置,无需复杂的手动配置,支持 Spring Boot Actuator 监控,完美融入企业级应用架构。
-
丰富的查询功能: 支持复杂的嵌套查询、聚合查询、范围查询、高亮显示等高级搜索功能,同时保持 API 的简洁易用,满足各种业务场景需求。
-
分布式架构支持: 完美适配 Easysearch 的分布式特性,支持集群模式部署,具备高可用性和横向扩展能力,满足企业级大规模数据处理需求。
- 成熟稳定的国产 ORM 框架: 作为 Dromara 开源社区下的顶级开源项目,Easy-Es 已在国内众多企业和项目中得到广泛应用和验证,拥有活跃的中文社区和完善的文档支持,为企业级应用提供了可靠的技术保障。
04 | 快速上手示例
1. 添加依赖
根据您使用的构建工具,选择对应的配置方式:
Maven 项目
pom.xml 配置:
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<spring-boot.version>2.7.0</spring-boot.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</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>
<build>
<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>
Maven 启动命令:
# 运行应用
mvn spring-boot:run
# 编译打包
mvn clean package
Gradle 项目
build.gradle 配置:
plugins {
id 'java'
id 'org.springframework.boot' version '2.7.0'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
}
group = 'org.easysearch'
version = '1.0-SNAPSHOT'
sourceCompatibility = '11'
repositories {
mavenLocal()
mavenCentral()
}
dependencies {
implementation 'org.dromara.easy-es:easy-es-boot-starter:2.1.0-easysearch'
implementation 'org.springframework.boot:spring-boot-starter-web'
}
Gradle 启动命令:
# 运行应用
./gradlew bootRun
# 编译打包
./gradlew clean build
2. 配置文件设置
application.yml(根据实际 Easysearch 部署情况修改):
easy-es:
enable: true
# Easysearch 服务地址
address: localhost:9200
# 协议:http 或 https
schema: https
# Easysearch 用户名
username: admin
# Easysearch 密码
password: your_password_here
# 连接保持时间(毫秒)
keep-alive-millis: 18000
global-config:
# 开启彩蛋模式(启动时显示 ASCII 艺术图案)
i-kun-mode: true
# 索引处理模式:smoothly 表示平滑模式(零停机更新索引)
process-index-mode: smoothly
# 异步处理索引时是否阻塞
async-process-index-blocking: true
# 是否打印 DSL 语句(开发调试时可设为 true)
print-dsl: false
db-config:
# 下划线转驼峰
map-underscore-to-camel-case: true
# 索引前缀
index-prefix: dev_
# 主键类型:customize 表示自定义
id-type: customize
# 字段更新策略:not_empty 表示非空时才更新
field-strategy: not_empty
# 刷新策略:immediate 表示立即刷新
refresh-policy: immediate
# 开启追踪总命中数
enable-track-total-hits: true
3. 实体类定义
package org.dromara.easyes.sample.entity;
import lombok.Data;
import lombok.experimental.Accessors;
import org.dromara.easyes.annotation.HighLight;
import org.dromara.easyes.annotation.IndexField;
import org.dromara.easyes.annotation.IndexId;
import org.dromara.easyes.annotation.IndexName;
import org.dromara.easyes.annotation.Settings;
import org.dromara.easyes.annotation.rely.Analyzer;
import org.dromara.easyes.annotation.rely.FieldStrategy;
import org.dromara.easyes.annotation.rely.FieldType;
import org.dromara.easyes.annotation.rely.IdType;
import java.time.LocalDateTime;
/**
* es 数据模型
*/
@Data
@Accessors(chain = true)
@Settings(shardsNum = 3, replicasNum = 2)
@IndexName(value = "easyes_document", keepGlobalPrefix = true)
public class Document {
/**
* es 中的唯一 id
*/
@IndexId(type = IdType.CUSTOMIZE)
private String id;
/**
* 文档标题,默认为 keyword 类型,可进行精确查询
*/
private String title;
/**
* 文档内容,指定为 TEXT 类型,使用 IK 分词器
* 支持高亮显示,高亮结果映射到 highlightContent 字段
*/
@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;
/**
* 地理位置经纬度坐标,例如: "40.13933715136454,116.63441990026217"
*/
@IndexField(fieldType = FieldType.GEO_POINT)
private String location;
}
4. Mapper 接口
package org.dromara.easyes.sample.mapper;
import org.dromara.easyes.core.kernel.BaseEsMapper;
import org.dromara.easyes.sample.entity.Document;
/**
* Mapper 接口,继承 BaseEsMapper 即可获得所有 CRUD 方法
*/
public interface DocumentMapper extends BaseEsMapper<Document> {
}
5. 启动类配置
package org.dromara.easyes.sample;
import org.dromara.easyes.spring.annotation.EsMapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* 启动类
*/
@SpringBootApplication
@EsMapperScan("org.dromara.easyes.sample.mapper")
public class EasyEsApplication {
public static void main(String[] args) {
SpringApplication.run(EasyEsApplication.class, args);
}
}
6. 业务使用示例
package org.dromara.easyes.sample.controller;
import org.dromara.easyes.core.conditions.select.LambdaEsQueryWrapper;
import org.dromara.easyes.sample.entity.Document;
import org.dromara.easyes.sample.mapper.DocumentMapper;
import org.easysearch.action.search.SearchResponse;
import org.easysearch.search.aggregations.Aggregations;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.List;
@RestController
public class SampleController {
@Resource
private DocumentMapper documentMapper;
/**
* 初始化插入数据
*/
@GetMapping("/insert")
public Integer insert() {
int count = 0;
// 插入 5 条测试数据
for (int i = 1; i <= 5; i++) {
Document document = new Document();
document.setId(String.valueOf(i));
document.setTitle("测试" + i);
document.setContent("测试内容" + i);
document.setCreator("创建者" + i);
document.setGmtCreate(LocalDateTime.now());
document.setStarNum(i * 10);
count += documentMapper.insert(document);
}
return count;
}
/**
* 根据标题精确查询
*/
@GetMapping("/listDocumentByTitle")
public List<Document> listDocumentByTitle(@RequestParam String title) {
LambdaEsQueryWrapper<Document> wrapper = new LambdaEsQueryWrapper<>();
wrapper.eq(Document::getTitle, title);
return documentMapper.selectList(wrapper);
}
/**
* 高亮搜索
*/
@GetMapping("/highlightSearch")
public List<Document> highlightSearch(@RequestParam String content) {
LambdaEsQueryWrapper<Document> wrapper = new LambdaEsQueryWrapper<>();
wrapper.match(Document::getContent, content);
return documentMapper.selectList(wrapper);
}
/**
* 查询所有数据
*/
@GetMapping("/selectAll")
public List<Document> selectAll() {
LambdaEsQueryWrapper<Document> wrapper = new LambdaEsQueryWrapper<>();
return documentMapper.selectList(wrapper);
}
/**
* 聚合查询 - 按创建时间和点赞数分组统计
*/
@GetMapping("/aggByDateAndStar")
public Aggregations aggByDateAndStar() {
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("/queryBySQL")
public String queryBySQL(@RequestParam(required = false) String title) {
String sql;
if (title != null && !title.isEmpty()) {
sql = String.format("SELECT * FROM dev_easyes_document WHERE title = '%s'", title);
} else {
sql = "SELECT * FROM dev_easyes_document LIMIT 10";
}
return documentMapper.executeSQL(sql);
}
}
7. 快速测试
启动应用后,可以通过以下接口测试:
# 1. 插入测试数据
curl http://localhost:8080/insert
# 2. 查询所有数据
curl http://localhost:8080/selectAll
# 3. 根据标题精确查询
curl "http://localhost:8080/listDocumentByTitle?title=测试1"
# 4. 高亮搜索
curl "http://localhost:8080/highlightSearch?content=测试"
# 5. SQL 查询
curl "http://localhost:8080/queryBySQL?title=测试1"
# 6. 聚合查询
curl http://localhost:8080/aggByDateAndStar
05 | 相关链接
- Easy-Es 官方网站:https://easy-es.cn
- Gitee 仓库:https://gitee.com/dromara/easy-es
- GitHub 仓库:https://github.com/dromara/easy-es
- Easysearch 官方网站:https://infinilabs.cn/products/easysearch
06 | 特别致谢
在此,极限科技要特别感谢 Easy-Es 项目的核心开发者“老汉”和各位贡献者和维护者们。正是因为有了你们的辛勤付出、专业精神以及对开源事业的热忱奉献,Easy-Es 项目才能在国内外获得如此广泛的认可和应用。
也感谢你们对国产技术生态建设的信任与支持。此次 Easy-Es 与 Easysearch 的深度整合,正是双方通力合作、互利共赢的最佳体现。
我们相信,在 Easy-Es 项目团队的持续推动下,国产开源软件必将迎来更加辉煌的明天。极限科技将继续致力于提供优质的国产技术解决方案,与 Easy-Es 项目团队携手共进,为中国开源生态的发展贡献更多力量!
关于 Easy-Es
Easy-Es(简称 EE)是一款基于 Elasticsearch(简称 ES)官方提供的 ElasticsearchClient 打造的 ORM 开发框架,在 ElasticsearchClient 的基础上,只做增强不做改变,为简化开发、提高效率而生,您如果有用过 Mybatis-Plus(简称 MP),那么您基本可以零学习成本直接上手 EE,EE 是 MP 的 ES 平替版,在有些方面甚至比 MP 更简单,同时也融入了更多 ES 独有的功能,助力您快速实现各种场景的开发。
Easy-Es for Easysearch 是一款简化 Easysearch 国产化搜索引擎操作的开源框架,全自动智能索引托管。同时也是国内首家专门针对 Easysearch 客户端简化的工具。它简化 CRUD 及其它高阶操作,可以更好的帮助开发者减轻开发负担。底层采用 Easysearch Java Client,保证其原生性能及拓展性。
项目地址:https://gitee.com/dromara/easy-es/tree/easy-es4easySearch
关于极限科技
极限科技(全称:极限数据(北京)科技有限公司)是一家专注于实时搜索与数据分析的软件公司。
旗下品牌:极限实验室(INFINI Labs)致力于打造极致易用的数据探索与分析体验,为用户提供安全、稳定、高性能的国产搜索解决方案。
作者:张磊,极限科技(INFINI Labs)搜索引擎研发负责人,对 Elasticsearch 和 Lucene 源码比较熟悉,目前主要负责公司的 Easysearch 产品的研发以及客户服务工作。
Easysearch 2.0.0 性能测试
Easysearch • INFINI Labs 小助手 发表了文章 • 0 个评论 • 8845 次浏览 • 2025-12-04 00:17
概述
Easysearch 2.0.0 正式版带来了显著的性能提升和优化改进。通过与上一个稳定版本 1.15.6 的全面对比测试,我们使用 esrally 基准测试工具在 append-no-conflicts 场景下进行了深入的性能评估。测试结果表明,2.0.0 版本在索引性能、查询延迟、内存管理等核心指标上都实现了突破性改进。
核心性能提升
1. 索引性能更加稳定
写入效率提升 12.81%
Easysearch 2.0.0 索引性能表现更加稳定:
- 累计索引 CPU 时间(所有主分片):从 225.1 分钟缩短至 196.3 分钟,减少 28.8 分钟(-12.81%)
- 索引吞吐量:
- 平均吞吐量从 180,868 docs/s 提升至 190,712 docs/s(+5.44%)
- 最大吞吐量从 198,184 docs/s 提升至 220,460 docs/s(+11.24%)
- 最小吞吐量从 164,263 docs/s 提升至 178,961 docs/s(+8.95%)
累计索引 CPU 时间的减少,表明 2.0.0 版本在索引操作上更加高效,CPU 利用率更优。这意味着在相同硬件条件下,Easysearch 2.0.0 能够更快地完成数据摄入任务,对于需要处理大规模数据写入的场景具有重要意义。
Indexing Throughput (docs/s) - Higher is Better
2. Refresh 和 Flush 耗时缩短
Refresh 和 Flush 性能大幅改善
在 Elasticsearch/Easysearch 中,Refresh 和 Flush 操作对写入性能有直接影响。2.0.0 版本在这两个关键操作上实现了重大优化:
Refresh 性能提升 54.46%
- 累计刷新时间:从 9.14 分钟降至 4.16 分钟
- 中位刷新时间:减少 61.86%(从 0.133 分钟降至 0.051 分钟)
- 最大刷新时间:减少 65.62%(从 1.12 分钟降至 0.39 分钟)
Flush 性能提升 40%
- 累计刷盘时间:从 12.57 分钟降至 7.54 分钟
- 中位刷盘时间:减少 57.57%
- 最大刷盘时间:减少 31.93%
Cumulative Refresh Time (min) - Lower is Better
Cumulative Flush Time (min) - Lower is Better
这些优化使得 Easysearch 2.0.0 能够更高效地将数据持久化到磁盘,同时减少对写入操作的阻塞。
3. 垃圾回收(GC)性能优化
GC 效率显著提升
- Young GC 次数:从 525 次降至 426 次,减少 18.86%
- Young GC 时间:从 16.547 秒降至 15.985 秒,减少 3.40%
- Old GC:两个版本均无 Old GC 发生,内存管理健康
更少的 GC 次数意味着:
- 应用程序 STW(Stop-The-World)暂停更少
- 更稳定的查询响应时间
- 更好的系统吞吐量
查询性能提升
1. 基础查询延迟降低
多类型查询性能全面提升
| 查询类型 | 延迟指标 | 改进幅度 |
|---|---|---|
| Default 查询 | 50 分位延迟 | -11.40% (19.97ms → 17.69ms) |
| 99 分位延迟 | -15.23% (25.66ms → 21.75ms) | |
| Term 查询 | 50 分位延迟 | -19.88% (4049ms → 3244ms) |
| 90 分位延迟 | -18.73% (4137ms → 3362ms) | |
| Range 查询 | 50 分位延迟 | -31.71% (42.19ms → 28.81ms) |
| 100 分位延迟 | -64.68% (111.42ms → 39.35ms) |
Query Latency Improvements (ms) - Lower is Better
2. 排序查询性能飞跃
时间戳排序查询优化高达 97%
Easysearch 2.0.0 在排序查询场景下实现了令人瞩目的性能突破:
降序排序(desc_sort_timestamp)
- 50 分位延迟:从 516.07ms 降至 98.89ms(-80.84%)
- 90 分位延迟:从 544.84ms 降至 123.59ms(-77.32%)
- 99 分位延迟:从 603.14ms 降至 139.93ms(-76.80%)
升序排序 + After 分页(asc_sort_with_after_timestamp)
- 50 分位延迟:从 1272.58ms 降至 33.56ms(-97.36%)
- 90 分位延迟:从 1386.92ms 降至 37.25ms(-97.31%)
- 99 分位延迟:从 1474.98ms 降至 38.11ms(-97.42%)
Sort Query Latency (ms) - Lower is Better
Force Merge 后的排序查询
在强制合并为单段后,排序查询性能更加出色:
降序排序(force-merge-1-seg)
- 50 分位延迟:从 131,617ms 降至 115.01ms(-99.91%)
- 这一改进相当于从 2 分钟以上降至 0.1 秒!
升序 + After 分页(force-merge-1-seg)
- 50 分位延迟:从 1387.01ms 降至 132.42ms(-90.45%)
- 90 分位延迟:从 1509.03ms 降至 159.05ms(-89.46%)
3. 聚合查询性能提升
hourly_agg 聚合查询优化
- 50 分位延迟:从 4192.57ms 降至 3866.07ms(-7.79%)
- 90 分位延迟:从 4303.51ms 降至 4053.80ms(-5.80%)
- 99 分位延迟:从 4475.32ms 降至 4269.91ms(-4.59%)
4. Scroll 查询性能改进
大数据量遍历场景优化
- 50 分位延迟:从 6511.65ms 降至 4623.87ms(-28.99%)
- 90 分位延迟:从 6881.70ms 降至 5972.79ms(-13.21%)
- 平均吞吐量:从 24.192 pages/s 提升至 24.485 pages/s(+1.21%)
Scroll Query Latency (ms) - Lower is Better
5. 高百分位延迟大幅改善
极端场景下的稳定性提升
在衡量系统稳定性的高百分位延迟指标上,2.0.0 版本表现卓越:
| 场景 | 99.9 分位延迟改进 | 99.99 分位延迟改进 | 100 分位延迟改进 |
|---|---|---|---|
| index-append | -43.40% | -65.35% | -70.91% |
| (3364ms → 1904ms) | (9618ms → 3333ms) | (13427ms → 3906ms) |
这意味着即使在最坏的情况下,2.0.0 版本也能提供更加稳定和可预测的性能表现。
范围查询性能提升
200s-in-range 和 400s-in-range 查询优化
-
200s-in-range:
- 50 分位延迟降低 15.60%
- 吞吐量提升 1.20%
- 400s-in-range:
- 50 分位延迟降低 8.44%
- 吞吐量提升 0.23%
存储优化
磁盘空间使用更高效
- 存储大小:从 19.51 GB 降至 19.14 GB(-1.93%)
- 段数量:从 43 个增至 50 个(+16.28%)
虽然段数量略有增加,但总存储空间仍然减少,说明数据压缩和存储效率得到了提升。
Merge 策略调整
合并操作的权衡
需要注意的是,2.0.0 版本在 Merge 方面有以下变化:
- Merge 次数从 184 次增至 192 次(+4.35%)
- Merge 限流时间从 9.53 分钟增至 11.17 分钟(+17.20%)
这是为了平衡写入性能和查询性能所做的策略调整。用户可以根据实际场景需求,通过以下参数进行优化:
{
"index.merge.scheduler.max_thread_count": "1",
"index.merge.policy.max_merged_segment": "5gb"
}
技术架构改进
1. 段数据结构优化
通过将段元数据从堆内存迁移到堆外内存,Easysearch 2.0.0 实现了:
- 更低的 JVM 堆压力
- 更少的 GC 频率
- 更稳定的内存使用模式
- 更好的大数据集支持能力
2. 查询缓存优化
排序查询性能的巨大提升表明 2.0.0 版本可能在以下方面进行了优化:
- 改进的 Doc Values 访问机制
- 优化的排序算法
- 更高效的分页实现
- 智能的查询结果缓存
3. I/O 优化
Refresh 和 Flush 时间的大幅减少说明:
- 改进了磁盘 I/O 调度策略
- 优化了文件系统操作
- 可能引入了更高效的批量写入机制
适用场景
Easysearch 2.0.0 的性能提升使其在以下场景中表现更加出色:
1. 大规模日志与事件流处理
- 更高的写入吞吐量(+11.24% 峰值)
- 更低的索引延迟
- 适合 APM、日志分析、安全监控等场景
2. 时序数据存储与分析
- 时间戳排序查询性能提升高达 97%
- 适合 IoT、监控指标、金融交易数据等场景
3. 全文搜索应用
- 多类型查询延迟降低 10-30%
- 高并发场景下更稳定的响应时间
- 适合电商搜索、内容管理系统等场景
4. 实时分析与 Dashboard
- 聚合查询性能提升 5-8%
- 更低的极端延迟,用户体验更好
- 适合实时报表、业务 BI 等场景
5. 大数据量遍历与导出
- Scroll 查询延迟降低 29%
- 适合数据迁移、全量导出等场景
升级建议
兼容性
Easysearch 2.0.0 与 1.15.6 在 API 层面保持兼容,但建议:
- 测试环境验证:先在测试环境进行充分验证
- 配置审查:检查 Merge 相关配置是否需要调整
- 监控指标:升级后密切关注 GC、内存、延迟等指标
- 滚动升级:生产环境建议采用滚动升级方式
性能测试环境
本次测试使用 esrally 基准测试工具,测试配置如下:
- 测试场景:append-no-conflicts
- 测试时间:
- Baseline (1.15.6): 2025-11-14
- Contender (2.0.0): 2025-11-21
- 部署方式:External(独立部署)
- CPU 绑定:使用
taskset绑定 Easysearch 进程 0 到 15 cpu - JVM 配置:
-Xms16g -Xmx16g
总结
Easysearch 2.0.0 版本在性能方面取得了全面提升:
- 索引性能提升 12.81%
- 查询延迟降低 10-97%(不同场景)
- 内存使用优化 100%(堆内段数据)
- GC 频率降低 18.86%
- Refresh 性能提升 54.46%
- Flush 性能提升 40%
- 高百分位延迟改善 43-70%
这些改进使得 Easysearch 2.0.0 成为一个更加高效、稳定和可靠的搜索与分析引擎,特别适合处理大规模数据和实时查询场景。无论是日志分析、时序数据处理,还是全文搜索应用,2.0.0 版本都能提供更优秀的性能表现。
我们强烈建议用户升级到 Easysearch 2.0.0,以获得这些显著的性能提升和更好的使用体验。
关于 Easysearch

INFINI Easysearch 是一个分布式的搜索型数据库,实现非结构化数据检索、全文检索、向量检索、地理位置信息查询、组合索引查询、多语种支持、聚合分析等。Easysearch 可以完美替代 Elasticsearch,同时添加和完善多项企业级功能。Easysearch 助您拥有简洁、高效、易用的搜索体验。
作者:张磊,极限科技(INFINI Labs)搜索引擎研发负责人,对 Elasticsearch 和 Lucene 源码比较熟悉,目前主要负责公司的 Easysearch 产品的研发以及客户服务工作。
原文:https://infinilabs.cn/blog/2025/easysearch-2.0.0-performance-improvements/
INFINI Labs 产品更新 | Coco AI v0.9 与 Easysearch v2.0 全新功能上线,全面支持 GitLab 合并请求(MR)自动 AI Review
资讯动态 • INFINI Labs 小助手 发表了文章 • 0 个评论 • 9731 次浏览 • 2025-11-24 00:24

INFINI Labs 产品更新发布!此次更新主要包括:Coco AI v0.9 全面支持 GitLab 合并请求(MR)自动 AI Review,并重构为插件流水线架构,新增 Neo4j、MongoDB 等 10+ 数据源连接器,开启“AI+开发”协同新范式;Easysearch v2.0 正式发布,内置轻量级管理 UI,无需依赖 Kibana,实现集群“开箱即管”,Lucene 升级至 9.12.2,性能全面提升;INFINI Console、Gateway、Agent、Loadgen v1.30 统一基于 Framework v1.3 升级,全面支持 Easysearch 2.0 与 OpenSearch 3.x,新增百分比聚合、子目录代理等关键能力。详情见 Release Notes。
Coco AI v0.9
Coco AI 是一款完全开源、跨平台的企业级智能搜索与助手系统,专为现代企业打造。它通过统一搜索入口,连接企业内外部的异构数据源,融合大模型能力,帮助团队高效访问知识,智能决策协作。
Coco AI 本次详细更新记录如下:
Coco AI 客户端 v0.9
🚀 功能特性 (Features)
- feat: 支持通过快捷键切换分组 #911
- feat: 支持从设置页面打开日志文件夹
- feat: 支持使用 home 和 end 键移动光标
- feat: 支持使用 page up 和 page down 键移动选中条
- feat: 规范化多级菜单的标签结构
- feat: 当父插件类型为 Extension 时,搜索父插件可以搜到子插件
- feat: 支持使用 modifier key 和回车对话 AI 助手
- feat: 允许在光标位于开头时返回
- feat(插件兼容性): 插件描述文件添加 minimum_coco_version 字段进行版本检查
- feat: 实现紧凑窗口模式
- feat: 实现设置项搜索延迟和本地搜索结果权重
- feat: 添加主窗口透明度设置
- feat: 添加从默认模式回答紧凑模式的延迟设置
✈️ 改进优化 (Improvements)
- refactor: 优化搜索结果的排序逻辑 #910
- style: 为图片添加深色投影 #912
- chore: 为 Web 组件添加跨域配置 #921
- refactor: 若 AXUIElementSetAttributeValue() 失败则进行重试 #924
- refactor(calculator): 若表达式为 "num => num" 格式则跳过计算 #929
- chore: 使用自定义日志目录 #930
- chore: 将 tauri_nspanel 升级至 v2.1 #933
- refactor: show_coco/hide_coco 现已在 macOS 上改用 NSPanel 的相关方法 #933
- refactor: 将 convert_pages() 流程封装为函数 #934
- refactor(post-search): 从每个查询源至少收集 2 份文档 #948
- refactor: custom_version_comparator() 现已支持语义化版本比较 #941
- chore: 让主窗口垂直居中 #959
- refactor(view extension): 通过本地 HTTP 服务器加载 HTML/资源文件 #973
🐛 问题修复(Bug Fixes)
- fix: 修复服务列表自动更新的问题 #913
- ix: 修复聊天内容重复的问题 #916
- fix: 修复固定窗口(Pinned Window)快捷键失效的问题 #917
- fix: 修复从另一显示器操作焦点窗口时,窗口管理扩展失效的问题 #919
- fix(窗口管理插件): 修复“下一个/上一个桌面”功能失效的问题 #926
- fix: 修复页面频繁闪烁的问题 #935
- fix(view extension): 修复通过快捷键打开扩展时搜索栏 UI 显示异常的问题 #938
- fix: 修复全选文本后无法删除的问题 #943
- fix: 修复在聊天和搜索页面之间切换时的抖动问题 #955
- fix: 修复重复显示登录成功提示的问题 #977
- fix: 修复 Quick AI 无法继续对话的问题 #979
Coco App 相关截图:

Coco AI 服务端 v0.9
💥 重大变更(Breaking Changes)
- refactor: 将连接器重构为基于流水线(Pipeline)模式 (#545) #545
- refactor: 重新实现安全功能;需重新运行设置程序
🚀 功能特性 (Features)
- feat: 新增 Neo4j 连接器 #539
- feat: 新增内置商店 #551
- feat: 基于 RBAC 的安全机制
- feat: 用户级数据所有权与共享功能
- feat: 管理界面增加权限校验
- feat: 新增路由权限验证
- feat: 新增用户实体卡片
- feat: 文档管理增加视图功能
- feat: 新增 Webhooks 管理界面 (#558)
- feat: 新增 GitLab 合并事件的 Webhook 处理器
- feat: 集成扩展商店
- feat: 支持编辑连接器处理器配置
- feat: 支持配置 Base Path 以自定义服务端点
- feat: 名称字段增加拼音支持
- feat: 新增 MongoDB 连接器
🐛 问题修复(Bug Fixes)
- fix: 修复切换扩展类型后重置搜索关键词的问题
- fix: 修复全屏小部件的相关问题
✈️ 改进优化 (Improvements)
- refactor: 为深色模式添加悬停背景效果
- chore: 修复文档搜索功能
- chore: 格式化日期
- refactor: 更新初始值
- chore: 修复数据源名称缺失的问题
- chore: 安装完成后隐藏弹窗
- chore: 基于框架变更进行重构
- chore: 为支持深度思考(DeepThink)获取更多文档 #577
- chore: 启用搜索后将首页更改为搜索页 #541
- chore: 更新搜索 API 以支持查询 DSL #550
- chore: 默认按创建时间排序
- chore: 调整多语言配置
- chore: 用户表单增加确认密码字段
- chore: 调整连接器类型
- chore: 调整连接器 OAuth 重定向设置
- refactor: 为集成功能进行重构
- refactor: 移除集成配置中的 Token
- chore: 编辑用户时禁用邮箱字段
- chore: 调整搜索设置
Coco Server 相关截图:

Easysearch v2.0
INFINI Easysearch 是一个分布式的搜索型数据库,实现非结构化数据检索、全文检索、向量检索、地理位置信息查询、组合索引查询、多语种支持、聚合分析等。Easysearch 可以完美替代 Elasticsearch,同时添加和完善多项企业级功能。Easysearch 助您拥有简洁、高效、易用的搜索体验。
Easysearch 本次更新如下:
💥 重大变更(Breaking Changes)
- 正式发布 Easysearch 2.0 版本,底层 Lucene 更新到 9.12.2
- 新增 ui 插件,为 Easysearch 提供了轻量级界面化管理功能,不再依赖第三方对集群进行管理,真正做到开箱即用
🚀 功能特性 (Features)
- 兼容 1.15.x 版本的索引,可无缝升级
- 新增 UI 插件,涵盖从集群,节点,索引,到分片等不同维度的监控和管理功能
- 支持关闭 security 进入 UI
✈️ 改进优化 (Improvements)
- range 查询,按数字类型字段排序,相比旧版本效率大幅提升
Easysearch UI 相关截图:

Console v1.30
INFINI Console 是一款开源的非常轻量级的多集群、跨版本的搜索基础设施统一管控平台。通过对流行的搜索引擎基础设施进行跨版本、多集群的集中纳管,企业可以快速方便的统一管理企业内部的不同版本的多套搜索集群。
Console 本次详细更新记录如下:
🚀 功能特性 (Features)
- feat: 支持百分比聚合
- feat: 为初始化管理员用户增加密码强度校验 (#250)
- feat: 支持 Nginx 代理下的子目录路径 (#243)
🐛 问题修复(Bug Fixes)
- fix: 修复了索引映射 (mapping) 在滚动查询 (scroll) 后不正确的问题 (#248)
- fix: 修复索引 mapping 在滚动操作之后不对的问题
- fix: 修复集群监控设置显示错误
✈️ 改进优化 (Improvements)
- chore: 删除集群后减少 Agent 上报异常错误日志输出 (#258)
- 此版本包含了底层 Framework v1.3 的更新,解决了一些常见问题,并增强了整体稳定性和性能。虽然 Console 本身没有直接的变更,但从 Framework 中继承的改进间接地使 Console 受益。
Gateway v1.30
INFINI Gateway 是一个开源的面向搜索场景的高性能数据网关,所有请求都经过网关处理后再转发到后端的搜索业务集群。基于 INFINI Gateway 可以实现索引级别的限速限流、常见查询的缓存加速、查询请求的审计、查询结果的动态修改等等。
Gateway 本次更新如下:
🚀 功能特性 (Features)
- feat(rewrite_to_bulk):使文档更新兼容 Elasticsearch 6.x (#112)
🐛 问题修复(Bug Fixes)
- fix: 修复心跳连接的潜在泄漏问题 (#107)
✈️ 改进优化 (Improvements)
- 改进 ReverseProxy 的锁机制和节点发现逻辑 (#111)
- 此版本包含了底层 Framework v1.3 的更新,解决了一些常见问题,并增强了整体稳定性和性能。虽然 Gateway 本身没有直接的变更,但从 Framework 中继承的改进间接地使 Gateway 受益。
Agent v1.30
INFINI Agent 负责采集和上传 Elasticsearch, Easysearch, Opensearch 集群的日志和指标信息,通过 INFINI Console 管理,支持主流操作系统和平台,安装包轻量且无任何外部依赖,可以快速方便地安装。
Agent 本次更新如下:
🚀 功能特性 (Features)
在 Kubernetes 环境下通过环境变量 http.port 探测 Easysearch 的 HTTP 端口
✈️ 改进优化 (Improvements)
- 此版本包含了底层 Framework v1.3 的更新,解决了一些常见问题,并增强了整体稳定性和性能。虽然 Agent 本身没有直接的变更,但从 Framework 中继承的改进间接地使 Agent 受益。
Loadgen v1.30
INFINI Loadgen 是一款开源的专为 Easysearch、Elasticsearch、OpenSearch 设计的轻量级性能测试工具。
Loadgen 本次更新如下:
✈️ 改进优化 (Improvements)
- 此版本包含了底层 Framework v1.3 的更新,解决了一些常见问题,并增强了整体稳定性和性能。虽然 Loadgen 本身没有直接的变更,但从 Framework 中继承的改进间接地使 Loadgen 受益。
Framework 1.3.0
INFINI Framework 是 INFINI Labs 基于 Golang 的产品的核心基础,已开源。该框架以开发者为中心设计,简化了构建高性能、可扩展且可靠的应用程序的过程。
Framework 本次更新如下:
🚀 功能特性 (Features)
- feat: add delete by query v2 #194
- feat: support aggregation queries in orm
- feat: add support for query_string query
- feat: allow to read http request body multi-times #212
- feat: add support for Elasticsearch cat allocation API
- feat: support custom write operation type for indexing_merge processor
- feat: add util to parse time with local timezone #217
- feat: add PKCS#12 certificate support for http client config
- feat: add security module, with rbac,sharing,oauth client etc.
- feat: add entity_card module
- feat: add abstract layer for user or teams search
- feat: add util to normalize folder path
- feat: add some string utils
- feat: allow force update all mappings for existing indices
- feat: add several http filters
- feat: add util to execute http requests via curl
🐛 问题修复 (Bug Fixes)
- fix: localhost/127.0.0.1 with noproxy #185
- fix: cluster metadata lost #200
- fix: fix security permission cache
- fix: fix incorrect queue capacity check
✈️ 改进 (Improvements)
- chore: less logging for session store change #180
- refactor: initialize index schema using index template
- chore: add generate secure string util func #183
- chore: add validate secure func #184
- refactor: refactoring security structs #191
- refactor: refactoring schema init logic, disable index based template #188
- chore: use safe special chars #190
- chore: reduce log with agent #193
- chore: add util to register http handler #206
- chore: allow access application settings for ui #209
- refactor: refactoring query string parser #216
- chore: update default fuzziness to 3 #215
- chore: avoid using same session name for mulit instances #221
- refactor: refactoring pipeline #222
- chore: enhance bulk indexing - stricter offset validation and improved error handling #224
- refactor: refactoring http utils #226
- refactor: refactoring search response, add score support
- refactor: refactoring ORM module, add generic security hooks
- refactor: add boolean query to orm query builder
- refactor: refactoring access_token, simplify login info
- refactor: move RegisterAllowOriginFunc to core
更多详情请查看以下各产品的 Release Notes 或联系我们的技术支持团队!
- Coco AI App
- Coco AI Server
- INFINI Easysearch
- INFINI Gateway
- INFINI Console
- INFINI Agent
- INFINI Loadgen
- INFINI Framework
期待反馈
欢迎下载体验使用,如果您在使用过程中遇到如何疑问或者问题,欢迎前往 INFINI Labs Github(https://github.com/infinilabs) 中的对应项目中提交 Feature Request 或提交 Bug。
下载地址: https://infinilabs.cn/download
邮件:hello@infini.ltd
电话:(+86) 400-139-9200
Discord:https://discord.gg/4tKTMkkvVX
也欢迎大家微信扫码添加小助手(INFINI-Labs),加入用户群一起讨论交流。

关于极限科技(INFINI Labs)

极限科技,全称极限数据(北京)科技有限公司,是一家专注于实时搜索与数据分析的软件公司。旗下品牌极限实验室(INFINI Labs)致力于打造极致易用的数据探索与分析体验。
极限科技是一支年轻的团队,采用天然分布式的方式来进行远程协作,员工分布在全球各地,希望通过努力成为中国乃至全球企业大数据实时搜索分析产品的首选,为中国技术品牌输出添砖加瓦。
使用 Docker Compose 轻松实现 INFINI Console 离线部署与持久化管理
开源项目 • INFINI Labs 小助手 发表了文章 • 0 个评论 • 10429 次浏览 • 2025-10-31 18:04
系列回顾与引言
在我们的 INFINI 本地环境搭建系列博客中:
- 第一篇《搭建持久化的 INFINI Console 与 Easysearch 容器环境》,我们深入探讨了如何使用基础的
docker run命令,一步步构建起 Console 和 Easysearch 服务,并重点解决了数据持久化的问题。 - 第二篇《使用 Docker Compose 简化 INFINI Console 与 Easysearch 环境搭建》,我们学习了如何利用 Docker Compose 的声明式配置,将多容器应用的定义和管理变得更加简洁高效。
- 第三篇《一键启动:使用 start-local 脚本轻松管理 INFINI Console 与 Easysearch 本地环境》,我们介绍了如何在联网环境下,一键安装 INFINI Console。
接下来,我们将聚焦于离线环境,详细讲解如何使用 Docker Compose 部署 INFINI Console 和 Easysearch。

简介
INFINI Console 是一款强大的集群管理与可观测性平台,而 INFINI Easysearch 则是一个轻量级、高性能的搜索与分析引擎。官方提供的离线部署包将两者整合,非常适合在无外网或需要快速搭建演示环境的场景下使用。

本文将详细介绍如何下载资源、正确加载镜像、以及最关键的——如何根据您的需求修改 docker-compose.yml 中的各项配置。
1. 准备工作
请确保您的环境中已安装以下软件:
- Docker
- Docker Compose
2. 下载离线资源
从官方地址下载两个核心文件:
infini-console.tar.gz: 包含docker-compose.yml和相关脚本。infini-console-easysearch-1.14.2.tar: 包含infinilabs/console和infinilabs/easysearch的 Docker 镜像。
wget https://release.infinilabs.com/easysearch/archive/offline/amd64/infini-console.tar.gz
wget https://release.infinilabs.com/easysearch/archive/offline/amd64/infini-console-easysearch-1.14.2.tar
3. 正确加载 Docker 镜像
注意:infini-console-easysearch-1.14.2.tar 是一个包含多个镜像的归档包,不能直接使用 docker load 加载。
正确的加载步骤如下:
-
创建目录并解压镜像归档包:
mkdir -p images tar -xvf infini-console-easysearch-1.14.2.tar -C images这会将
console.tar和easysearch.tar等文件解压到images/目录中。 -
批量加载所有镜像:
cd images ls *.tar | xargs -I {} docker load -i {}该命令会自动为目录下的每个
.tar文件执行docker load操作。 - 验证镜像加载结果:
docker images您应该能看到
infinilabs/console:1.29.8和infinilabs/easysearch:1.14.2等镜像。
4. 修改配置文件
解压 infini-console.tar.gz 后,找到 .env 文件。所有自定义配置都应在此文件中修改。
以下是各项配置的详细说明和修改建议:
核心路径配置
WORK_DIR_ABS=/data/infini-console
- 作用: 定义所有持久化数据(日志、配置、索引)的根目录。
- 修改建议: (必改) 强烈建议修改为您服务器上一个有足够空间的路径,例如
/opt/infini-console。确保该目录存在且 Docker 拥有写入权限。
网络配置
APP_NETWORK_NAME=infini-local-net
- 作用: 定义 Docker 内部网络的名称。
- 修改建议: 通常无需修改。
Console 配置
CONSOLE_IMAGE=infinilabs/console
CONSOLE_VERSION_TAG=1.29.8
CONSOLE_CONTAINER_NAME=infini-console
CONSOLE_PORT_HOST=9000
CONSOLE_PORT_CONTAINER=9000
- 作用: 定义 Console 的镜像、版本、容器名及端口映射。
- 修改建议:
CONSOLE_PORT_HOST: 如果宿主机的9000端口已被占用,请修改为其他可用端口(如8080)。
Easysearch 配置
EASYSEARCH_IMAGE=infinilabs/easysearch
EASYSEARCH_VERSION_TAG=1.14.2
EASYSEARCH_NODES=1
EASYSEARCH_CLUSTER_NAME=infini-console
- 作用: 定义 Easysearch 的镜像、版本、节点数和集群名。
- 修改建议:
EASYSEARCH_NODES: 单机部署保持1即可。
访问与安全配置
EASYSEARCH_INITIAL_ADMIN_PASSWORD=ShouldChangeme123.
- 作用: 设置 Easysearch
admin用户的初始密码。 - 修改建议: (必改) 请务必将其替换为一个强密码。登录 Console 时需要使用此密码。
EASYSEARCH_HTTP_PORT_HOST=9200
EASYSEARCH_TRANSPORT_PORT_HOST=9300
- 作用: 定义 Easysearch HTTP 和 Transport 接口在宿主机上的映射端口。
- 修改建议: 如果
9200或9300端口冲突,请修改。
JVM 参数配置
ES_JAVA_OPTS_DEFAULT="-Xms8g -Xmx8g"
- 作用: 设置 Easysearch 的 JVM 堆内存大小。
- 修改建议: (必改) 请根据服务器物理内存进行调整,避免超过物理内存的 50%。
- 8GB 内存服务器: 建议设为
-Xms2g -Xmx2g。 - 16GB 内存服务器: 建议设为
-Xms4g -Xmx4g。
- 8GB 内存服务器: 建议设为
数据持久化路径
CONSOLE_HOST_DATA_SUBPATH_REL=console/data
CONSOLE_HOST_LOGS_SUBPATH_REL=console/logs
EASYSEARCH_HOST_NODES_BASE_SUBPATH_REL=easysearch
- 作用: 定义数据和日志在
WORK_DIR_ABS下的相对子路径。 - 修改建议: 通常无需修改。
5. 启动服务
完成配置修改后,在 docker-compose.yml 所在目录下执行:
docker-compose up -d
等待服务完全启动。
6. 访问控制台
打开浏览器,访问 http://<你的服务器IP>:9000。
使用默认用户名 admin 和您在 EASYSEARCH_INITIAL_ADMIN_PASSWORD 中设置的密码进行初始化。
总结
通过以上步骤,您可以灵活地部署一套功能完整的 INFINI Console + Easysearch 环境。关键在于理解并根据实际情况修改 .env 文件中的参数,特别是 WORK_DIR_ABS、EASYSEARCH_INITIAL_ADMIN_PASSWORD 和 ES_JAVA_OPTS_DEFAULT,这能确保部署的稳定性和安全性。
希望这篇详细的指南能帮助您顺利完成部署!
作者:罗厚付,极限科技(INFINI Labs)云上产品设计与研发负责人,拥有多年安全风控及大数据系统架构经验,主导过多个核心产品的设计与落地,日常负责运维超大规模 ES 集群(800+节点/1PB+数据)。
原文:https://infinilabs.cn/blog/2025/console-easysearch-with-docker-compose-offline/
搜索百科(5):Easysearch — 自主可控的国产分布式搜索引擎
Easysearch • liaosy 发表了文章 • 0 个评论 • 7083 次浏览 • 2025-10-20 15:54
大家好,我是 INFINI Labs 的石阳。
欢迎关注 《搜索百科》 专栏!每天 5 分钟,带你速览一款搜索相关的技术或产品,同时还会带你探索它们背后的技术原理、发展故事及上手体验等。
在上一篇我们介绍了 OpenSearch —— 那个因协议争议而诞生的开源搜索分支。今天,我们把目光转向国内,聊聊极限科技研发的一款轻量级搜索引擎:Easysearch。
引言
在搜索技术的世界里,从 Lucene 的出现到 Solr、Elasticsearch 的崛起,搜索引擎技术已经发展了二十余年。然而,随着开源协议的变更与国际形势的变化,国产自主搜索引擎的需求愈发迫切。在这样的背景下,Easysearch 作为一款自主可控、轻量高效、兼容 Elasticsearch 的分布式搜索引擎应运而生,为国内企业带来了全新的选择。

Easysearch 概述
Easysearch 是一款分布式搜索型数据库,实现非结构化数据检索、全文检索、向量检索、地理位置信息查询、组合索引查询、多语种支持、聚合分析、AI 集成等。Easysearch 衍生自开源协议 Apache 2.0 的 Elasticsearch 7.10 版本,并不断往前迭代更新,紧跟 Lucene 最新版本的更新。Easysearch 可以替代 Elasticsearch,同时添加和完善多项企业级功能。
- 首次发布:2023 年 4 月
- 最新版本:1.15.4(截止 2025 年 10 月)
- 主导企业:极限科技 (INFINI Labs)
- 官方网址:https://easysearch.cn
诞生背景:为什么要有 Easysearch?
Easysearch 由极限科技(INFINI Labs)团队推出。项目的起点源于团队长期在搜索引擎和大数据领域的深厚实践积累,团队深刻认识到国内企业在使用 Elasticsearch 时普遍面临以下痛点:
- 开源协议变化带来的商业风险 —— Elastic 于 2021 年将许可更改为 SSPL,导致社区分裂,增加了企业在合规和商用上的不确定性;
- 高并发与高可靠性场景下对稳定可控方案的需求 —— 企业级应用亟需一个性能可靠、可深度优化的搜索基础设施;
- 技术栈自主可控的迫切需求 —— 随着国产化进程加快,国内生态中缺乏轻量化、易部署、且完全可控的搜索引擎产品;
- 本地化服务与快速响应能力的缺口 —— 国内企业更需要本地团队提供高效的技术支持与服务,对本土化、个性化功能需求能得到及时响应与反馈。
基于这些考虑,Easysearch 在设计之初就明确了目标:构建一款兼容 Elasticsearch API、简洁易用、性能出众且完全自主可控的国产搜索引擎。
核心特性
- 轻量级:安装包大小不到 60 MB,安装部署简洁,资源占用低,开箱即用;
- 跨平台:支持主流操作系统和 CPU 架构,支持国产信创运行环境;
- 高性能:针对不同场景进行的极致优化,可用更少硬件成本获得更高服务性能,降本增效。
- 稳定可靠:修复大量内核问题,解决内存泄露,集群卡顿、查询缓慢等问题,久经严苛业务环境考验。
- 安全增强:默认就提供完整的企业级安全功能,支持 LDAP/AD 集成,支持索引、文档、字段粒度细权管控。
- 兼容性强:兼容 Elasticsearch 7.x 的 REST API 和数据格式,迁移成本低;
- 可视化运维:无需 Kibana 即可通过内置 Web UI 插件界面管理索引、节点与监控指标等。
对比优势
| 对比维度 | Easysearch | Elasticsearch | OpenSearch |
|---|---|---|---|
| 用户协议 | 社区免费+商业授权 | SSPL/AGPL v3 | Apache 2.0 |
| API 兼容性 | 高度兼容 ES | 原生 | 高度兼容 ES |
| 最小安装体积 | 57MB | 482MB | 682MB |
| 部署复杂度 | 简单 | 中等 | 相对复杂 |
| 信创环境支持 | 全面兼容 | 无 | 无 |
| 可视化管理 | 开箱即用管理后台 | 需独立部署 Kibana | 需独立部署 OpenSearch Dashboards |
| 本地化与中文支持 | 强 | 弱 | 弱 |
| AI 插件支持 | 较弱 | 强 | 较强 |
| 社区与生态 | 快速成长中 | 成熟广泛 | 活跃增长 |
快速开始:5 分钟体验 Easysearch
1. 使用 Docker 启动
# 直接运行镜像使用随机密码(数据及配置未持久化)
docker run --name easysearch \
--ulimit memlock=-1:-1 \
-p 9200:9200 \
infinilabs/easysearch:1.15.4
2. 验证集群状态
curl -ku "username:password" -X GET "https://localhost:9200/"
返回结果示例:
{
"name": "easysearch-node",
"cluster_name": "easysearch-6yhwn91v80gf",
"cluster_uuid": "Gfu_fuF1QViJfeUWVbiFCA",
"version": {
"distribution": "easysearch",
"number": "1.15.4",
"distributor": "INFINI Labs",
"build_hash": "9110128946b0af3de639966cfa74b5498346949d",
"build_date": "2025-10-14T03:30:41.948590Z",
"build_snapshot": false,
"lucene_version": "8.11.4",
"minimum_wire_lucene_version": "7.7.0",
"minimum_lucene_index_compatibility_version": "7.7.0"
},
"tagline": "You Know, For Easy Search!"
}
3. 索引与搜索示例
# 写入文档
curl -ku "username:password" -X POST "https://localhost:9200/my_index/_doc" -H 'Content-Type: application/json' -d'
{
"title": "Easysearch 入门",
"content": "这是一个轻量级搜索引擎的示例文档。",
"tags": ["搜索", "国产", "轻量级"]
}'
# 搜索文档
curl -ku "username:password" -X GET "https://localhost:9200/my_index/_search" -H 'Content-Type: application/json' -d'
{
"query": {
"match": {
"content": "搜索引擎"
}
}
}'
4. 使用 Easysearch UI
Easysearch 提供了轻量级界面化管理功能,不再依赖第三方组件即可对集群进行管理,真正做到开箱即用。如果你安装了 Easysearch UI 插件或者下载捆绑包,可通过 https://localhost:9200/\_ui/ 访问,进行节点、索引、分片、查询调试和监控查看等管理。
图 1:系统登录

图 2:集群概览

图 3:节点列表

图 4:节点概览

图 5:索引列表

图 6:索引概览

图 7:分片管理

图 8:开发工具

以上仅列出了一些基本功能,其他如安全管理、主从复制、备份管理、生命周期管理等更多高级功能由于篇幅限制不一一展示,有兴趣的朋友可自行部署探索。
结语
Easysearch 的诞生,不仅填补了国产搜索引擎在分布式与轻量化领域的空白,也让更多企业在面对开源协议变动与外部技术依赖时,拥有了更加安全、灵活、可控的选择。
它既是国产替代方案的有力代表,更是新一代搜索技术生态的积极探索者,为企业级实时搜索与分析带来新的可能。
🚀 下期预告
下一篇我们将介绍 一款 AI 驱动的现代搜索引擎 - Meilisearch,基于 Rust 构建的开源搜索引擎,性能高、部署简单。号称比 Elasticsearch 快 10 倍,真的这么牛吗?
💬 三连互动
- 你是否在使用或考虑国产搜索替代方案?
- 在实际项目中,你最看重搜索引擎的哪些特性?(性能、兼容性、运维、成本)
- 对 Easysearch 有什么功能上的期待?
对搜索技术感兴趣的朋友,也欢迎加我微信(ID:lsy965145175)备注“搜索百科”,拉你进 搜索技术交流群,一起探讨与学习!
✨ 推荐阅读
- 搜索百科(4):OpenSearch — 开源搜索的新选择
- 搜索百科(3):Elasticsearch — 搜索界的"流量明星"
- 搜索百科(2):Apache Solr — 企业级搜索的开源先锋
- 搜索百科(1):Lucene — 打开现代搜索世界的第一扇门
🔗 参考资源
原文:https://infinilabs.cn/blog/2025/search-wiki-5-easysearch/
【搜索客社区日报】第2125期 (2025-10-13)
社区日报 • Muses 发表了文章 • 0 个评论 • 6757 次浏览 • 2025-10-14 00:02
Easysearch 冷热架构实战
Easysearch • INFINI Labs 小助手 发表了文章 • 0 个评论 • 11020 次浏览 • 2025-10-01 20:11
在之前的文章中,我们介绍了如何使用索引生命周期策略来管理索引。如果要求索引根据其生命周期阶段自动在不同的节点之间迁移,还需要用到冷热架构。我们来看看具体如何实现。
冷热架构
冷热架构其实就是在 Easyearch 集群中定义不同属性的节点,这些节点共同组成冷热架构。比如给所有热节点一个 hot 属性,给所有冷节点一个 cold 属性。在 Easyearch 中分配节点属性是通过配置文件(easysearch.yml)来实现的,比如我要定义一个热节点和一个冷节点,我可以在对应节点的配置文件中添加如下行:
# 热节点添加下面的行
node.attr.temp: hot
# 冷节点添加下面的行
node.attr.temp: cold
有了这些属性,我们就可以指定索引分片在分配时,是落在 hot 节点还是 cold 节点。
查看节点属性
测试环境是个 2 节点的 Easysearch 集群。

比如我创建新索引 test-index,希望它被分配到 hot 节点上。
PUT test-index
{
"settings": {
"number_of_replicas": 0,
"index.routing.allocation.require.temp": "hot"
}
}

可以看到 test-index 索引的分片分配到 hot 节点 node-1 上。我们修改索引分配节点的属性,让其移动到 cold 节点 node-2 上。
PUT test-index/_settings
{
"settings": {
"index.routing.allocation.require.temp": "cold"
}
}

生命周期与冷热架构
在上面的例子中,我们通过索引分配节点属性对索引“坐落”的节点进行了控制。在索引生命周期策略中也支持对该属性进行修改,实现索引根据生命周期阶段自动在不同的节点之间移动的目的。
比如我们定义一个简单的索引策略:
- 索引创建后进入 hot 阶段,此阶段的索引被分配到 hot 节点
- 创建索引 3 分钟后,索引进入 cold 阶段,此阶段索引分片移动到 cold 节点
创建策略
PUT _ilm/policy/ilm_test
{
"policy": {
"phases": {
"hot": {
"min_age": "0m",
},
"cold": {
"min_age": "3m",
"actions": {
"allocate" : {
"require" : {
"temp": "cold"
}
}
}
}
}
}
}
生命周期策略后台是定期触发的任务,为了更快的观测到效果,可以修改任务触发周期为每分钟 1 次。
PUT _cluster/settings
{
"transient": {
"index_lifecycle_management.job_interval":"1"
}
}
创建索引模板
创建完索引生命周期策略,还需要索引模板把索引和生命周期策略关联起来。我们创建一个模板把所有 ilm_test 开头的索引与 ilm_test 生命周期策略关联,为了便于观察,指定索引没有副本分片。
PUT _template/ilm_test
{
"order" : 100000,
"index_patterns" : [
"ilm_test*"
],
"settings" : {
"index" : {
"lifecycle" : {
"name" : "ilm_test"
},
"number_of_replicas" : "0",
"routing.allocation.require.temp": "hot"
}
}
}
创建索引
创建一个 ilm_test 开头的索引,应用上一步创建的索引模板。
POST ilm_test_1/_doc
{
"test":"test"
}
查看索引分片分配情况。

目前索引存储在 node-1 节点,按计划 3 分钟后将会移动到 node-2 上。


至此我们已通过索引生命周期策略实现了索引分片的移动,其实支持的操作还有很多,比如: rollover、close、snapshot 等,详情请参阅官方文档。
有任何问题,欢迎加我微信沟通。

关于 Easysearch

INFINI Easysearch 是一个分布式的搜索型数据库,实现非结构化数据检索、全文检索、向量检索、地理位置信息查询、组合索引查询、多语种支持、聚合分析等。Easysearch 可以完美替代 Elasticsearch,同时添加和完善多项企业级功能。Easysearch 助您拥有简洁、高效、易用的搜索体验。
Easysearch 字段'隐身'之谜:source_reuse 与 ignore_above 的陷阱解析
Easysearch • INFINI Labs 小助手 发表了文章 • 0 个评论 • 11248 次浏览 • 2025-09-30 16:08
背景问题
前阵子,社区有小伙伴在使用 Easysearch 的数据压缩功能时发现,在开启 source_reuse 和 ZSTD 后,一个字段的内容看不到了。
索引的设置如下:
{
......
"settings": {
"index": {
"codec": "ZSTD",
"source_reuse": "true"
}
},
"mappings": {
"dynamic_templates": [
{
"message_field": {
"path_match": "message",
"mapping": {
"norms": false,
"type": "text"
},
"match_mapping_type": "string"
}
},
{
"string_fields": {
"mapping": {
"norms": false,
"type": "text",
"fields": {
"keyword": {
"ignore_above": 256,
"type": "keyword"
}
}
},
"match_mapping_type": "string",
"match": "*"
}
}
]
......
}
然后产生的一个多字段内容能被搜索到,但是不可见。
类似于下面的这个情况:

原因分析
我们先来看看整个字段展示经历的环节:

- 字段写入索引的时候,不仅写了 text 字段也写了 keyword 字段。
- keyword 字段产生倒排索引的时候,会忽略掉长度超过 ignore_above 的内容。
- 因为开启了 source_reuse,_source 字段中与 doc_values 或倒排索引重复的部分会被去除。
- 产生的数据文件进行了 ZSTD 压缩,进一步提高了数据的压缩效率。
- 索引进行倒排或者 docvalue 的查询,检索到这个文档进行展示。
- 展示的时候通过文档 id 获取
_source或者docvalues_fields的内容来展示文本,但是文本内容是空的。
其中步骤 4 中的 ZSTD 压缩,是作用于数据文件的,并不对数据内容进行修改。因此,我们来专注于其他环节。
问题复现
首先,这个字段索引的配置也是一个 es 常见的设置,并不会带来内容显示缺失的问题。
"mapping": {
"type": "text",
"fields": {
"keyword": {
"ignore_above": 256,
"type": "keyword"
}
}
},
那么,source_reuse 就成了我们可以重点排查的环节。
source 发生了什么
source_reuse 的作用描述如下:
source_reuse: 启用 source_reuse 配置项能够去除 _source 字段中与 doc_values 或倒排索引重复的部分,从而有效减小索引总体大小,这个功能对日志类索引效果尤其明显。
source_reuse 支持对以下数据类型进行压缩:keyword,integer,long,short,boolean,float,half_float,double,geo_point,ip, 如果是 text 类型,需要默认启用 keyword 类型的 multi-field 映射。 以上类型必须启用 doc_values 映射(默认启用)才能压缩。
这是一个对 _source 字段进行产品化的功能实现。为了减少索引的存储体量,简单粗暴的操作是直接将_source字段进行关闭,利用其他数据格式去存储,在查询的时候对应的利用 docvalue 或者 indexed 去展示文本内容。
那么 _source关闭后,会不会也有这样的问题呢?
测试的步骤如下:
# 1. 创建不带source的双字段索引
PUT test_source
{
"mappings": {
"_source": {
"enabled": false
},
"properties": {
"msg": {
"type": "text",
"fields": {
"keyword": {
"ignore_above": 256,
"type": "keyword"
}
}
}
}
}
}
# 2. 写入测试数据
POST test_source/_doc/1
{"msg":"""[08-27 14:28:45] [DBG] [config.go:273] config contain variables, try to parse with environments
[08-27 14:28:45] [DBG] [config.go:214] load config files: []
[08-27 14:28:45] [INF] [pipeline.go:419] creating pipeline: pipeline_logging_merge
[08-27 14:28:45] [INF] [pipeline.go:419] creating pipeline: ingest_pipeline_logging
[08-27 14:28:45] [INF] [pipeline.go:419] creating pipeline: async_messages_merge
[08-27 14:28:45] [INF] [pipeline.go:419] creating pipeline: metrics_merge
[08-27 14:28:45] [INF] [pipeline.go:419] creating pipeline: request_logging_merge
[08-27 14:28:45] [INF] [pipeline.go:419] creating pipeline: ingest_merged_requests
[08-27 14:28:45] [INF] [pipeline.go:419] creating pipeline: async_ingest_bulk_requests
[08-27 14:28:45] [INF] [module.go:159] started module: pipeline
[08-27 14:28:45] [DBG] [module.go:163] all system module are started
[08-27 14:28:45] [DBG] [floating_ip.go:348] setup floating_ip, root privilege are required
[08-27 14:28:45] [DBG] [queue_config.go:121] init new queue config:e60457c6eae50a4eabbb62fc1001dccc,bulk_requests
[08-27 14:28:45] [DBG] [queue_config.go:121] init new queue config:e60457c6eae50a4eabbb62fc1001dccc,bulk_requests
[08-27 14:28:45] [DBG] [queue_config.go:121] init new queue config:e60457c6eae50a4eabbb62fc1001dccc,bulk_requests
[08-27 14:28:45] [DBG] [processor.go:139] generated new processors: indexing_merge
[08-27 14:28:45] [DBG] [pipeline.go:466] processing pipeline_v2: metrics_merge
[08-27 14:28:45] [DBG] [processor.go:139] generated new processors: when
[08-27 14:28:45] [DBG] [pipeline.go:466] processing pipeline_v2: ingest_merged_requests
[08-27 14:28:45] [DBG] [processor.go:139] generated new processors: indexing_merge
[08-27 14:28:45] [DBG] [pipeline.go:466] processing pipeline_v2: request_logging_merge
[08-27 14:28:45] [DBG] [processor.go:139] generated new processors: indexing_merge
[08-27 14:28:45] [DBG] [pipeline.go:466] processing pipeline_v2: async_messages_merge
[08-27 14:28:45] [DBG] [processor.go:139] generated new processors: bulk_indexing
[08-27 14:28:45] [DBG] [pipeline.go:466] processing pipeline_v2: ingest_pipeline_logging
[08-27 14:28:45] [DBG] [queue_config.go:121] init new queue config:1216c96eb876eee5b177d45436d0a362,gateway-pipeline-logs
[08-27 14:28:45] [DBG] [processor.go:139] generated new processors: bulk_indexing
[08-27 14:28:45] [DBG] [processor.go:139] generated new processors: indexing_merge
[08-27 14:28:45] [DBG] [pipeline.go:466] processing pipeline_v2: pipeline_logging_merge
[08-27 14:28:45] [DBG] [pipeline.go:466] processing pipeline_v2: async_ingest_bulk_requests
[08-27 14:28:45] [DBG] [badger.go:110] init badger database [queue_consumer_commit_offset]
[08-27 14:28:45] [INF] [floating_ip.go:290] floating_ip entering standby mode
[08-27 14:28:45] [DBG] [badger.go:110] init badger database [dis_locker]
[08-27 14:28:45] [DBG] [time.go:208] refresh low precision time in background
[08-27 14:28:45] [DBG] [domain_actions.go:278] elasticsearch metadata [backup] was not found
[08-27 14:28:45] [DBG] [bulk_indexing.go:355] metadata for [backup] is nil
[08-27 14:28:50] [INF] [module.go:178] started plugin: floating_ip
[08-27 14:28:50] [INF] [module.go:178] started plugin: force_merge
[08-27 14:28:50] [DBG] [network.go:78] network io stats will be included for map[]
[08-27 14:28:50] [INF] [module.go:178] started plugin: metrics
[08-27 14:28:50] [INF] [module.go:178] started plugin: statsd
[08-27 14:28:50] [DBG] [entry.go:100] reuse port 0.0.0.0:7005
[08-27 14:28:50] [DBG] [metrics.go:205] collecting network metrics
[08-27 14:28:50] [DBG] [metrics.go:174] collecting instance metrics
[08-27 14:28:50] [DBG] [elasticsearch.go:128] init elasticsearch proxy instance: prod
[08-27 14:28:50] [DBG] [filter.go:103] generated new filters: when, elasticsearch
[08-27 14:28:50] [DBG] [entry.go:142] apply filter flow: [*] [/_bulk] [ filters ]
[08-27 14:28:50] [DBG] [entry.go:142] apply filter flow: [*] [/{any_index}/_bulk] [ filters ]
[08-27 14:28:50] [DBG] [elasticsearch.go:128] init elasticsearch proxy instance: prod
[08-27 14:28:50] [DBG] [filter.go:103] generated new filters: request_path_limiter, elasticsearch
[08-27 14:28:50] [INF] [module.go:178] started plugin: gateway
[08-27 14:28:50] [DBG] [module.go:182] all user plugin are started
[08-27 14:28:50] [INF] [module.go:184] all modules are started
[08-27 14:28:50] [INF] [app.go:556] gateway is up and running now.
[08-27 14:28:50] [DBG] [domain_actions.go:278] elasticsearch metadata [backup] was not found
[08-27 14:28:50] [DBG] [bulk_indexing.go:355] metadata for [backup] is nil
[08-27 14:28:55] [DBG] [domain_actions.go:278] elasticsearch metadata [backup] was not found
[08-27 14:28:55] [DBG] [bulk_indexing.go:355] metadata for [backup] is nil
[08-27 14:29:00] [DBG] [metrics.go:205] collecting network metrics
[08-27 14:29:00] [DBG] [metrics.go:174] collecting instance metrics
[08-27 14:29:00] [DBG] [domain_actions.go:278] elasticsearch metadata [backup] was not found
[08-27 14:29:00] [DBG] [bulk_indexing.go:355] metadata for [backup] is nil
[08-27 14:29:05] [DBG] [domain_actions.go:278] elasticsearch metadata [backup] was not found
[08-27 14:29:05] [DBG] [bulk_indexing.go:355] metadata for [backup] is nil
[08-27 14:29:10] [DBG] [metrics.go:205] collecting network metrics
[08-27 14:29:10] [DBG] [metrics.go:174] collecting instance metrics
[08-27 14:29:10] [DBG] [domain_actions.go:278] elasticsearch metadata [backup] was not found"""}
# 3. 查询数据
GET test_source/_search
此时,可以看到,存入的文档检索出来是空的

_source 字段是用于索引时传递的原始 JSON 文档主体。它本身未被索引成倒排(因此不作用于 query 阶段),只是在执行查询时用于 fetch 文档内容。
对于 text 类型,关闭_source,则字段内容自然不可被查看。
而对于 keyword 字段,查看_source也是不行的。可是 keyword 不仅存储source,还存储了 doc_values。因此,对于 keyword 字段类型,可以考虑关闭_source,使用 docvalue_fields 来查看字段内容。
测试如下:
# 1. 创建测试条件的索引
PUT test_source2
{
"mappings": {
"_source": {
"enabled": false
},
"properties": {
"msg": {
"type": "keyword"
}
}
}
}
# 2. 写入数据
POST test_source2/_doc
{"msg":"1111111"}
# 3. 使用 docvalue_fields 查询数据
POST test_source2/_search
{"docvalue_fields": ["msg"]}
# 返回结果
{
"took": 1,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 1,
"hits": [
{
"_index": "test_source2",
"_type": "_doc",
"_id": "yBvTj5kBvrlGDwP29avf",
"_score": 1,
"fields": {
"msg": [
"1111111"
]
}
}
]
}
}
在如果是 text 类型,需要默认启用 keyword 类型的 multi-field 映射。 以上类型必须启用 doc_values 映射(默认启用)才能压缩。这句介绍里,也可以看到 source_reuse 的正常使用需要 doc_values。_那是不是一样使用 doc_values 进行内容展示呢?既然用于 docvalue_fields 内容展示,为什么还是内容看不了(不可见)呢?_
keyword 的 ignore_above
仔细看问题场景里 keyword 的配置,它使用了 ignore_above。那么,会不会是这里的问题?
我们将 ignore_above 配置带入上面的测试,这里为了简化测试,ignore_above 配置为 3。为区分问题现象,这里两条长度不同的文本进去,一条为 11,一条为1111111,可以作为参数作用效果的对比。
# 1. 创建测试条件的索引,ignore_above 设置为3
PUT test_source3
{
"mappings": {
"_source": {
"enabled": false
},
"properties": {
"msg": {
"type": "keyword",
"ignore_above": 3
}
}
}
}
# 2. 写入数据,
POST test_source3/_doc
{"msg":"1111111"}
POST test_source3/_doc
{"msg":"11"}
# 3. 使用 docvalue_fields 查询数据
POST test_source3/_search
{"docvalue_fields": ["msg"]}
# 返回内容
{
"took": 363,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 2,
"relation": "eq"
},
"max_score": 1,
"hits": [
{
"_index": "test_source3",
"_type": "_doc",
"_id": "yhvjj5kBvrlGDwP22KsG",
"_score": 1
},
{
"_index": "test_source3",
"_type": "_doc",
"_id": "yxvzj5kBvrlGDwP2Nav6",
"_score": 1,
"fields": {
"msg": [
"11"
]
}
}
]
}
}
OK! 问题终于复现了。我们再来看看作为关键因素的 ignore_above 参数是用来干嘛的。
ignore_above:任何长度超过此整数值的字符串都不应被索引。默认值为 2147483647。默认动态映射会创建一个 ignore_above 设置为 256 的 keyword 子字段。
也就是说,ignore_above 在(倒排)索引时会截取内容,防止产生的索引内容过长。
但是从测试的两个文本来看,面对在参数范围内的文档,docvalues 会正常创建,而超出参数范围的文本而忽略创建(至于这个问题背后的源码细节我们可以另外开坑再鸽,此处省略)。
那么,在 source_reuse 下,keyword 的 ignore_above 是不是起到了相同的作用呢?
我们可以在问题场景上去除 ignore_above,参数试试,来看下面的测试:
# 1. 创建测试条件的索引,使用 source_reuse,设置 ignore_above 为3
PUT test_source4
{
"settings": {
"index": {
"source_reuse": "true"
}
},
"mappings": {
"properties": {
"msg": {
"type": "text",
"fields": {
"keyword": {
"ignore_above": 3,
"type": "keyword"
}
}
}
}
}
}
# 2. 写入数据
POST test_source4/_doc
{"msg":"1111111"}
POST test_source4/_doc
{"msg":"11"}
# 3. 使用 docvalue_fields 查询数据
POST test_source4/_search
# 返回内容
{
"took": 1,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 2,
"relation": "eq"
},
"max_score": 1,
"hits": [
{
"_index": "test_source4",
"_type": "_doc",
"_id": "",
"_score": 1,
"_source": {}
},
{
"_index": "test_source4",
"_type": "_doc",
"_id": "zRv2j5kBvrlGDwP2_qsO",
"_score": 1,
"_source": {
"msg": "11"
}
}
]
}
}
可以看到,数据“不可见”的问题被完整的复现了。
小结
从上面一系列针对数据“不可见”问题的测试,我们可以总结以下几点:
- 在 source_reuse 的压缩使用中,keyword 字段的 ignore_ablve 参数尽量使用默认值,不要进行过短的设置(这个 tip 已补充在 Easysearch 文档中)。
- 在 source_reuse 是对数据压缩常见方法-关闭 source 字段的产品化处理,在日志压缩场景中有效且便捷,可以考虑多加利用。
- keyword 的 ignore_above 参数,不仅超出长度范围不进行倒排索引,也不会写入 docvalues。
特别感谢:社区@牛牪犇群
更多 Easysearch 资料请查看 官网文档。
作者:金多安,极限科技(INFINI Labs)搜索运维专家,Elastic 认证专家,搜索客社区日报责任编辑。一直从事与搜索运维相关的工作,日常会去挖掘 ES / Lucene 方向的搜索技术原理,保持搜索相关技术发展的关注。
原文:https://infinilabs.cn/blog/2025/invisibility-in-easysearch-field/
INFINI Labs 产品更新 | Coco AI v0.8 与 Easysearch v1.15 全新功能上线,AI 搜索体验再进化!
资讯动态 • INFINI Labs 小助手 发表了文章 • 0 个评论 • 12021 次浏览 • 2025-09-30 14:49

INFINI Labs 产品更新发布!此次更新主要包括 Coco AI v0.8 新增窗口管理插件,新的插件类型 View,Linux 文件搜索以及更多的连接器;Easysearch v1.15 新增 UI 插件,提供了轻量级界面化管理功能,不再依赖第三方对集群进行管理,真正做到开箱即用,AI 插件正式提供混合搜索能力,结合了关键词搜索和语义搜索,以提升搜索相关性。
以下为详细更新介绍:
Coco AI v0.8
Coco AI 是一款完全开源、跨平台的企业级智能搜索与助手系统,专为现代企业打造。它通过统一搜索入口,连接企业内外部的异构数据源,融合大模型能力,帮助团队高效访问知识,智能决策协作。

Coco AI 本次详细更新记录如下:
Coco AI 客户端 v0.8
功能特性 (Features)
- 改进版本升级,跳过此版本的按钮
- 支持从本地安装插件
- 子插件的 JSON 现在也可以设置 platforms 字段
- 插件设置页面现在可以卸载插件
- 新增插件设置项 'hide_before_open'
- App 搜索索引 app 的名字,现在索引多种语言的 app 名字,英文、中文以及系统语言
- Debug 模式下,支持 context menu
- 为 Linux (GNOME/KDE) 实现文件搜索
- 实现 MacOS 窗口管理插件
- 新增插件类型 View
- 对于文件搜索的结果,现在可以打开文件所在的文件夹
问题修复 (Bug Fixes)
- 修复更新检查失败的问题
- 修复 web 组件,登录状态的问题
- 修复快捷键无法打开插件商店的问题
- 修复设置插件快捷键在 Windows 上崩溃的问题
- 修复无法通过 "coco://" deeplink 登录的问题
- MacOS 文件搜索,确保 mdfind 进程不会成为僵尸进程
- 修复设置窗口打开是空白的问题
- 尽最大努力,确保用户添加的 search path 中的文件会被 indexer 索引
- 修复 MacOS 某些 app 设置空的 CFBundleDisplayName/CFBundleName 导致 app 名字为空的问题
改进优化 (Improvements)
- 将 query_coco_fusion() 函数拆分
- 清理 tauri::AppHandle’s 类型的范型参数 R
- 检查各个安装渠道的 plugin.json 文件,确保合法
- 在 MacOS 上不再为窗口设置 CanJoinAllSpaces 的属性
- 修复 web 组件构建的问题
- 为第三方插件安装的过程上锁
- MacOS/iOS: 支持从 Assets.car 提取 app 图标,从而不再跳过它们
- 放宽 MacOS 文件搜索的条件,避免无法搜到的问题
- 确保 Coco app 在呼出时,不会拿 focus
- 对于 web 组件,跳过登录检查
- 对于 View 插件,处理 HTML 文件,使用 convertFileSrc()处理如下 2 个 tag:"link[href]" and "img[src]"
Coco APP 相关截图

Coco AI 服务端 v0.8
重大变更(Breaking Changes)
- 更新语雀的文档 ID
- 重构数据源同步管理
功能特性 (Features)
- 支持通过路径层次方式访问数据源中的文档
- 处理文档搜索的 path_hierarchy 配置
- Confluence Wiki 连接器
- 为 Notion 连接器提取内容
- 新增网络存储连接器
- 新增 PostgreSQL 连接器
- 新增 MySQL 连接器
- 新增 GitHub 连接器
- 新增 飞书/Lark 连接器
- 新增 GitLab 连接器
- 新增 Salesforce 连接器
- 新增 Gitea 连接器
- 新增 MSSQL 连接器
- 新增 Oracle 连接器
问题修复 (Bug Fixes)
- 修正助手更新逻辑
- 生成唯一图标键以防止意外删除所有图标
- 在 Coco 服务器登录期间修改 access_token URL
- 修复 Web 小部件的权限问题
- 由于在搜索框中导入图标而导致的额外高度
- 全屏模式下页面滚动不工作
- 解决 API 令牌列表分页问题
- MSSQL 分页错误
- 修复 S3 连接器图标
改进优化 (Improvements)
- 移除未使用的 WebSocket API
- 为 Google Drive 添加缺失的根文件夹
- 更新创建/修改连接器页面上的默认连接器设置表单
- 调整数据源详情的标题
- 重构摘要处理器
- 为 Google Drive 添加缺失的文档
- 将 Easysearch 初始管理员密码更新为复杂规则
- 统一许可证头
- 更新默认数据源编辑页面
- 重构 OAuth 连接组件
- 将数据源列表的默认大小设置为 12
- 在设置中添加搜索设置
- 在集成全屏中支持页面模式
- 为列表项添加图标
- 重构非托管模式的 security API
- 支持通过路径层次方式访问 local_fs 连接器中的文档
- 支持通过路径层次方式访问 S3、网络驱动器、GitHub、GitLab 和 Gitee 连接器中的文档
Coco Server 相关截图

Easysearch v1.15
重大变更(Breaking Changes)
- 针对安全模块的角色名称进行规范,废弃不符合规范的角色
- 更新创建搜索管道的 API 的 json 结构和说明文档
功能特性 (Features)
- 新增 ui 插件,涵盖从集群,节点,索引,到分片等不同维度的监控和管理功能以及备份快照、跨集群复制、数据流、热点线程、限流限速配置等管理功能
- ai 插件正式提供混合搜索能力,结合了关键词搜索和语义搜索,以提升搜索相关性
- ai 插件正式提供混合搜索能力
- 允许动态的跨模板重用设置
改进优化 (Improvements)
- index-management 从 plugin 移动到 modules
- 精简证书错误时的日志输出
- 改进 search_pipeline 的统计指标
- 改进角色名称和描述
- 增加 数据流(Data streams)说明文档
- 更新搜索管道相关文档
- 去掉 ILM 配置索引的前缀,并兼容旧索引
Easysearch 新增的 UI 插件为 Easysearch 提供了轻量级界面化管理功能,不再依赖第三方对集群进行管理,真正做到开箱即用。 UI 相关截图如下:








更多详情请查看以下各产品的 Release Notes 或联系我们的技术支持团队!
期待反馈
欢迎下载体验使用,如果您在使用过程中遇到如何疑问或者问题,欢迎前往 INFINI Labs Github(https://github.com/infinilabs) 中的对应项目中提交 Feature Request 或提交 Bug。
下载地址: https://infinilabs.cn/download
邮件:hello@infini.ltd
电话:(+86) 400-139-9200
Discord:https://discord.gg/4tKTMkkvVX
也欢迎大家微信扫码添加小助手(INFINI-Labs),加入用户群一起讨论交流。

关于极限科技(INFINI Labs)

极限科技,全称极限数据(北京)科技有限公司,是一家专注于实时搜索与数据分析的软件公司。旗下品牌极限实验室(INFINI Labs)致力于打造极致易用的数据探索与分析体验。
极限科技是一支年轻的团队,采用天然分布式的方式来进行远程协作,员工分布在全球各地,希望通过努力成为中国乃至全球企业大数据实时搜索分析产品的首选,为中国技术品牌输出添砖加瓦。
招聘!搜索运维工程师(Elasticsearch/Easysearch)-全职/北京/12-20K
求职招聘 • INFINI Labs 小助手 发表了文章 • 0 个评论 • 10308 次浏览 • 2025-09-22 12:33
极限科技诚招全职搜索运维工程师(Elasticsearch/Easysearch)!
欢迎搜索技术热爱者加入我们,共同打造高效、智能的搜索解决方案!
在招岗位介绍
岗位名称
搜索运维工程师(Elasticsearch/Easysearch)
Base:北京
薪资待遇:12-20K,五险一金,双休等
岗位职责
- 负责客户现场的 Elasticsearch/Easysearch/OpenSearch 搜索引擎集群的日常维护、监控和优化,确保集群的高可用性和性能稳定;
- 协助客户进行搜索引擎集群的部署、配置及版本升级;
- 排查和解决 Elasticsearch/Easysearch/OpenSearch 集群中的各种技术问题,及时响应并处理集群异常;
- 根据业务需求设计和实施搜索索引的调优、数据迁移和扩展方案;
- 负责与客户沟通,提供技术支持及相关培训,确保客户需求得到有效满足;
- 制定并实施搜索引擎的备份、恢复和安全策略,保障数据安全;
- 与内部研发团队和外部客户进行协作,推动集群性能改进和功能优化。
岗位要求
- 全日制本科及以上学历,2 年以上运维工作经验;
- 拥有 Elasticsearch/Easysearch/OpenSearch 使用经验,熟悉搜索引擎的原理、架构和相关生态工具(如 Logstash、Kibana 等);
- 熟悉 Linux 操作系统的使用及常见性能调优方法;
- 熟练掌握 Shell 或 Python 等至少一种脚本语言,能够编写自动化运维脚本;
- 具有优秀的问题分析与解决能力,能够快速应对突发情况;
- 具备良好的沟通能力和团队合作精神,能够接受客户驻场工作;
- 提供 五险一金,享有带薪年假及法定节假日。
加分项
- 计算机科学、信息技术或相关专业;
- 具备丰富的大规模分布式系统运维经验;
- 熟悉 Elasticsearch/Easysearch/OpenSearch 分片、路由、查询优化等高级功能;
- 拥有 Elastic Certified Engineer 认证;
- 具备大规模搜索引擎集群设计、扩展和调优经验;
- 熟悉其他搜索引擎技术(如 Solr、Lucene)者优先;
- 熟悉大数据处理相关技术(比如: Kafka 、Flink 等)者优先。
简历投递
- 邮件:hello@infini.ltd(邮件标题请备注姓名 求职岗位)
- 微信:INFINI-Labs (加微请备注求职岗位)

关于极限科技(INFINI Labs)

极限科技,全称极限数据(北京)科技有限公司,是一家专注于实时搜索与数据分析的软件公司。旗下品牌极限实验室(INFINI Labs)致力于打造极致易用的数据探索与分析体验。
极限科技是一支年轻的团队,采用天然分布式的方式来进行远程协作,员工分布在全球各地,希望通过努力成为中国乃至全球企业大数据实时搜索分析产品的首选,为中国技术品牌输出添砖加瓦。
我们在做什么
极限科技(INFINI Labs)正在致力于以下几个核心方向:
1、开发近实时搜索引擎 INFINI Easysearch INFINI Easysearch 是一个分布式的搜索型数据库,实现非结构化数据检索、全文检索、向量检索、地理位置信息查询、组合索引查询、多语种支持、聚合分析等。Easysearch 可以替代 Elasticsearch,同时添加和完善多项企业级功能。Easysearch 助您拥有简洁、高效、易用的搜索体验。详情参见:https://infinilabs.cn
2、打造下一代实时搜索引擎 INFINI Pizza INFINI Pizza 是一个分布式混合搜索数据库系统。我们的使命是充分利用现代硬件和人工智能的潜力,为企业提供量身定制的实时智能搜索体验。我们致力于满足具有挑战性的环境中高并发和高吞吐量的需求,同时提供无缝高效的搜索功能。详情参见:https://pizza.rs
3、为现代团队打造的统一搜索与 AI 智能助手 Coco AI Coco AI 是一款完全开源的统一搜索与 AI 助手平台,它通过统一搜索入口,连接企业内外部的异构数据源,融合大模型能力,帮助团队高效访问知识,智能决策协作。详情参见:https://coco.rs
4、积极参与全球开源生态建设 通过开源 Coco AI、Console、Gateway、Agent、Loadgen 等搜索领域产品和社区贡献,推动全球开源技术的发展,提升中国在全球开源领域的影响力。INFINI Labs Github 主页:https://github.com/infinilabs
5、提供专业服务 为客户提供包括搜索技术支持、迁移服务、定制解决方案和培训在内的全方位服务。
6、提供国产化搜索解决方案 针对中国市场的特殊需求,提供符合国产化标准的搜索产品和解决方案,帮助客户解决使用 Elasticsearch 时遇到的挑战。
极限科技(INFINI Labs)通过这些努力,旨在成为全球领先的实时搜索和数据分析解决方案提供商。
如何使用极限网关实现 Elasticsearch 集群迁移至 Easysearch
Elasticsearch • INFINI Labs 小助手 发表了文章 • 0 个评论 • 12731 次浏览 • 2025-09-21 14:50
之前有博客介绍过通过 Reindex 的方法将 Elasticsearch 的数据迁移到 Easysearch 集群,今天再介绍一个方法,通过 极限网关(INFINI Gateway) 来进行数据迁移。
测试环境
| 软件 | 版本 |
|---|---|
| Easysearch | 1.12.0 |
| Elasticsearch | 7.17.29 |
| INFINI Gateway | 1.29.2 |
迁移步骤
- 选定要迁移的索引
- 在目标集群建立索引的 mapping 和 setting
- 准备 INFINI Gateway 迁移配置
- 运行 INFINI Gateway 进行数据迁移
迁移实战
- 选定要迁移的索引
在 Elasticsearch 集群中选择目标索引:infinilabs 和 test1,没错,我们一次可以迁移多个。

- 在 Easysearch 集群使用源索引的 setting 和 mapping 建立目标索引。(略)
- INFINI Gateway 迁移配置准备
去 github 下载配置,修改下面的连接集群的部分
1 env:
2 LR_GATEWAY_API_HOST: 127.0.0.1:2900
3 SRC_ELASTICSEARCH_ENDPOINT: http://127.0.0.1:9200
4 DST_ELASTICSEARCH_ENDPOINT: http://127.0.0.1:9201
5 path.data: data
6 path.logs: log
7 progress_bar.enabled: true
8 configs.auto_reload: true
9
10 api:
11 enabled: true
12 network:
13 binding: $[[env.LR_GATEWAY_API_HOST]]
14
15 elasticsearch:
16 - name: source
17 enabled: true
18 endpoint: $[[env.SRC_ELASTICSEARCH_ENDPOINT]]
19 basic_auth:
20 username: elastic
21 password: goodgoodstudy
22
23 - name: target
24 enabled: true
25 endpoint: $[[env.DST_ELASTICSEARCH_ENDPOINT]]
26 basic_auth:
27 username: admin
28 password: 14da41c79ad2d744b90c
pipeline 部分修改要迁移的索引名称,我们迁移 infinilabs 和 test1 两个索引。
31 pipeline:
32 - name: source_scroll
33 auto_start: true
34 keep_running: false
35 processor:
36 - es_scroll:
37 slice_size: 1
38 batch_size: 5000
39 indices: "infinilabs,test1"
40 elasticsearch: source
41 output_queue: source_index_dump
42 partition_size: 1
43 scroll_time: "5m"
- 迁移数据
./gateway-mac-arm64
#如果你保存的配置文件名称不叫 gateway.yml,则需要加参数 -config 文件名

数据导入完成后,网关 ctrl+c 退出。

至此,数据迁移就完成了。下一篇我们来介绍 INFINI Gateway 的数据比对功能。
有任何问题,欢迎加我微信沟通。

关于极限网关(INFINI Gateway)

INFINI Gateway 是一个开源的面向搜索场景的高性能数据网关,所有请求都经过网关处理后再转发到后端的搜索业务集群。基于 INFINI Gateway,可以实现索引级别的限速限流、常见查询的缓存加速、查询请求的审计、查询结果的动态修改等等。
官网文档:https://docs.infinilabs.com/gateway
开源地址:https://github.com/infinilabs/gateway
Easysearch 国产替代 Elasticsearch:8 大核心问题解读
Easysearch • liaosy 发表了文章 • 0 个评论 • 11270 次浏览 • 2025-09-18 09:43
近年来,随着数据安全与自主可控需求的不断提升,越来越多的企业开始关注国产化的搜索与日志分析解决方案。作为极限科技推出的国产 Elasticsearch 替代产品,Easysearch 凭借其对搜索场景的深入优化、轻量级架构设计以及对 ES 生态的高度兼容,成为众多企业替代 Elasticsearch 的新选择。

我们在近期与用户的交流中,整理出了大家最关心的八大问题,并将它们浓缩为一篇技术解读,希望帮助你快速了解 Easysearch 的优势与定位。
用户最关心的八大问题
- Easysearch 对数据量的支撑能力如何,能应对 PB 级数据存储吗?
答:完全可以。Easysearch 支持水平扩展,通过增加节点即可线性提升存储与计算能力。在实际应用中,已成功支撑 PB 级日志与检索数据。同时,其存储压缩率相比 Elasticsearch 7.10.2 平均高出 2.5~3 倍,显著节省硬件成本。
- 在高并发写入场景下,Easysearch 和 ES 的性能差异有多大?
答:在相同硬件配置下,使用 Nginx 日志进行 bulk 写入压测,Easysearch 在多种分片配置下的写入性能相比 Elasticsearch 7.10.2 提升 40%-70%,更适合高并发写入场景。
- 是否支持中文分词?需要额外插件吗?
答:中文分词一直是 Elasticsearch 用户的「必装插件」。而在 Easysearch 中,中文分词是开箱即用的,同时支持 ik、pinyin 等主流分词器,还能自定义词典,方便电商、内容平台等场景。
- 从 ES 迁移到 Easysearch 是否复杂?会影响业务吗?
答:迁移往往是国产替代的最大顾虑。为此,Easysearch 提供了 极限网关 工具,支持全量同步和实时增量同步。迁移过程中业务可继续读写,只需短暂切换连接地址,几乎无感知。
- 监控与运维工具是否完善?是否支持 Kibana?
答:Easysearch 提供完整的监控与运维体系。从 Easysearch 1.15.x 版本起自带 Web UI 管理控制台(类似简化版 Kibana),支持索引管理、查询调试、权限控制等功能。同时还提供 INFINI Console 实现多集群管理与深度监控等。也可以通过配置让 Kibana 连接 Easysearch(部分高级功能可能受限)。
- 小型团队技术能力有限,用 Easysearch 运维难度高吗?
答:Easysearch 的一大设计理念就是降低运维门槛。Easysearch 提供一键部署脚本,减少手动配置参数,支持自动分片均衡与故障节点恢复,无需专职运维人员也能稳定运行,非常适合技术资源有限的团队。
- Easysearch 是否支持数据备份与恢复?操作复杂吗?
答:支持快照(Snapshot),可备份到本地磁盘或对象存储(S3、OSS 等)。恢复时仅需执行快照恢复命令,满足企业级数据安全需求。
- 对比 ES,Easysearch 在使用体验上最大的不同是什么?
答:Easysearch 保持与 Elasticsearch 类似的接口与查询 DSL,用户几乎无学习成本即可上手。同时,它针对国产化环境和搜索场景做了优化,运维更轻量,成本更可控。
结语:Easysearch,国产化搜索的新选择
作为一款国产自主可控的搜索与日志分析引擎,Easysearch 不仅继承了 Elasticsearch 的核心能力,更在性能、易用性、资源效率和中文支持等方面进行了深度优化。对于希望实现国产化替代、降低运维成本、提升系统性能的企业来说,Easysearch 是一个值得认真考虑的新选择。

如果你正在评估 Elasticsearch 的替代方案,不妨从 Easysearch 开始,体验更轻量、更高效的搜索新架构。
如需了解更多技术细节与使用案例,欢迎访问官方文档与社区资源:
- Easysearch 官网文档
- Elasticsearch VS Easysearch 性能测试
- 使用 Easysearch,日志存储少一半
- Kibana OSS 7.10.2 连接 Easysearch
- 自建 ES 集群通过极限网关无缝迁移到云上
- INFINI Console 一站式的数据搜索分析与管理平台

极限科技(INFINI Labs)招聘搜索运维工程师(Elasticsearch/Easysearch)
求职招聘 • INFINI Labs 小助手 发表了文章 • 0 个评论 • 6839 次浏览 • 2025-08-12 15:31

极限科技诚招全职搜索运维工程师(Elasticsearch/Easysearch)!
欢迎搜索技术热爱者加入我们,共同打造高效、智能的搜索解决方案!
在招岗位介绍
岗位名称
搜索运维工程师(Elasticsearch/Easysearch)
Base:北京/西安
薪资待遇:10-15K,五险一金,双休等
岗位职责
- 负责客户现场的 Elasticsearch/Easysearch/OpenSearch 搜索引擎集群的日常维护、监控和优化,确保集群的高可用性和性能稳定;
- 协助客户进行搜索引擎集群的部署、配置及版本升级;
- 排查和解决 Elasticsearch/Easysearch/OpenSearch 集群中的各种技术问题,及时响应并处理集群异常;
- 根据业务需求设计和实施搜索索引的调优、数据迁移和扩展方案;
- 负责与客户沟通,提供技术支持及相关培训,确保客户需求得到有效满足;
- 制定并实施搜索引擎的备份、恢复和安全策略,保障数据安全;
- 与内部研发团队和外部客户进行协作,推动集群性能改进和功能优化。
岗位要求
- 全日制本科及以上学历,2 年以上运维工作经验;
- 拥有 Elasticsearch/Easysearch/OpenSearch 使用经验,熟悉搜索引擎的原理、架构和相关生态工具(如 Logstash、Kibana 等);
- 熟悉 Linux 操作系统的使用及常见性能调优方法;
- 熟练掌握 Shell 或 Python 等至少一种脚本语言,能够编写自动化运维脚本;
- 具有优秀的问题分析与解决能力,能够快速应对突发情况;
- 具备良好的沟通能力和团队合作精神,能够接受客户驻场工作;
- 提供 五险一金,享有带薪年假及法定节假日。
加分项
- 计算机科学、信息技术或相关专业;
- 具备丰富的大规模分布式系统运维经验;
- 熟悉 Elasticsearch/Easysearch/OpenSearch 分片、路由、查询优化等高级功能;
- 拥有 Elastic Certified Engineer 认证;
- 具备大规模搜索引擎集群设计、扩展和调优经验;
- 熟悉其他搜索引擎技术(如 Solr、Lucene)者优先;
- 熟悉大数据处理相关技术(比如: Kafka 、Flink 等)者优先。
简历投递
- 邮件:hello@infini.ltd(邮件标题请备注姓名+求职岗位)
- 微信:INFINI-Labs (加微请备注求职岗位)

关于极限科技(INFINI Labs)

极限科技,全称极限数据(北京)科技有限公司,是一家专注于实时搜索与数据分析的软件公司。旗下品牌极限实验室(INFINI Labs)致力于打造极致易用的数据探索与分析体验。
极限科技是一支年轻的团队,采用天然分布式的方式来进行远程协作,员工分布在全球各地,希望通过努力成为中国乃至全球企业大数据实时搜索分析产品的首选,为中国技术品牌输出添砖加瓦。
我们在做什么
极限科技(INFINI Labs)正在致力于以下几个核心方向:
1、开发近实时搜索引擎 INFINI Easysearch
INFINI Easysearch 是一个分布式的搜索型数据库,实现非结构化数据检索、全文检索、向量检索、地理位置信息查询、组合索引查询、多语种支持、聚合分析等。Easysearch 可以替代 Elasticsearch,同时添加和完善多项企业级功能。Easysearch 助您拥有简洁、高效、易用的搜索体验。详情参见:https://infinilabs.cn
2、打造下一代实时搜索引擎 INFINI Pizza
INFINI Pizza 是一个分布式混合搜索数据库系统。我们的使命是充分利用现代硬件和人工智能的潜力,为企业提供量身定制的实时智能搜索体验。我们致力于满足具有挑战性的环境中高并发和高吞吐量的需求,同时提供无缝高效的搜索功能。详情参见:https://pizza.rs
3、为现代团队打造的统一搜索与 AI 智能助手 Coco AI
Coco AI 是一款完全开源的统一搜索与 AI 助手平台,它通过统一搜索入口,连接企业内外部的异构数据源,融合大模型能力,帮助团队高效访问知识,智能决策协作。详情参见:https://coco.rs
4、积极参与全球开源生态建设
通过开源 Coco AI、Console、Gateway、Agent、Loadgen 等搜索领域产品和社区贡献,推动全球开源技术的发展,提升中国在全球开源领域的影响力。INFINI Labs Github 主页:https://github.com/infinilabs
5、提供专业服务
为客户提供包括搜索技术支持、迁移服务、定制解决方案和培训在内的全方位服务。
6、提供国产化搜索解决方案
针对中国市场的特殊需求,提供符合国产化标准的搜索产品和解决方案,帮助客户解决使用 Elasticsearch 时遇到的挑战。
极限科技(INFINI Labs)通过这些努力,旨在成为全球领先的实时搜索和数据分析解决方案提供商。
【 INFINI Workshop 北京站】1月18日一起动手实验玩转 Easysearch
活动 • liaosy 发表了文章 • 0 个评论 • 4081 次浏览 • 2023-12-15 16:22
与 INFINI Labs 的技术专家面对面,第一时间了解极限实验室的发布最新产品和功能特性,通过动手实战,快速掌握最前沿的搜索技术,并用于实际项目中。欢迎大家扫描海报二维码免费报名参加。
活动时间:2024-01-18 13:30~17:30
活动地点:北京市海淀区 Wework 辉煌时代大厦 3 楼 3E 会议室
分享议题
- Easysearch 总体介绍及搭建实战
- 基于 INFINI Console 实现跨版本、跨引擎统一管控
- Elasticsearch -> Easysearch 在线迁移实操
参会提示
- 请务必自备电脑(Windows 系统环境请提前安装好 Linux 虚拟机)
- 请提前在 INFINI Labs 官网下载对应平台最新安装包(INFINI Easysearch、INFINI Gateway、INFINI Console)
- 下载地址:https://www.infinilabs.com/download
- 如有任何疑问可添加 INFINI Labs 小助手(微信号: INFINI-Labs)进行联系
【INFINI Workshop 上海站】7 月 27 日一起动手实验玩转 Easysearch
资讯动态 • liaosy 发表了文章 • 1 个评论 • 3710 次浏览 • 2023-07-07 16:30
APM(二):监控 Python 服务
Easysearch • INFINI Labs 小助手 发表了文章 • 0 个评论 • 1748 次浏览 • 3 天前
上一篇我们已经安装好了 Skywalking 和 Easysearch,这次我们来写个简单的 Python 服务,并把它的服务调用信息发送给 Skywalking,通过 Skywalking 的 Web UI 进行展示。
启动后端服务
先启动好后端服务,包括 Skywalking 和 Easysearch。启动完成后能通过 Web UI 访问 Skywalking。

构建 Python 服务
我们编写一个简单的 Flask 服务程序,只要访问 localhost:8081/a 就会返回 "Hello, I'm Service A!" 信息。
from flask import Flask
app = Flask(__name__)
@app.route('/a', methods=['GET'])
def service_b():
return "Hello, I'm Service A!"
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8081)
运行前,要安装好依赖。
pip3 install flask
pip3 install apache-skywalking
依赖关系展示如下:

设置环境变量
为了让服务能成功把相关信息发送到 Skywalking 后端,启动前我们还要设置两个环境变量告诉服务程序该往哪里发送信息。
export SW_AGENT_COLLECTOR_BACKEND_SERVICES=localhost:11800
export SW_AGENT_NAME=AService-python
启动 Python 程序
一切准备妥当后,运行我们的服务程序。
sw-python run python3 AService.py
程序启动后会监听 8081 端口。

我们通过浏览器访问下。

在 Skywalking 的 Web UI 上查看服务的信息是否采集到。




可以看到服务 A 的调用信息都已经被记录到 Skywalking 中了。
作者:杨帆,极限科技(INFINI Labs)高级解决方案架构师、《老杨玩搜索》栏目 B 站 UP 主,拥有十余年金融行业服务工作经验,熟悉 Linux、数据库、网络等领域。目前主要从事 Easysearch、Elasticsearch 等搜索引擎的技术支持工作,服务国内私有化部署的客户。
INFINI Labs 产品更新 | Coco AI v0.10 × Easysearch v2.0 联袂上线:UI 全面重构,体验焕然一新
资讯动态 • INFINI Labs 小助手 发表了文章 • 0 个评论 • 6149 次浏览 • 2025-12-20 16:34

此次更新主要包括 Coco AI v0.10.0 更换全新的 UI 组件,服务端新增 milvus 和 dropbox 连接器;Easysearch v2.0.2 正式发布, 新增嵌入文档语义搜索,优化内置 UI 响应速度,无需依赖 Kibana,实现集群“开箱即管”;INFINI Console、Gateway、Agent、Loadgen v1.30.1 统一基于 Framework v1.4.0 升级,优化本地磁盘队列数据消费。详情见 Release Notes。
Coco AI 0.10
Coco AI 是一款完全开源、跨平台的企业级智能搜索与助手系统,专为现代企业打造。它通过统一搜索入口,连接企业内外部的异构数据源,融合大模型能力,帮助团队高效访问知识,智能决策协作。
Coco AI 本次详细更新记录如下:
Coco AI 客户端 0.10
🚀 功能特性 (Features)
- 扩展程序 UI 支持可调整窗口大小

- 添加打开按钮以启动已安装的扩展程序

✈️ 改进优化 (Improvements)
- 将应用程序和文件搜索视为普通扩展
- 通过深度链接安装扩展失败时,显示错误消息(而非错误代码)
- 用 shadcn/ui 组件替换旧组件

🐛 问题修复(Bug Fixes)
- 修复输入框高度异常问题
- 为 Extension.minimum_coco_version 实现自定义序列化
Coco AI 服务端 0.10
🚀 功能特性 (Features)
- 新增 milvus 连接器

- 新增 dropbox 连接器

🐛 问题修复(Bug Fixes)
- 修复搜索 API 中图标绝对 URL 的解析问题
- 修复集成商店读取剪贴板数据后的显示问题
✈️ 改进优化 (Improvements)
- 移除分页并在全屏模式下添加无限滚动
Easysearch v2.0.2
INFINI Easysearch 是一个分布式的搜索型数据库,实现非结构化数据检索、全文检索、向量检索、地理位置信息查询、组合索引查询、多语种支持、聚合分析等。Easysearch 可以完美替代 Elasticsearch,同时添加和完善多项企业级功能。Easysearch 助您拥有简洁、高效、易用的搜索体验。
Easysearch 本次更新如下:
💥 重大变更(Breaking Changes)
- 正式发布 Easysearch 2.0.2 版本,底层 Lucene 更新到 9.12.2
- 新增 ui 插件,为 Easysearch 提供了轻量级界面化管理功能,不再依赖第三方对集群进行管理,真正做到开箱即用
🚀 功能特性 (Features)
- 语义搜索新增支持 NestedQueryBuilder
- KNN mapping 的 L 和 k 参数支持大小写不敏感,提升易用性
✈️ 改进优化 (Improvements)
- UI 插件静态文件支持 gzip 压缩,加快页面加载
- 优化了图标资源大小
- 调整了内部构建流程和 CSP 策略
🐛 问题修复(Bug Fixes)
- 修复了开发者工具的主题颜色显示问题
Console v1.30.1
INFINI Console 是一款开源的非常轻量级的多集群、跨版本的搜索基础设施统一管控平台。通过对流行的搜索引擎基础设施进行跨版本、多集群的集中纳管,企业可以快速方便的统一管理企业内部的不同版本的多套搜索集群。
Console 本次详细更新记录如下:
🚀 功能特性 (Features)
- 支持 Easysearch 2.x 和 Opensearch 3.x
✈️ 改进优化 (Improvements)
- 此版本包含了底层 Framework v1.4.0 的更新,解决了一些常见问题,并增强了整体稳定性和性能。虽然 Console 本身没有直接的变更,但从 Framework 中继承的改进间接地使 Console 受益。
Gateway v1.30.1
INFINI Gateway 是一个开源的面向搜索场景的高性能数据网关,所有请求都经过网关处理后再转发到后端的搜索业务集群。基于 INFINI Gateway 可以实现索引级别的限速限流、常见查询的缓存加速、查询请求的审计、查询结果的动态修改等等。
Gateway 本次更新如下:
✈️ 改进优化 (Improvements)
- 此版本包含了底层 Framework v1.4.0 的更新,解决了一些常见问题,并增强了整体稳定性和性能。虽然 Gateway 本身没有直接的变更,但从 Framework 中继承的改进间接地使 Gateway 受益。
Agent v1.30.1
INFINI Agent 负责采集和上传 Elasticsearch, Easysearch, Opensearch 集群的日志和指标信息,通过 INFINI Console 管理,支持主流操作系统和平台,安装包轻量且无任何外部依赖,可以快速方便地安装。
Agent 本次更新如下:
🚀 功能特性 (Features)
- 在 Kubernetes 环境下通过环境变量 http.port 探测 Easysearch 的 HTTP 端口
✈️ 改进优化 (Improvements)
- 此版本包含了底层 Framework v1.4.0 的更新,解决了一些常见问题,并增强了整体稳定性和性能。虽然 Agent 本身没有直接的变更,但从 Framework 中继承的改进间接地使 Agent 受益。
Loadgen v1.30.1
INFINI Loadgen 是一款开源的专为 Easysearch、Elasticsearch、OpenSearch 设计的轻量级性能测试工具。
Loadgen 本次更新如下:
✈️ 改进优化 (Improvements)
- 此版本包含了底层 Framework v1.4.0 的更新,解决了一些常见问题,并增强了整体稳定性和性能。虽然 Loadgen 本身没有直接的变更,但从 Framework 中继承的改进间接地使 Loadgen 受益。
Framework 1.4.0
INFINI Framework 是 INFINI Labs 基于 Golang 的产品的核心基础,已开源。该框架以开发者为中心设计,简化了构建高性能、可扩展且可靠的应用程序的过程。
Framework 本次更新如下:
🚀 功能特性 (Features)
- 为 curl 添加 p12 证书支持(#239)
- 从 util 中移除 curl(#242)
- 优先使用集群名称(#243)
- 为 access_token 添加标签(#244)
- 为用户主体(principal)添加头像配置(#246)
🐛 问题修复 (Bug Fixes)
- 修复重复写入和未写入的问题(#234)
- 当 filePath 为绝对路径时,检查其是否存在(#241)
✈️ 改进 (Improvements)
- 改进 TryGetFileAbsPath() 的 panic 错误信息(#240)
更多详情请查看以下各产品的 Release Notes 或联系我们的技术支持团队!
- Coco AI App
- Coco AI Server
- INFINI Easysearch
- INFINI Gateway
- INFINI Console
- INFINI Agent
- INFINI Loadgen
- INFINI Framework
期待反馈
欢迎下载体验使用,如果您在使用过程中遇到如何疑问或者问题,欢迎前往 INFINI Labs Github(https://github.com/infinilabs) 中的对应项目中提交 Feature Request 或提交 Bug。
下载地址: https://infinilabs.cn/download
邮件:hello@infini.ltd
电话:(+86) 400-139-9200
Discord:https://discord.gg/4tKTMkkvVX
也欢迎大家微信扫码添加小助手(INFINI-Labs),加入用户群一起讨论交流。

关于极限科技(INFINI Labs)

极限科技,全称极限数据(北京)科技有限公司,是一家专注于实时搜索与数据分析的软件公司。旗下品牌极限实验室(INFINI Labs)致力于打造极致易用的数据探索与分析体验。
极限科技是一支年轻的团队,采用天然分布式的方式来进行远程协作,员工分布在全球各地,希望通过努力成为中国乃至全球企业大数据实时搜索分析产品的首选,为中国技术品牌输出添砖加瓦。
Easy-Es 2.1.0-easysearch 版本发布
Easysearch • INFINI Labs 小助手 发表了文章 • 0 个评论 • 8117 次浏览 • 2025-12-15 17:42

01 | 版本更新概述
经过极限科技与 Dromara 开源社区下 Easy-Es 项目的紧密合作与共同努力,我们很荣幸地联合推出 Easy-Es 2.1.0-easysearch 版本!
作为双方携手打造的第一个合作成果,本版本已正式发布:
- 源码仓库:https://gitee.com/dromara/easy-es/tree/easy-es4easySearch/
- Maven 依赖:https://mvnrepository.com/artifact/org.dromara.easy-es/easy-es-boot-starter/2.1.0-easysearch
本次更新的核心内容是将 Easy-Es 框架底层增加兼容极限科技自主研发的 Easysearch 搜索引擎,这标志着国产搜索引擎与国内优秀开源项目深度融合的重要里程碑,是极限科技与 Dromara 社区携手共建国产技术生态的创新实践。
02 | 迁移至 Easysearch 的背景与优势
随着国内对自主可控技术需求的日益增长,特别是在基础设施软件领域,企业对于信创合规的要求不断提升。极限科技自主研发的 Easysearch 搜索引擎具备以下显著优势:
- 国产化自主可控:完全自主研发,符合信创要求,无许可证风险,为企业提供安全可靠的技术保障
- 轻量级架构:相比传统搜索引擎,资源占用更少,启动更快速,显著降低企业运维成本
- 卓越性能表现:查询性能优异,能够满足大部分业务场景需求,用户体验流畅
- 良好兼容性:与 Elasticsearch 的 API 接口基本兼容,迁移成本较低,保护用户现有投资
基于以上优势,双方决定共同将 Easy-Es 框架底层迁移至 Easysearch,这不仅为用户提供更多选择,更是双方携手推动国产搜索引擎生态建设的重要举措。
03 | Easy-Es 框架优势
Easy-Es 框架在搜索开发领域具备以下核心优势:
- 极简代码开发:相比原生 API 可减少 50%-80% 的代码量,大幅提升开发效率。
// 使用 Easy-Es 仅需一行代码完成查询
List<Document> documents = documentMapper.selectList(
EsWrappers.lambdaQuery(Document.class).eq(Document::getTitle, "测试")
);
-
自动索引管理: 框架提供全自动智能索引托管功能,开发者无需关心索引的创建、更新及数据迁移等复杂操作,索引全生命周期由框架自动管理,过程零停机。
-
SQL 语法兼容: 支持使用 MySQL 语法完成搜索查询操作,无需学习复杂的 DSL 语句。支持 and、or、like、in 等常用 SQL 语法。
-
Lambda 表达式支持: 采用 Lambda 风格编程,提供类型安全的字段访问,避免手动输入字段名可能产生的错误,提升代码可读性和开发效率。
-
无缝 Spring Boot 集成: 与 Spring Boot 生态深度集成,提供开箱即用的自动配置,无需复杂的手动配置,支持 Spring Boot Actuator 监控,完美融入企业级应用架构。
-
丰富的查询功能: 支持复杂的嵌套查询、聚合查询、范围查询、高亮显示等高级搜索功能,同时保持 API 的简洁易用,满足各种业务场景需求。
-
分布式架构支持: 完美适配 Easysearch 的分布式特性,支持集群模式部署,具备高可用性和横向扩展能力,满足企业级大规模数据处理需求。
- 成熟稳定的国产 ORM 框架: 作为 Dromara 开源社区下的顶级开源项目,Easy-Es 已在国内众多企业和项目中得到广泛应用和验证,拥有活跃的中文社区和完善的文档支持,为企业级应用提供了可靠的技术保障。
04 | 快速上手示例
1. 添加依赖
根据您使用的构建工具,选择对应的配置方式:
Maven 项目
pom.xml 配置:
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<spring-boot.version>2.7.0</spring-boot.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</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>
<build>
<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>
Maven 启动命令:
# 运行应用
mvn spring-boot:run
# 编译打包
mvn clean package
Gradle 项目
build.gradle 配置:
plugins {
id 'java'
id 'org.springframework.boot' version '2.7.0'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
}
group = 'org.easysearch'
version = '1.0-SNAPSHOT'
sourceCompatibility = '11'
repositories {
mavenLocal()
mavenCentral()
}
dependencies {
implementation 'org.dromara.easy-es:easy-es-boot-starter:2.1.0-easysearch'
implementation 'org.springframework.boot:spring-boot-starter-web'
}
Gradle 启动命令:
# 运行应用
./gradlew bootRun
# 编译打包
./gradlew clean build
2. 配置文件设置
application.yml(根据实际 Easysearch 部署情况修改):
easy-es:
enable: true
# Easysearch 服务地址
address: localhost:9200
# 协议:http 或 https
schema: https
# Easysearch 用户名
username: admin
# Easysearch 密码
password: your_password_here
# 连接保持时间(毫秒)
keep-alive-millis: 18000
global-config:
# 开启彩蛋模式(启动时显示 ASCII 艺术图案)
i-kun-mode: true
# 索引处理模式:smoothly 表示平滑模式(零停机更新索引)
process-index-mode: smoothly
# 异步处理索引时是否阻塞
async-process-index-blocking: true
# 是否打印 DSL 语句(开发调试时可设为 true)
print-dsl: false
db-config:
# 下划线转驼峰
map-underscore-to-camel-case: true
# 索引前缀
index-prefix: dev_
# 主键类型:customize 表示自定义
id-type: customize
# 字段更新策略:not_empty 表示非空时才更新
field-strategy: not_empty
# 刷新策略:immediate 表示立即刷新
refresh-policy: immediate
# 开启追踪总命中数
enable-track-total-hits: true
3. 实体类定义
package org.dromara.easyes.sample.entity;
import lombok.Data;
import lombok.experimental.Accessors;
import org.dromara.easyes.annotation.HighLight;
import org.dromara.easyes.annotation.IndexField;
import org.dromara.easyes.annotation.IndexId;
import org.dromara.easyes.annotation.IndexName;
import org.dromara.easyes.annotation.Settings;
import org.dromara.easyes.annotation.rely.Analyzer;
import org.dromara.easyes.annotation.rely.FieldStrategy;
import org.dromara.easyes.annotation.rely.FieldType;
import org.dromara.easyes.annotation.rely.IdType;
import java.time.LocalDateTime;
/**
* es 数据模型
*/
@Data
@Accessors(chain = true)
@Settings(shardsNum = 3, replicasNum = 2)
@IndexName(value = "easyes_document", keepGlobalPrefix = true)
public class Document {
/**
* es 中的唯一 id
*/
@IndexId(type = IdType.CUSTOMIZE)
private String id;
/**
* 文档标题,默认为 keyword 类型,可进行精确查询
*/
private String title;
/**
* 文档内容,指定为 TEXT 类型,使用 IK 分词器
* 支持高亮显示,高亮结果映射到 highlightContent 字段
*/
@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;
/**
* 地理位置经纬度坐标,例如: "40.13933715136454,116.63441990026217"
*/
@IndexField(fieldType = FieldType.GEO_POINT)
private String location;
}
4. Mapper 接口
package org.dromara.easyes.sample.mapper;
import org.dromara.easyes.core.kernel.BaseEsMapper;
import org.dromara.easyes.sample.entity.Document;
/**
* Mapper 接口,继承 BaseEsMapper 即可获得所有 CRUD 方法
*/
public interface DocumentMapper extends BaseEsMapper<Document> {
}
5. 启动类配置
package org.dromara.easyes.sample;
import org.dromara.easyes.spring.annotation.EsMapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* 启动类
*/
@SpringBootApplication
@EsMapperScan("org.dromara.easyes.sample.mapper")
public class EasyEsApplication {
public static void main(String[] args) {
SpringApplication.run(EasyEsApplication.class, args);
}
}
6. 业务使用示例
package org.dromara.easyes.sample.controller;
import org.dromara.easyes.core.conditions.select.LambdaEsQueryWrapper;
import org.dromara.easyes.sample.entity.Document;
import org.dromara.easyes.sample.mapper.DocumentMapper;
import org.easysearch.action.search.SearchResponse;
import org.easysearch.search.aggregations.Aggregations;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.List;
@RestController
public class SampleController {
@Resource
private DocumentMapper documentMapper;
/**
* 初始化插入数据
*/
@GetMapping("/insert")
public Integer insert() {
int count = 0;
// 插入 5 条测试数据
for (int i = 1; i <= 5; i++) {
Document document = new Document();
document.setId(String.valueOf(i));
document.setTitle("测试" + i);
document.setContent("测试内容" + i);
document.setCreator("创建者" + i);
document.setGmtCreate(LocalDateTime.now());
document.setStarNum(i * 10);
count += documentMapper.insert(document);
}
return count;
}
/**
* 根据标题精确查询
*/
@GetMapping("/listDocumentByTitle")
public List<Document> listDocumentByTitle(@RequestParam String title) {
LambdaEsQueryWrapper<Document> wrapper = new LambdaEsQueryWrapper<>();
wrapper.eq(Document::getTitle, title);
return documentMapper.selectList(wrapper);
}
/**
* 高亮搜索
*/
@GetMapping("/highlightSearch")
public List<Document> highlightSearch(@RequestParam String content) {
LambdaEsQueryWrapper<Document> wrapper = new LambdaEsQueryWrapper<>();
wrapper.match(Document::getContent, content);
return documentMapper.selectList(wrapper);
}
/**
* 查询所有数据
*/
@GetMapping("/selectAll")
public List<Document> selectAll() {
LambdaEsQueryWrapper<Document> wrapper = new LambdaEsQueryWrapper<>();
return documentMapper.selectList(wrapper);
}
/**
* 聚合查询 - 按创建时间和点赞数分组统计
*/
@GetMapping("/aggByDateAndStar")
public Aggregations aggByDateAndStar() {
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("/queryBySQL")
public String queryBySQL(@RequestParam(required = false) String title) {
String sql;
if (title != null && !title.isEmpty()) {
sql = String.format("SELECT * FROM dev_easyes_document WHERE title = '%s'", title);
} else {
sql = "SELECT * FROM dev_easyes_document LIMIT 10";
}
return documentMapper.executeSQL(sql);
}
}
7. 快速测试
启动应用后,可以通过以下接口测试:
# 1. 插入测试数据
curl http://localhost:8080/insert
# 2. 查询所有数据
curl http://localhost:8080/selectAll
# 3. 根据标题精确查询
curl "http://localhost:8080/listDocumentByTitle?title=测试1"
# 4. 高亮搜索
curl "http://localhost:8080/highlightSearch?content=测试"
# 5. SQL 查询
curl "http://localhost:8080/queryBySQL?title=测试1"
# 6. 聚合查询
curl http://localhost:8080/aggByDateAndStar
05 | 相关链接
- Easy-Es 官方网站:https://easy-es.cn
- Gitee 仓库:https://gitee.com/dromara/easy-es
- GitHub 仓库:https://github.com/dromara/easy-es
- Easysearch 官方网站:https://infinilabs.cn/products/easysearch
06 | 特别致谢
在此,极限科技要特别感谢 Easy-Es 项目的核心开发者“老汉”和各位贡献者和维护者们。正是因为有了你们的辛勤付出、专业精神以及对开源事业的热忱奉献,Easy-Es 项目才能在国内外获得如此广泛的认可和应用。
也感谢你们对国产技术生态建设的信任与支持。此次 Easy-Es 与 Easysearch 的深度整合,正是双方通力合作、互利共赢的最佳体现。
我们相信,在 Easy-Es 项目团队的持续推动下,国产开源软件必将迎来更加辉煌的明天。极限科技将继续致力于提供优质的国产技术解决方案,与 Easy-Es 项目团队携手共进,为中国开源生态的发展贡献更多力量!
关于 Easy-Es
Easy-Es(简称 EE)是一款基于 Elasticsearch(简称 ES)官方提供的 ElasticsearchClient 打造的 ORM 开发框架,在 ElasticsearchClient 的基础上,只做增强不做改变,为简化开发、提高效率而生,您如果有用过 Mybatis-Plus(简称 MP),那么您基本可以零学习成本直接上手 EE,EE 是 MP 的 ES 平替版,在有些方面甚至比 MP 更简单,同时也融入了更多 ES 独有的功能,助力您快速实现各种场景的开发。
Easy-Es for Easysearch 是一款简化 Easysearch 国产化搜索引擎操作的开源框架,全自动智能索引托管。同时也是国内首家专门针对 Easysearch 客户端简化的工具。它简化 CRUD 及其它高阶操作,可以更好的帮助开发者减轻开发负担。底层采用 Easysearch Java Client,保证其原生性能及拓展性。
项目地址:https://gitee.com/dromara/easy-es/tree/easy-es4easySearch
关于极限科技
极限科技(全称:极限数据(北京)科技有限公司)是一家专注于实时搜索与数据分析的软件公司。
旗下品牌:极限实验室(INFINI Labs)致力于打造极致易用的数据探索与分析体验,为用户提供安全、稳定、高性能的国产搜索解决方案。
作者:张磊,极限科技(INFINI Labs)搜索引擎研发负责人,对 Elasticsearch 和 Lucene 源码比较熟悉,目前主要负责公司的 Easysearch 产品的研发以及客户服务工作。
Easysearch 2.0.0 性能测试
Easysearch • INFINI Labs 小助手 发表了文章 • 0 个评论 • 8845 次浏览 • 2025-12-04 00:17
概述
Easysearch 2.0.0 正式版带来了显著的性能提升和优化改进。通过与上一个稳定版本 1.15.6 的全面对比测试,我们使用 esrally 基准测试工具在 append-no-conflicts 场景下进行了深入的性能评估。测试结果表明,2.0.0 版本在索引性能、查询延迟、内存管理等核心指标上都实现了突破性改进。
核心性能提升
1. 索引性能更加稳定
写入效率提升 12.81%
Easysearch 2.0.0 索引性能表现更加稳定:
- 累计索引 CPU 时间(所有主分片):从 225.1 分钟缩短至 196.3 分钟,减少 28.8 分钟(-12.81%)
- 索引吞吐量:
- 平均吞吐量从 180,868 docs/s 提升至 190,712 docs/s(+5.44%)
- 最大吞吐量从 198,184 docs/s 提升至 220,460 docs/s(+11.24%)
- 最小吞吐量从 164,263 docs/s 提升至 178,961 docs/s(+8.95%)
累计索引 CPU 时间的减少,表明 2.0.0 版本在索引操作上更加高效,CPU 利用率更优。这意味着在相同硬件条件下,Easysearch 2.0.0 能够更快地完成数据摄入任务,对于需要处理大规模数据写入的场景具有重要意义。
Indexing Throughput (docs/s) - Higher is Better
2. Refresh 和 Flush 耗时缩短
Refresh 和 Flush 性能大幅改善
在 Elasticsearch/Easysearch 中,Refresh 和 Flush 操作对写入性能有直接影响。2.0.0 版本在这两个关键操作上实现了重大优化:
Refresh 性能提升 54.46%
- 累计刷新时间:从 9.14 分钟降至 4.16 分钟
- 中位刷新时间:减少 61.86%(从 0.133 分钟降至 0.051 分钟)
- 最大刷新时间:减少 65.62%(从 1.12 分钟降至 0.39 分钟)
Flush 性能提升 40%
- 累计刷盘时间:从 12.57 分钟降至 7.54 分钟
- 中位刷盘时间:减少 57.57%
- 最大刷盘时间:减少 31.93%
Cumulative Refresh Time (min) - Lower is Better
Cumulative Flush Time (min) - Lower is Better
这些优化使得 Easysearch 2.0.0 能够更高效地将数据持久化到磁盘,同时减少对写入操作的阻塞。
3. 垃圾回收(GC)性能优化
GC 效率显著提升
- Young GC 次数:从 525 次降至 426 次,减少 18.86%
- Young GC 时间:从 16.547 秒降至 15.985 秒,减少 3.40%
- Old GC:两个版本均无 Old GC 发生,内存管理健康
更少的 GC 次数意味着:
- 应用程序 STW(Stop-The-World)暂停更少
- 更稳定的查询响应时间
- 更好的系统吞吐量
查询性能提升
1. 基础查询延迟降低
多类型查询性能全面提升
| 查询类型 | 延迟指标 | 改进幅度 |
|---|---|---|
| Default 查询 | 50 分位延迟 | -11.40% (19.97ms → 17.69ms) |
| 99 分位延迟 | -15.23% (25.66ms → 21.75ms) | |
| Term 查询 | 50 分位延迟 | -19.88% (4049ms → 3244ms) |
| 90 分位延迟 | -18.73% (4137ms → 3362ms) | |
| Range 查询 | 50 分位延迟 | -31.71% (42.19ms → 28.81ms) |
| 100 分位延迟 | -64.68% (111.42ms → 39.35ms) |
Query Latency Improvements (ms) - Lower is Better
2. 排序查询性能飞跃
时间戳排序查询优化高达 97%
Easysearch 2.0.0 在排序查询场景下实现了令人瞩目的性能突破:
降序排序(desc_sort_timestamp)
- 50 分位延迟:从 516.07ms 降至 98.89ms(-80.84%)
- 90 分位延迟:从 544.84ms 降至 123.59ms(-77.32%)
- 99 分位延迟:从 603.14ms 降至 139.93ms(-76.80%)
升序排序 + After 分页(asc_sort_with_after_timestamp)
- 50 分位延迟:从 1272.58ms 降至 33.56ms(-97.36%)
- 90 分位延迟:从 1386.92ms 降至 37.25ms(-97.31%)
- 99 分位延迟:从 1474.98ms 降至 38.11ms(-97.42%)
Sort Query Latency (ms) - Lower is Better
Force Merge 后的排序查询
在强制合并为单段后,排序查询性能更加出色:
降序排序(force-merge-1-seg)
- 50 分位延迟:从 131,617ms 降至 115.01ms(-99.91%)
- 这一改进相当于从 2 分钟以上降至 0.1 秒!
升序 + After 分页(force-merge-1-seg)
- 50 分位延迟:从 1387.01ms 降至 132.42ms(-90.45%)
- 90 分位延迟:从 1509.03ms 降至 159.05ms(-89.46%)
3. 聚合查询性能提升
hourly_agg 聚合查询优化
- 50 分位延迟:从 4192.57ms 降至 3866.07ms(-7.79%)
- 90 分位延迟:从 4303.51ms 降至 4053.80ms(-5.80%)
- 99 分位延迟:从 4475.32ms 降至 4269.91ms(-4.59%)
4. Scroll 查询性能改进
大数据量遍历场景优化
- 50 分位延迟:从 6511.65ms 降至 4623.87ms(-28.99%)
- 90 分位延迟:从 6881.70ms 降至 5972.79ms(-13.21%)
- 平均吞吐量:从 24.192 pages/s 提升至 24.485 pages/s(+1.21%)
Scroll Query Latency (ms) - Lower is Better
5. 高百分位延迟大幅改善
极端场景下的稳定性提升
在衡量系统稳定性的高百分位延迟指标上,2.0.0 版本表现卓越:
| 场景 | 99.9 分位延迟改进 | 99.99 分位延迟改进 | 100 分位延迟改进 |
|---|---|---|---|
| index-append | -43.40% | -65.35% | -70.91% |
| (3364ms → 1904ms) | (9618ms → 3333ms) | (13427ms → 3906ms) |
这意味着即使在最坏的情况下,2.0.0 版本也能提供更加稳定和可预测的性能表现。
范围查询性能提升
200s-in-range 和 400s-in-range 查询优化
-
200s-in-range:
- 50 分位延迟降低 15.60%
- 吞吐量提升 1.20%
- 400s-in-range:
- 50 分位延迟降低 8.44%
- 吞吐量提升 0.23%
存储优化
磁盘空间使用更高效
- 存储大小:从 19.51 GB 降至 19.14 GB(-1.93%)
- 段数量:从 43 个增至 50 个(+16.28%)
虽然段数量略有增加,但总存储空间仍然减少,说明数据压缩和存储效率得到了提升。
Merge 策略调整
合并操作的权衡
需要注意的是,2.0.0 版本在 Merge 方面有以下变化:
- Merge 次数从 184 次增至 192 次(+4.35%)
- Merge 限流时间从 9.53 分钟增至 11.17 分钟(+17.20%)
这是为了平衡写入性能和查询性能所做的策略调整。用户可以根据实际场景需求,通过以下参数进行优化:
{
"index.merge.scheduler.max_thread_count": "1",
"index.merge.policy.max_merged_segment": "5gb"
}
技术架构改进
1. 段数据结构优化
通过将段元数据从堆内存迁移到堆外内存,Easysearch 2.0.0 实现了:
- 更低的 JVM 堆压力
- 更少的 GC 频率
- 更稳定的内存使用模式
- 更好的大数据集支持能力
2. 查询缓存优化
排序查询性能的巨大提升表明 2.0.0 版本可能在以下方面进行了优化:
- 改进的 Doc Values 访问机制
- 优化的排序算法
- 更高效的分页实现
- 智能的查询结果缓存
3. I/O 优化
Refresh 和 Flush 时间的大幅减少说明:
- 改进了磁盘 I/O 调度策略
- 优化了文件系统操作
- 可能引入了更高效的批量写入机制
适用场景
Easysearch 2.0.0 的性能提升使其在以下场景中表现更加出色:
1. 大规模日志与事件流处理
- 更高的写入吞吐量(+11.24% 峰值)
- 更低的索引延迟
- 适合 APM、日志分析、安全监控等场景
2. 时序数据存储与分析
- 时间戳排序查询性能提升高达 97%
- 适合 IoT、监控指标、金融交易数据等场景
3. 全文搜索应用
- 多类型查询延迟降低 10-30%
- 高并发场景下更稳定的响应时间
- 适合电商搜索、内容管理系统等场景
4. 实时分析与 Dashboard
- 聚合查询性能提升 5-8%
- 更低的极端延迟,用户体验更好
- 适合实时报表、业务 BI 等场景
5. 大数据量遍历与导出
- Scroll 查询延迟降低 29%
- 适合数据迁移、全量导出等场景
升级建议
兼容性
Easysearch 2.0.0 与 1.15.6 在 API 层面保持兼容,但建议:
- 测试环境验证:先在测试环境进行充分验证
- 配置审查:检查 Merge 相关配置是否需要调整
- 监控指标:升级后密切关注 GC、内存、延迟等指标
- 滚动升级:生产环境建议采用滚动升级方式
性能测试环境
本次测试使用 esrally 基准测试工具,测试配置如下:
- 测试场景:append-no-conflicts
- 测试时间:
- Baseline (1.15.6): 2025-11-14
- Contender (2.0.0): 2025-11-21
- 部署方式:External(独立部署)
- CPU 绑定:使用
taskset绑定 Easysearch 进程 0 到 15 cpu - JVM 配置:
-Xms16g -Xmx16g
总结
Easysearch 2.0.0 版本在性能方面取得了全面提升:
- 索引性能提升 12.81%
- 查询延迟降低 10-97%(不同场景)
- 内存使用优化 100%(堆内段数据)
- GC 频率降低 18.86%
- Refresh 性能提升 54.46%
- Flush 性能提升 40%
- 高百分位延迟改善 43-70%
这些改进使得 Easysearch 2.0.0 成为一个更加高效、稳定和可靠的搜索与分析引擎,特别适合处理大规模数据和实时查询场景。无论是日志分析、时序数据处理,还是全文搜索应用,2.0.0 版本都能提供更优秀的性能表现。
我们强烈建议用户升级到 Easysearch 2.0.0,以获得这些显著的性能提升和更好的使用体验。
关于 Easysearch

INFINI Easysearch 是一个分布式的搜索型数据库,实现非结构化数据检索、全文检索、向量检索、地理位置信息查询、组合索引查询、多语种支持、聚合分析等。Easysearch 可以完美替代 Elasticsearch,同时添加和完善多项企业级功能。Easysearch 助您拥有简洁、高效、易用的搜索体验。
作者:张磊,极限科技(INFINI Labs)搜索引擎研发负责人,对 Elasticsearch 和 Lucene 源码比较熟悉,目前主要负责公司的 Easysearch 产品的研发以及客户服务工作。
原文:https://infinilabs.cn/blog/2025/easysearch-2.0.0-performance-improvements/
INFINI Labs 产品更新 | Coco AI v0.9 与 Easysearch v2.0 全新功能上线,全面支持 GitLab 合并请求(MR)自动 AI Review
资讯动态 • INFINI Labs 小助手 发表了文章 • 0 个评论 • 9731 次浏览 • 2025-11-24 00:24

INFINI Labs 产品更新发布!此次更新主要包括:Coco AI v0.9 全面支持 GitLab 合并请求(MR)自动 AI Review,并重构为插件流水线架构,新增 Neo4j、MongoDB 等 10+ 数据源连接器,开启“AI+开发”协同新范式;Easysearch v2.0 正式发布,内置轻量级管理 UI,无需依赖 Kibana,实现集群“开箱即管”,Lucene 升级至 9.12.2,性能全面提升;INFINI Console、Gateway、Agent、Loadgen v1.30 统一基于 Framework v1.3 升级,全面支持 Easysearch 2.0 与 OpenSearch 3.x,新增百分比聚合、子目录代理等关键能力。详情见 Release Notes。
Coco AI v0.9
Coco AI 是一款完全开源、跨平台的企业级智能搜索与助手系统,专为现代企业打造。它通过统一搜索入口,连接企业内外部的异构数据源,融合大模型能力,帮助团队高效访问知识,智能决策协作。
Coco AI 本次详细更新记录如下:
Coco AI 客户端 v0.9
🚀 功能特性 (Features)
- feat: 支持通过快捷键切换分组 #911
- feat: 支持从设置页面打开日志文件夹
- feat: 支持使用 home 和 end 键移动光标
- feat: 支持使用 page up 和 page down 键移动选中条
- feat: 规范化多级菜单的标签结构
- feat: 当父插件类型为 Extension 时,搜索父插件可以搜到子插件
- feat: 支持使用 modifier key 和回车对话 AI 助手
- feat: 允许在光标位于开头时返回
- feat(插件兼容性): 插件描述文件添加 minimum_coco_version 字段进行版本检查
- feat: 实现紧凑窗口模式
- feat: 实现设置项搜索延迟和本地搜索结果权重
- feat: 添加主窗口透明度设置
- feat: 添加从默认模式回答紧凑模式的延迟设置
✈️ 改进优化 (Improvements)
- refactor: 优化搜索结果的排序逻辑 #910
- style: 为图片添加深色投影 #912
- chore: 为 Web 组件添加跨域配置 #921
- refactor: 若 AXUIElementSetAttributeValue() 失败则进行重试 #924
- refactor(calculator): 若表达式为 "num => num" 格式则跳过计算 #929
- chore: 使用自定义日志目录 #930
- chore: 将 tauri_nspanel 升级至 v2.1 #933
- refactor: show_coco/hide_coco 现已在 macOS 上改用 NSPanel 的相关方法 #933
- refactor: 将 convert_pages() 流程封装为函数 #934
- refactor(post-search): 从每个查询源至少收集 2 份文档 #948
- refactor: custom_version_comparator() 现已支持语义化版本比较 #941
- chore: 让主窗口垂直居中 #959
- refactor(view extension): 通过本地 HTTP 服务器加载 HTML/资源文件 #973
🐛 问题修复(Bug Fixes)
- fix: 修复服务列表自动更新的问题 #913
- ix: 修复聊天内容重复的问题 #916
- fix: 修复固定窗口(Pinned Window)快捷键失效的问题 #917
- fix: 修复从另一显示器操作焦点窗口时,窗口管理扩展失效的问题 #919
- fix(窗口管理插件): 修复“下一个/上一个桌面”功能失效的问题 #926
- fix: 修复页面频繁闪烁的问题 #935
- fix(view extension): 修复通过快捷键打开扩展时搜索栏 UI 显示异常的问题 #938
- fix: 修复全选文本后无法删除的问题 #943
- fix: 修复在聊天和搜索页面之间切换时的抖动问题 #955
- fix: 修复重复显示登录成功提示的问题 #977
- fix: 修复 Quick AI 无法继续对话的问题 #979
Coco App 相关截图:

Coco AI 服务端 v0.9
💥 重大变更(Breaking Changes)
- refactor: 将连接器重构为基于流水线(Pipeline)模式 (#545) #545
- refactor: 重新实现安全功能;需重新运行设置程序
🚀 功能特性 (Features)
- feat: 新增 Neo4j 连接器 #539
- feat: 新增内置商店 #551
- feat: 基于 RBAC 的安全机制
- feat: 用户级数据所有权与共享功能
- feat: 管理界面增加权限校验
- feat: 新增路由权限验证
- feat: 新增用户实体卡片
- feat: 文档管理增加视图功能
- feat: 新增 Webhooks 管理界面 (#558)
- feat: 新增 GitLab 合并事件的 Webhook 处理器
- feat: 集成扩展商店
- feat: 支持编辑连接器处理器配置
- feat: 支持配置 Base Path 以自定义服务端点
- feat: 名称字段增加拼音支持
- feat: 新增 MongoDB 连接器
🐛 问题修复(Bug Fixes)
- fix: 修复切换扩展类型后重置搜索关键词的问题
- fix: 修复全屏小部件的相关问题
✈️ 改进优化 (Improvements)
- refactor: 为深色模式添加悬停背景效果
- chore: 修复文档搜索功能
- chore: 格式化日期
- refactor: 更新初始值
- chore: 修复数据源名称缺失的问题
- chore: 安装完成后隐藏弹窗
- chore: 基于框架变更进行重构
- chore: 为支持深度思考(DeepThink)获取更多文档 #577
- chore: 启用搜索后将首页更改为搜索页 #541
- chore: 更新搜索 API 以支持查询 DSL #550
- chore: 默认按创建时间排序
- chore: 调整多语言配置
- chore: 用户表单增加确认密码字段
- chore: 调整连接器类型
- chore: 调整连接器 OAuth 重定向设置
- refactor: 为集成功能进行重构
- refactor: 移除集成配置中的 Token
- chore: 编辑用户时禁用邮箱字段
- chore: 调整搜索设置
Coco Server 相关截图:

Easysearch v2.0
INFINI Easysearch 是一个分布式的搜索型数据库,实现非结构化数据检索、全文检索、向量检索、地理位置信息查询、组合索引查询、多语种支持、聚合分析等。Easysearch 可以完美替代 Elasticsearch,同时添加和完善多项企业级功能。Easysearch 助您拥有简洁、高效、易用的搜索体验。
Easysearch 本次更新如下:
💥 重大变更(Breaking Changes)
- 正式发布 Easysearch 2.0 版本,底层 Lucene 更新到 9.12.2
- 新增 ui 插件,为 Easysearch 提供了轻量级界面化管理功能,不再依赖第三方对集群进行管理,真正做到开箱即用
🚀 功能特性 (Features)
- 兼容 1.15.x 版本的索引,可无缝升级
- 新增 UI 插件,涵盖从集群,节点,索引,到分片等不同维度的监控和管理功能
- 支持关闭 security 进入 UI
✈️ 改进优化 (Improvements)
- range 查询,按数字类型字段排序,相比旧版本效率大幅提升
Easysearch UI 相关截图:

Console v1.30
INFINI Console 是一款开源的非常轻量级的多集群、跨版本的搜索基础设施统一管控平台。通过对流行的搜索引擎基础设施进行跨版本、多集群的集中纳管,企业可以快速方便的统一管理企业内部的不同版本的多套搜索集群。
Console 本次详细更新记录如下:
🚀 功能特性 (Features)
- feat: 支持百分比聚合
- feat: 为初始化管理员用户增加密码强度校验 (#250)
- feat: 支持 Nginx 代理下的子目录路径 (#243)
🐛 问题修复(Bug Fixes)
- fix: 修复了索引映射 (mapping) 在滚动查询 (scroll) 后不正确的问题 (#248)
- fix: 修复索引 mapping 在滚动操作之后不对的问题
- fix: 修复集群监控设置显示错误
✈️ 改进优化 (Improvements)
- chore: 删除集群后减少 Agent 上报异常错误日志输出 (#258)
- 此版本包含了底层 Framework v1.3 的更新,解决了一些常见问题,并增强了整体稳定性和性能。虽然 Console 本身没有直接的变更,但从 Framework 中继承的改进间接地使 Console 受益。
Gateway v1.30
INFINI Gateway 是一个开源的面向搜索场景的高性能数据网关,所有请求都经过网关处理后再转发到后端的搜索业务集群。基于 INFINI Gateway 可以实现索引级别的限速限流、常见查询的缓存加速、查询请求的审计、查询结果的动态修改等等。
Gateway 本次更新如下:
🚀 功能特性 (Features)
- feat(rewrite_to_bulk):使文档更新兼容 Elasticsearch 6.x (#112)
🐛 问题修复(Bug Fixes)
- fix: 修复心跳连接的潜在泄漏问题 (#107)
✈️ 改进优化 (Improvements)
- 改进 ReverseProxy 的锁机制和节点发现逻辑 (#111)
- 此版本包含了底层 Framework v1.3 的更新,解决了一些常见问题,并增强了整体稳定性和性能。虽然 Gateway 本身没有直接的变更,但从 Framework 中继承的改进间接地使 Gateway 受益。
Agent v1.30
INFINI Agent 负责采集和上传 Elasticsearch, Easysearch, Opensearch 集群的日志和指标信息,通过 INFINI Console 管理,支持主流操作系统和平台,安装包轻量且无任何外部依赖,可以快速方便地安装。
Agent 本次更新如下:
🚀 功能特性 (Features)
在 Kubernetes 环境下通过环境变量 http.port 探测 Easysearch 的 HTTP 端口
✈️ 改进优化 (Improvements)
- 此版本包含了底层 Framework v1.3 的更新,解决了一些常见问题,并增强了整体稳定性和性能。虽然 Agent 本身没有直接的变更,但从 Framework 中继承的改进间接地使 Agent 受益。
Loadgen v1.30
INFINI Loadgen 是一款开源的专为 Easysearch、Elasticsearch、OpenSearch 设计的轻量级性能测试工具。
Loadgen 本次更新如下:
✈️ 改进优化 (Improvements)
- 此版本包含了底层 Framework v1.3 的更新,解决了一些常见问题,并增强了整体稳定性和性能。虽然 Loadgen 本身没有直接的变更,但从 Framework 中继承的改进间接地使 Loadgen 受益。
Framework 1.3.0
INFINI Framework 是 INFINI Labs 基于 Golang 的产品的核心基础,已开源。该框架以开发者为中心设计,简化了构建高性能、可扩展且可靠的应用程序的过程。
Framework 本次更新如下:
🚀 功能特性 (Features)
- feat: add delete by query v2 #194
- feat: support aggregation queries in orm
- feat: add support for query_string query
- feat: allow to read http request body multi-times #212
- feat: add support for Elasticsearch cat allocation API
- feat: support custom write operation type for indexing_merge processor
- feat: add util to parse time with local timezone #217
- feat: add PKCS#12 certificate support for http client config
- feat: add security module, with rbac,sharing,oauth client etc.
- feat: add entity_card module
- feat: add abstract layer for user or teams search
- feat: add util to normalize folder path
- feat: add some string utils
- feat: allow force update all mappings for existing indices
- feat: add several http filters
- feat: add util to execute http requests via curl
🐛 问题修复 (Bug Fixes)
- fix: localhost/127.0.0.1 with noproxy #185
- fix: cluster metadata lost #200
- fix: fix security permission cache
- fix: fix incorrect queue capacity check
✈️ 改进 (Improvements)
- chore: less logging for session store change #180
- refactor: initialize index schema using index template
- chore: add generate secure string util func #183
- chore: add validate secure func #184
- refactor: refactoring security structs #191
- refactor: refactoring schema init logic, disable index based template #188
- chore: use safe special chars #190
- chore: reduce log with agent #193
- chore: add util to register http handler #206
- chore: allow access application settings for ui #209
- refactor: refactoring query string parser #216
- chore: update default fuzziness to 3 #215
- chore: avoid using same session name for mulit instances #221
- refactor: refactoring pipeline #222
- chore: enhance bulk indexing - stricter offset validation and improved error handling #224
- refactor: refactoring http utils #226
- refactor: refactoring search response, add score support
- refactor: refactoring ORM module, add generic security hooks
- refactor: add boolean query to orm query builder
- refactor: refactoring access_token, simplify login info
- refactor: move RegisterAllowOriginFunc to core
更多详情请查看以下各产品的 Release Notes 或联系我们的技术支持团队!
- Coco AI App
- Coco AI Server
- INFINI Easysearch
- INFINI Gateway
- INFINI Console
- INFINI Agent
- INFINI Loadgen
- INFINI Framework
期待反馈
欢迎下载体验使用,如果您在使用过程中遇到如何疑问或者问题,欢迎前往 INFINI Labs Github(https://github.com/infinilabs) 中的对应项目中提交 Feature Request 或提交 Bug。
下载地址: https://infinilabs.cn/download
邮件:hello@infini.ltd
电话:(+86) 400-139-9200
Discord:https://discord.gg/4tKTMkkvVX
也欢迎大家微信扫码添加小助手(INFINI-Labs),加入用户群一起讨论交流。

关于极限科技(INFINI Labs)

极限科技,全称极限数据(北京)科技有限公司,是一家专注于实时搜索与数据分析的软件公司。旗下品牌极限实验室(INFINI Labs)致力于打造极致易用的数据探索与分析体验。
极限科技是一支年轻的团队,采用天然分布式的方式来进行远程协作,员工分布在全球各地,希望通过努力成为中国乃至全球企业大数据实时搜索分析产品的首选,为中国技术品牌输出添砖加瓦。
使用 Docker Compose 轻松实现 INFINI Console 离线部署与持久化管理
开源项目 • INFINI Labs 小助手 发表了文章 • 0 个评论 • 10429 次浏览 • 2025-10-31 18:04
系列回顾与引言
在我们的 INFINI 本地环境搭建系列博客中:
- 第一篇《搭建持久化的 INFINI Console 与 Easysearch 容器环境》,我们深入探讨了如何使用基础的
docker run命令,一步步构建起 Console 和 Easysearch 服务,并重点解决了数据持久化的问题。 - 第二篇《使用 Docker Compose 简化 INFINI Console 与 Easysearch 环境搭建》,我们学习了如何利用 Docker Compose 的声明式配置,将多容器应用的定义和管理变得更加简洁高效。
- 第三篇《一键启动:使用 start-local 脚本轻松管理 INFINI Console 与 Easysearch 本地环境》,我们介绍了如何在联网环境下,一键安装 INFINI Console。
接下来,我们将聚焦于离线环境,详细讲解如何使用 Docker Compose 部署 INFINI Console 和 Easysearch。

简介
INFINI Console 是一款强大的集群管理与可观测性平台,而 INFINI Easysearch 则是一个轻量级、高性能的搜索与分析引擎。官方提供的离线部署包将两者整合,非常适合在无外网或需要快速搭建演示环境的场景下使用。

本文将详细介绍如何下载资源、正确加载镜像、以及最关键的——如何根据您的需求修改 docker-compose.yml 中的各项配置。
1. 准备工作
请确保您的环境中已安装以下软件:
- Docker
- Docker Compose
2. 下载离线资源
从官方地址下载两个核心文件:
infini-console.tar.gz: 包含docker-compose.yml和相关脚本。infini-console-easysearch-1.14.2.tar: 包含infinilabs/console和infinilabs/easysearch的 Docker 镜像。
wget https://release.infinilabs.com/easysearch/archive/offline/amd64/infini-console.tar.gz
wget https://release.infinilabs.com/easysearch/archive/offline/amd64/infini-console-easysearch-1.14.2.tar
3. 正确加载 Docker 镜像
注意:infini-console-easysearch-1.14.2.tar 是一个包含多个镜像的归档包,不能直接使用 docker load 加载。
正确的加载步骤如下:
-
创建目录并解压镜像归档包:
mkdir -p images tar -xvf infini-console-easysearch-1.14.2.tar -C images这会将
console.tar和easysearch.tar等文件解压到images/目录中。 -
批量加载所有镜像:
cd images ls *.tar | xargs -I {} docker load -i {}该命令会自动为目录下的每个
.tar文件执行docker load操作。 - 验证镜像加载结果:
docker images您应该能看到
infinilabs/console:1.29.8和infinilabs/easysearch:1.14.2等镜像。
4. 修改配置文件
解压 infini-console.tar.gz 后,找到 .env 文件。所有自定义配置都应在此文件中修改。
以下是各项配置的详细说明和修改建议:
核心路径配置
WORK_DIR_ABS=/data/infini-console
- 作用: 定义所有持久化数据(日志、配置、索引)的根目录。
- 修改建议: (必改) 强烈建议修改为您服务器上一个有足够空间的路径,例如
/opt/infini-console。确保该目录存在且 Docker 拥有写入权限。
网络配置
APP_NETWORK_NAME=infini-local-net
- 作用: 定义 Docker 内部网络的名称。
- 修改建议: 通常无需修改。
Console 配置
CONSOLE_IMAGE=infinilabs/console
CONSOLE_VERSION_TAG=1.29.8
CONSOLE_CONTAINER_NAME=infini-console
CONSOLE_PORT_HOST=9000
CONSOLE_PORT_CONTAINER=9000
- 作用: 定义 Console 的镜像、版本、容器名及端口映射。
- 修改建议:
CONSOLE_PORT_HOST: 如果宿主机的9000端口已被占用,请修改为其他可用端口(如8080)。
Easysearch 配置
EASYSEARCH_IMAGE=infinilabs/easysearch
EASYSEARCH_VERSION_TAG=1.14.2
EASYSEARCH_NODES=1
EASYSEARCH_CLUSTER_NAME=infini-console
- 作用: 定义 Easysearch 的镜像、版本、节点数和集群名。
- 修改建议:
EASYSEARCH_NODES: 单机部署保持1即可。
访问与安全配置
EASYSEARCH_INITIAL_ADMIN_PASSWORD=ShouldChangeme123.
- 作用: 设置 Easysearch
admin用户的初始密码。 - 修改建议: (必改) 请务必将其替换为一个强密码。登录 Console 时需要使用此密码。
EASYSEARCH_HTTP_PORT_HOST=9200
EASYSEARCH_TRANSPORT_PORT_HOST=9300
- 作用: 定义 Easysearch HTTP 和 Transport 接口在宿主机上的映射端口。
- 修改建议: 如果
9200或9300端口冲突,请修改。
JVM 参数配置
ES_JAVA_OPTS_DEFAULT="-Xms8g -Xmx8g"
- 作用: 设置 Easysearch 的 JVM 堆内存大小。
- 修改建议: (必改) 请根据服务器物理内存进行调整,避免超过物理内存的 50%。
- 8GB 内存服务器: 建议设为
-Xms2g -Xmx2g。 - 16GB 内存服务器: 建议设为
-Xms4g -Xmx4g。
- 8GB 内存服务器: 建议设为
数据持久化路径
CONSOLE_HOST_DATA_SUBPATH_REL=console/data
CONSOLE_HOST_LOGS_SUBPATH_REL=console/logs
EASYSEARCH_HOST_NODES_BASE_SUBPATH_REL=easysearch
- 作用: 定义数据和日志在
WORK_DIR_ABS下的相对子路径。 - 修改建议: 通常无需修改。
5. 启动服务
完成配置修改后,在 docker-compose.yml 所在目录下执行:
docker-compose up -d
等待服务完全启动。
6. 访问控制台
打开浏览器,访问 http://<你的服务器IP>:9000。
使用默认用户名 admin 和您在 EASYSEARCH_INITIAL_ADMIN_PASSWORD 中设置的密码进行初始化。
总结
通过以上步骤,您可以灵活地部署一套功能完整的 INFINI Console + Easysearch 环境。关键在于理解并根据实际情况修改 .env 文件中的参数,特别是 WORK_DIR_ABS、EASYSEARCH_INITIAL_ADMIN_PASSWORD 和 ES_JAVA_OPTS_DEFAULT,这能确保部署的稳定性和安全性。
希望这篇详细的指南能帮助您顺利完成部署!
作者:罗厚付,极限科技(INFINI Labs)云上产品设计与研发负责人,拥有多年安全风控及大数据系统架构经验,主导过多个核心产品的设计与落地,日常负责运维超大规模 ES 集群(800+节点/1PB+数据)。
原文:https://infinilabs.cn/blog/2025/console-easysearch-with-docker-compose-offline/
搜索百科(5):Easysearch — 自主可控的国产分布式搜索引擎
Easysearch • liaosy 发表了文章 • 0 个评论 • 7083 次浏览 • 2025-10-20 15:54
大家好,我是 INFINI Labs 的石阳。
欢迎关注 《搜索百科》 专栏!每天 5 分钟,带你速览一款搜索相关的技术或产品,同时还会带你探索它们背后的技术原理、发展故事及上手体验等。
在上一篇我们介绍了 OpenSearch —— 那个因协议争议而诞生的开源搜索分支。今天,我们把目光转向国内,聊聊极限科技研发的一款轻量级搜索引擎:Easysearch。
引言
在搜索技术的世界里,从 Lucene 的出现到 Solr、Elasticsearch 的崛起,搜索引擎技术已经发展了二十余年。然而,随着开源协议的变更与国际形势的变化,国产自主搜索引擎的需求愈发迫切。在这样的背景下,Easysearch 作为一款自主可控、轻量高效、兼容 Elasticsearch 的分布式搜索引擎应运而生,为国内企业带来了全新的选择。

Easysearch 概述
Easysearch 是一款分布式搜索型数据库,实现非结构化数据检索、全文检索、向量检索、地理位置信息查询、组合索引查询、多语种支持、聚合分析、AI 集成等。Easysearch 衍生自开源协议 Apache 2.0 的 Elasticsearch 7.10 版本,并不断往前迭代更新,紧跟 Lucene 最新版本的更新。Easysearch 可以替代 Elasticsearch,同时添加和完善多项企业级功能。
- 首次发布:2023 年 4 月
- 最新版本:1.15.4(截止 2025 年 10 月)
- 主导企业:极限科技 (INFINI Labs)
- 官方网址:https://easysearch.cn
诞生背景:为什么要有 Easysearch?
Easysearch 由极限科技(INFINI Labs)团队推出。项目的起点源于团队长期在搜索引擎和大数据领域的深厚实践积累,团队深刻认识到国内企业在使用 Elasticsearch 时普遍面临以下痛点:
- 开源协议变化带来的商业风险 —— Elastic 于 2021 年将许可更改为 SSPL,导致社区分裂,增加了企业在合规和商用上的不确定性;
- 高并发与高可靠性场景下对稳定可控方案的需求 —— 企业级应用亟需一个性能可靠、可深度优化的搜索基础设施;
- 技术栈自主可控的迫切需求 —— 随着国产化进程加快,国内生态中缺乏轻量化、易部署、且完全可控的搜索引擎产品;
- 本地化服务与快速响应能力的缺口 —— 国内企业更需要本地团队提供高效的技术支持与服务,对本土化、个性化功能需求能得到及时响应与反馈。
基于这些考虑,Easysearch 在设计之初就明确了目标:构建一款兼容 Elasticsearch API、简洁易用、性能出众且完全自主可控的国产搜索引擎。
核心特性
- 轻量级:安装包大小不到 60 MB,安装部署简洁,资源占用低,开箱即用;
- 跨平台:支持主流操作系统和 CPU 架构,支持国产信创运行环境;
- 高性能:针对不同场景进行的极致优化,可用更少硬件成本获得更高服务性能,降本增效。
- 稳定可靠:修复大量内核问题,解决内存泄露,集群卡顿、查询缓慢等问题,久经严苛业务环境考验。
- 安全增强:默认就提供完整的企业级安全功能,支持 LDAP/AD 集成,支持索引、文档、字段粒度细权管控。
- 兼容性强:兼容 Elasticsearch 7.x 的 REST API 和数据格式,迁移成本低;
- 可视化运维:无需 Kibana 即可通过内置 Web UI 插件界面管理索引、节点与监控指标等。
对比优势
| 对比维度 | Easysearch | Elasticsearch | OpenSearch |
|---|---|---|---|
| 用户协议 | 社区免费+商业授权 | SSPL/AGPL v3 | Apache 2.0 |
| API 兼容性 | 高度兼容 ES | 原生 | 高度兼容 ES |
| 最小安装体积 | 57MB | 482MB | 682MB |
| 部署复杂度 | 简单 | 中等 | 相对复杂 |
| 信创环境支持 | 全面兼容 | 无 | 无 |
| 可视化管理 | 开箱即用管理后台 | 需独立部署 Kibana | 需独立部署 OpenSearch Dashboards |
| 本地化与中文支持 | 强 | 弱 | 弱 |
| AI 插件支持 | 较弱 | 强 | 较强 |
| 社区与生态 | 快速成长中 | 成熟广泛 | 活跃增长 |
快速开始:5 分钟体验 Easysearch
1. 使用 Docker 启动
# 直接运行镜像使用随机密码(数据及配置未持久化)
docker run --name easysearch \
--ulimit memlock=-1:-1 \
-p 9200:9200 \
infinilabs/easysearch:1.15.4
2. 验证集群状态
curl -ku "username:password" -X GET "https://localhost:9200/"
返回结果示例:
{
"name": "easysearch-node",
"cluster_name": "easysearch-6yhwn91v80gf",
"cluster_uuid": "Gfu_fuF1QViJfeUWVbiFCA",
"version": {
"distribution": "easysearch",
"number": "1.15.4",
"distributor": "INFINI Labs",
"build_hash": "9110128946b0af3de639966cfa74b5498346949d",
"build_date": "2025-10-14T03:30:41.948590Z",
"build_snapshot": false,
"lucene_version": "8.11.4",
"minimum_wire_lucene_version": "7.7.0",
"minimum_lucene_index_compatibility_version": "7.7.0"
},
"tagline": "You Know, For Easy Search!"
}
3. 索引与搜索示例
# 写入文档
curl -ku "username:password" -X POST "https://localhost:9200/my_index/_doc" -H 'Content-Type: application/json' -d'
{
"title": "Easysearch 入门",
"content": "这是一个轻量级搜索引擎的示例文档。",
"tags": ["搜索", "国产", "轻量级"]
}'
# 搜索文档
curl -ku "username:password" -X GET "https://localhost:9200/my_index/_search" -H 'Content-Type: application/json' -d'
{
"query": {
"match": {
"content": "搜索引擎"
}
}
}'
4. 使用 Easysearch UI
Easysearch 提供了轻量级界面化管理功能,不再依赖第三方组件即可对集群进行管理,真正做到开箱即用。如果你安装了 Easysearch UI 插件或者下载捆绑包,可通过 https://localhost:9200/\_ui/ 访问,进行节点、索引、分片、查询调试和监控查看等管理。
图 1:系统登录

图 2:集群概览

图 3:节点列表

图 4:节点概览

图 5:索引列表

图 6:索引概览

图 7:分片管理

图 8:开发工具

以上仅列出了一些基本功能,其他如安全管理、主从复制、备份管理、生命周期管理等更多高级功能由于篇幅限制不一一展示,有兴趣的朋友可自行部署探索。
结语
Easysearch 的诞生,不仅填补了国产搜索引擎在分布式与轻量化领域的空白,也让更多企业在面对开源协议变动与外部技术依赖时,拥有了更加安全、灵活、可控的选择。
它既是国产替代方案的有力代表,更是新一代搜索技术生态的积极探索者,为企业级实时搜索与分析带来新的可能。
🚀 下期预告
下一篇我们将介绍 一款 AI 驱动的现代搜索引擎 - Meilisearch,基于 Rust 构建的开源搜索引擎,性能高、部署简单。号称比 Elasticsearch 快 10 倍,真的这么牛吗?
💬 三连互动
- 你是否在使用或考虑国产搜索替代方案?
- 在实际项目中,你最看重搜索引擎的哪些特性?(性能、兼容性、运维、成本)
- 对 Easysearch 有什么功能上的期待?
对搜索技术感兴趣的朋友,也欢迎加我微信(ID:lsy965145175)备注“搜索百科”,拉你进 搜索技术交流群,一起探讨与学习!
✨ 推荐阅读
- 搜索百科(4):OpenSearch — 开源搜索的新选择
- 搜索百科(3):Elasticsearch — 搜索界的"流量明星"
- 搜索百科(2):Apache Solr — 企业级搜索的开源先锋
- 搜索百科(1):Lucene — 打开现代搜索世界的第一扇门
🔗 参考资源
原文:https://infinilabs.cn/blog/2025/search-wiki-5-easysearch/
【搜索客社区日报】第2125期 (2025-10-13)
社区日报 • Muses 发表了文章 • 0 个评论 • 6757 次浏览 • 2025-10-14 00:02
Easysearch 冷热架构实战
Easysearch • INFINI Labs 小助手 发表了文章 • 0 个评论 • 11020 次浏览 • 2025-10-01 20:11
在之前的文章中,我们介绍了如何使用索引生命周期策略来管理索引。如果要求索引根据其生命周期阶段自动在不同的节点之间迁移,还需要用到冷热架构。我们来看看具体如何实现。
冷热架构
冷热架构其实就是在 Easyearch 集群中定义不同属性的节点,这些节点共同组成冷热架构。比如给所有热节点一个 hot 属性,给所有冷节点一个 cold 属性。在 Easyearch 中分配节点属性是通过配置文件(easysearch.yml)来实现的,比如我要定义一个热节点和一个冷节点,我可以在对应节点的配置文件中添加如下行:
# 热节点添加下面的行
node.attr.temp: hot
# 冷节点添加下面的行
node.attr.temp: cold
有了这些属性,我们就可以指定索引分片在分配时,是落在 hot 节点还是 cold 节点。
查看节点属性
测试环境是个 2 节点的 Easysearch 集群。

比如我创建新索引 test-index,希望它被分配到 hot 节点上。
PUT test-index
{
"settings": {
"number_of_replicas": 0,
"index.routing.allocation.require.temp": "hot"
}
}

可以看到 test-index 索引的分片分配到 hot 节点 node-1 上。我们修改索引分配节点的属性,让其移动到 cold 节点 node-2 上。
PUT test-index/_settings
{
"settings": {
"index.routing.allocation.require.temp": "cold"
}
}

生命周期与冷热架构
在上面的例子中,我们通过索引分配节点属性对索引“坐落”的节点进行了控制。在索引生命周期策略中也支持对该属性进行修改,实现索引根据生命周期阶段自动在不同的节点之间移动的目的。
比如我们定义一个简单的索引策略:
- 索引创建后进入 hot 阶段,此阶段的索引被分配到 hot 节点
- 创建索引 3 分钟后,索引进入 cold 阶段,此阶段索引分片移动到 cold 节点
创建策略
PUT _ilm/policy/ilm_test
{
"policy": {
"phases": {
"hot": {
"min_age": "0m",
},
"cold": {
"min_age": "3m",
"actions": {
"allocate" : {
"require" : {
"temp": "cold"
}
}
}
}
}
}
}
生命周期策略后台是定期触发的任务,为了更快的观测到效果,可以修改任务触发周期为每分钟 1 次。
PUT _cluster/settings
{
"transient": {
"index_lifecycle_management.job_interval":"1"
}
}
创建索引模板
创建完索引生命周期策略,还需要索引模板把索引和生命周期策略关联起来。我们创建一个模板把所有 ilm_test 开头的索引与 ilm_test 生命周期策略关联,为了便于观察,指定索引没有副本分片。
PUT _template/ilm_test
{
"order" : 100000,
"index_patterns" : [
"ilm_test*"
],
"settings" : {
"index" : {
"lifecycle" : {
"name" : "ilm_test"
},
"number_of_replicas" : "0",
"routing.allocation.require.temp": "hot"
}
}
}
创建索引
创建一个 ilm_test 开头的索引,应用上一步创建的索引模板。
POST ilm_test_1/_doc
{
"test":"test"
}
查看索引分片分配情况。

目前索引存储在 node-1 节点,按计划 3 分钟后将会移动到 node-2 上。


至此我们已通过索引生命周期策略实现了索引分片的移动,其实支持的操作还有很多,比如: rollover、close、snapshot 等,详情请参阅官方文档。
有任何问题,欢迎加我微信沟通。

关于 Easysearch

INFINI Easysearch 是一个分布式的搜索型数据库,实现非结构化数据检索、全文检索、向量检索、地理位置信息查询、组合索引查询、多语种支持、聚合分析等。Easysearch 可以完美替代 Elasticsearch,同时添加和完善多项企业级功能。Easysearch 助您拥有简洁、高效、易用的搜索体验。
Easysearch 字段'隐身'之谜:source_reuse 与 ignore_above 的陷阱解析
Easysearch • INFINI Labs 小助手 发表了文章 • 0 个评论 • 11248 次浏览 • 2025-09-30 16:08
背景问题
前阵子,社区有小伙伴在使用 Easysearch 的数据压缩功能时发现,在开启 source_reuse 和 ZSTD 后,一个字段的内容看不到了。
索引的设置如下:
{
......
"settings": {
"index": {
"codec": "ZSTD",
"source_reuse": "true"
}
},
"mappings": {
"dynamic_templates": [
{
"message_field": {
"path_match": "message",
"mapping": {
"norms": false,
"type": "text"
},
"match_mapping_type": "string"
}
},
{
"string_fields": {
"mapping": {
"norms": false,
"type": "text",
"fields": {
"keyword": {
"ignore_above": 256,
"type": "keyword"
}
}
},
"match_mapping_type": "string",
"match": "*"
}
}
]
......
}
然后产生的一个多字段内容能被搜索到,但是不可见。
类似于下面的这个情况:

原因分析
我们先来看看整个字段展示经历的环节:

- 字段写入索引的时候,不仅写了 text 字段也写了 keyword 字段。
- keyword 字段产生倒排索引的时候,会忽略掉长度超过 ignore_above 的内容。
- 因为开启了 source_reuse,_source 字段中与 doc_values 或倒排索引重复的部分会被去除。
- 产生的数据文件进行了 ZSTD 压缩,进一步提高了数据的压缩效率。
- 索引进行倒排或者 docvalue 的查询,检索到这个文档进行展示。
- 展示的时候通过文档 id 获取
_source或者docvalues_fields的内容来展示文本,但是文本内容是空的。
其中步骤 4 中的 ZSTD 压缩,是作用于数据文件的,并不对数据内容进行修改。因此,我们来专注于其他环节。
问题复现
首先,这个字段索引的配置也是一个 es 常见的设置,并不会带来内容显示缺失的问题。
"mapping": {
"type": "text",
"fields": {
"keyword": {
"ignore_above": 256,
"type": "keyword"
}
}
},
那么,source_reuse 就成了我们可以重点排查的环节。
source 发生了什么
source_reuse 的作用描述如下:
source_reuse: 启用 source_reuse 配置项能够去除 _source 字段中与 doc_values 或倒排索引重复的部分,从而有效减小索引总体大小,这个功能对日志类索引效果尤其明显。
source_reuse 支持对以下数据类型进行压缩:keyword,integer,long,short,boolean,float,half_float,double,geo_point,ip, 如果是 text 类型,需要默认启用 keyword 类型的 multi-field 映射。 以上类型必须启用 doc_values 映射(默认启用)才能压缩。
这是一个对 _source 字段进行产品化的功能实现。为了减少索引的存储体量,简单粗暴的操作是直接将_source字段进行关闭,利用其他数据格式去存储,在查询的时候对应的利用 docvalue 或者 indexed 去展示文本内容。
那么 _source关闭后,会不会也有这样的问题呢?
测试的步骤如下:
# 1. 创建不带source的双字段索引
PUT test_source
{
"mappings": {
"_source": {
"enabled": false
},
"properties": {
"msg": {
"type": "text",
"fields": {
"keyword": {
"ignore_above": 256,
"type": "keyword"
}
}
}
}
}
}
# 2. 写入测试数据
POST test_source/_doc/1
{"msg":"""[08-27 14:28:45] [DBG] [config.go:273] config contain variables, try to parse with environments
[08-27 14:28:45] [DBG] [config.go:214] load config files: []
[08-27 14:28:45] [INF] [pipeline.go:419] creating pipeline: pipeline_logging_merge
[08-27 14:28:45] [INF] [pipeline.go:419] creating pipeline: ingest_pipeline_logging
[08-27 14:28:45] [INF] [pipeline.go:419] creating pipeline: async_messages_merge
[08-27 14:28:45] [INF] [pipeline.go:419] creating pipeline: metrics_merge
[08-27 14:28:45] [INF] [pipeline.go:419] creating pipeline: request_logging_merge
[08-27 14:28:45] [INF] [pipeline.go:419] creating pipeline: ingest_merged_requests
[08-27 14:28:45] [INF] [pipeline.go:419] creating pipeline: async_ingest_bulk_requests
[08-27 14:28:45] [INF] [module.go:159] started module: pipeline
[08-27 14:28:45] [DBG] [module.go:163] all system module are started
[08-27 14:28:45] [DBG] [floating_ip.go:348] setup floating_ip, root privilege are required
[08-27 14:28:45] [DBG] [queue_config.go:121] init new queue config:e60457c6eae50a4eabbb62fc1001dccc,bulk_requests
[08-27 14:28:45] [DBG] [queue_config.go:121] init new queue config:e60457c6eae50a4eabbb62fc1001dccc,bulk_requests
[08-27 14:28:45] [DBG] [queue_config.go:121] init new queue config:e60457c6eae50a4eabbb62fc1001dccc,bulk_requests
[08-27 14:28:45] [DBG] [processor.go:139] generated new processors: indexing_merge
[08-27 14:28:45] [DBG] [pipeline.go:466] processing pipeline_v2: metrics_merge
[08-27 14:28:45] [DBG] [processor.go:139] generated new processors: when
[08-27 14:28:45] [DBG] [pipeline.go:466] processing pipeline_v2: ingest_merged_requests
[08-27 14:28:45] [DBG] [processor.go:139] generated new processors: indexing_merge
[08-27 14:28:45] [DBG] [pipeline.go:466] processing pipeline_v2: request_logging_merge
[08-27 14:28:45] [DBG] [processor.go:139] generated new processors: indexing_merge
[08-27 14:28:45] [DBG] [pipeline.go:466] processing pipeline_v2: async_messages_merge
[08-27 14:28:45] [DBG] [processor.go:139] generated new processors: bulk_indexing
[08-27 14:28:45] [DBG] [pipeline.go:466] processing pipeline_v2: ingest_pipeline_logging
[08-27 14:28:45] [DBG] [queue_config.go:121] init new queue config:1216c96eb876eee5b177d45436d0a362,gateway-pipeline-logs
[08-27 14:28:45] [DBG] [processor.go:139] generated new processors: bulk_indexing
[08-27 14:28:45] [DBG] [processor.go:139] generated new processors: indexing_merge
[08-27 14:28:45] [DBG] [pipeline.go:466] processing pipeline_v2: pipeline_logging_merge
[08-27 14:28:45] [DBG] [pipeline.go:466] processing pipeline_v2: async_ingest_bulk_requests
[08-27 14:28:45] [DBG] [badger.go:110] init badger database [queue_consumer_commit_offset]
[08-27 14:28:45] [INF] [floating_ip.go:290] floating_ip entering standby mode
[08-27 14:28:45] [DBG] [badger.go:110] init badger database [dis_locker]
[08-27 14:28:45] [DBG] [time.go:208] refresh low precision time in background
[08-27 14:28:45] [DBG] [domain_actions.go:278] elasticsearch metadata [backup] was not found
[08-27 14:28:45] [DBG] [bulk_indexing.go:355] metadata for [backup] is nil
[08-27 14:28:50] [INF] [module.go:178] started plugin: floating_ip
[08-27 14:28:50] [INF] [module.go:178] started plugin: force_merge
[08-27 14:28:50] [DBG] [network.go:78] network io stats will be included for map[]
[08-27 14:28:50] [INF] [module.go:178] started plugin: metrics
[08-27 14:28:50] [INF] [module.go:178] started plugin: statsd
[08-27 14:28:50] [DBG] [entry.go:100] reuse port 0.0.0.0:7005
[08-27 14:28:50] [DBG] [metrics.go:205] collecting network metrics
[08-27 14:28:50] [DBG] [metrics.go:174] collecting instance metrics
[08-27 14:28:50] [DBG] [elasticsearch.go:128] init elasticsearch proxy instance: prod
[08-27 14:28:50] [DBG] [filter.go:103] generated new filters: when, elasticsearch
[08-27 14:28:50] [DBG] [entry.go:142] apply filter flow: [*] [/_bulk] [ filters ]
[08-27 14:28:50] [DBG] [entry.go:142] apply filter flow: [*] [/{any_index}/_bulk] [ filters ]
[08-27 14:28:50] [DBG] [elasticsearch.go:128] init elasticsearch proxy instance: prod
[08-27 14:28:50] [DBG] [filter.go:103] generated new filters: request_path_limiter, elasticsearch
[08-27 14:28:50] [INF] [module.go:178] started plugin: gateway
[08-27 14:28:50] [DBG] [module.go:182] all user plugin are started
[08-27 14:28:50] [INF] [module.go:184] all modules are started
[08-27 14:28:50] [INF] [app.go:556] gateway is up and running now.
[08-27 14:28:50] [DBG] [domain_actions.go:278] elasticsearch metadata [backup] was not found
[08-27 14:28:50] [DBG] [bulk_indexing.go:355] metadata for [backup] is nil
[08-27 14:28:55] [DBG] [domain_actions.go:278] elasticsearch metadata [backup] was not found
[08-27 14:28:55] [DBG] [bulk_indexing.go:355] metadata for [backup] is nil
[08-27 14:29:00] [DBG] [metrics.go:205] collecting network metrics
[08-27 14:29:00] [DBG] [metrics.go:174] collecting instance metrics
[08-27 14:29:00] [DBG] [domain_actions.go:278] elasticsearch metadata [backup] was not found
[08-27 14:29:00] [DBG] [bulk_indexing.go:355] metadata for [backup] is nil
[08-27 14:29:05] [DBG] [domain_actions.go:278] elasticsearch metadata [backup] was not found
[08-27 14:29:05] [DBG] [bulk_indexing.go:355] metadata for [backup] is nil
[08-27 14:29:10] [DBG] [metrics.go:205] collecting network metrics
[08-27 14:29:10] [DBG] [metrics.go:174] collecting instance metrics
[08-27 14:29:10] [DBG] [domain_actions.go:278] elasticsearch metadata [backup] was not found"""}
# 3. 查询数据
GET test_source/_search
此时,可以看到,存入的文档检索出来是空的

_source 字段是用于索引时传递的原始 JSON 文档主体。它本身未被索引成倒排(因此不作用于 query 阶段),只是在执行查询时用于 fetch 文档内容。
对于 text 类型,关闭_source,则字段内容自然不可被查看。
而对于 keyword 字段,查看_source也是不行的。可是 keyword 不仅存储source,还存储了 doc_values。因此,对于 keyword 字段类型,可以考虑关闭_source,使用 docvalue_fields 来查看字段内容。
测试如下:
# 1. 创建测试条件的索引
PUT test_source2
{
"mappings": {
"_source": {
"enabled": false
},
"properties": {
"msg": {
"type": "keyword"
}
}
}
}
# 2. 写入数据
POST test_source2/_doc
{"msg":"1111111"}
# 3. 使用 docvalue_fields 查询数据
POST test_source2/_search
{"docvalue_fields": ["msg"]}
# 返回结果
{
"took": 1,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 1,
"hits": [
{
"_index": "test_source2",
"_type": "_doc",
"_id": "yBvTj5kBvrlGDwP29avf",
"_score": 1,
"fields": {
"msg": [
"1111111"
]
}
}
]
}
}
在如果是 text 类型,需要默认启用 keyword 类型的 multi-field 映射。 以上类型必须启用 doc_values 映射(默认启用)才能压缩。这句介绍里,也可以看到 source_reuse 的正常使用需要 doc_values。_那是不是一样使用 doc_values 进行内容展示呢?既然用于 docvalue_fields 内容展示,为什么还是内容看不了(不可见)呢?_
keyword 的 ignore_above
仔细看问题场景里 keyword 的配置,它使用了 ignore_above。那么,会不会是这里的问题?
我们将 ignore_above 配置带入上面的测试,这里为了简化测试,ignore_above 配置为 3。为区分问题现象,这里两条长度不同的文本进去,一条为 11,一条为1111111,可以作为参数作用效果的对比。
# 1. 创建测试条件的索引,ignore_above 设置为3
PUT test_source3
{
"mappings": {
"_source": {
"enabled": false
},
"properties": {
"msg": {
"type": "keyword",
"ignore_above": 3
}
}
}
}
# 2. 写入数据,
POST test_source3/_doc
{"msg":"1111111"}
POST test_source3/_doc
{"msg":"11"}
# 3. 使用 docvalue_fields 查询数据
POST test_source3/_search
{"docvalue_fields": ["msg"]}
# 返回内容
{
"took": 363,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 2,
"relation": "eq"
},
"max_score": 1,
"hits": [
{
"_index": "test_source3",
"_type": "_doc",
"_id": "yhvjj5kBvrlGDwP22KsG",
"_score": 1
},
{
"_index": "test_source3",
"_type": "_doc",
"_id": "yxvzj5kBvrlGDwP2Nav6",
"_score": 1,
"fields": {
"msg": [
"11"
]
}
}
]
}
}
OK! 问题终于复现了。我们再来看看作为关键因素的 ignore_above 参数是用来干嘛的。
ignore_above:任何长度超过此整数值的字符串都不应被索引。默认值为 2147483647。默认动态映射会创建一个 ignore_above 设置为 256 的 keyword 子字段。
也就是说,ignore_above 在(倒排)索引时会截取内容,防止产生的索引内容过长。
但是从测试的两个文本来看,面对在参数范围内的文档,docvalues 会正常创建,而超出参数范围的文本而忽略创建(至于这个问题背后的源码细节我们可以另外开坑再鸽,此处省略)。
那么,在 source_reuse 下,keyword 的 ignore_above 是不是起到了相同的作用呢?
我们可以在问题场景上去除 ignore_above,参数试试,来看下面的测试:
# 1. 创建测试条件的索引,使用 source_reuse,设置 ignore_above 为3
PUT test_source4
{
"settings": {
"index": {
"source_reuse": "true"
}
},
"mappings": {
"properties": {
"msg": {
"type": "text",
"fields": {
"keyword": {
"ignore_above": 3,
"type": "keyword"
}
}
}
}
}
}
# 2. 写入数据
POST test_source4/_doc
{"msg":"1111111"}
POST test_source4/_doc
{"msg":"11"}
# 3. 使用 docvalue_fields 查询数据
POST test_source4/_search
# 返回内容
{
"took": 1,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 2,
"relation": "eq"
},
"max_score": 1,
"hits": [
{
"_index": "test_source4",
"_type": "_doc",
"_id": "",
"_score": 1,
"_source": {}
},
{
"_index": "test_source4",
"_type": "_doc",
"_id": "zRv2j5kBvrlGDwP2_qsO",
"_score": 1,
"_source": {
"msg": "11"
}
}
]
}
}
可以看到,数据“不可见”的问题被完整的复现了。
小结
从上面一系列针对数据“不可见”问题的测试,我们可以总结以下几点:
- 在 source_reuse 的压缩使用中,keyword 字段的 ignore_ablve 参数尽量使用默认值,不要进行过短的设置(这个 tip 已补充在 Easysearch 文档中)。
- 在 source_reuse 是对数据压缩常见方法-关闭 source 字段的产品化处理,在日志压缩场景中有效且便捷,可以考虑多加利用。
- keyword 的 ignore_above 参数,不仅超出长度范围不进行倒排索引,也不会写入 docvalues。
特别感谢:社区@牛牪犇群
更多 Easysearch 资料请查看 官网文档。
作者:金多安,极限科技(INFINI Labs)搜索运维专家,Elastic 认证专家,搜索客社区日报责任编辑。一直从事与搜索运维相关的工作,日常会去挖掘 ES / Lucene 方向的搜索技术原理,保持搜索相关技术发展的关注。
原文:https://infinilabs.cn/blog/2025/invisibility-in-easysearch-field/
INFINI Labs 产品更新 | Coco AI v0.8 与 Easysearch v1.15 全新功能上线,AI 搜索体验再进化!
资讯动态 • INFINI Labs 小助手 发表了文章 • 0 个评论 • 12021 次浏览 • 2025-09-30 14:49

INFINI Labs 产品更新发布!此次更新主要包括 Coco AI v0.8 新增窗口管理插件,新的插件类型 View,Linux 文件搜索以及更多的连接器;Easysearch v1.15 新增 UI 插件,提供了轻量级界面化管理功能,不再依赖第三方对集群进行管理,真正做到开箱即用,AI 插件正式提供混合搜索能力,结合了关键词搜索和语义搜索,以提升搜索相关性。
以下为详细更新介绍:
Coco AI v0.8
Coco AI 是一款完全开源、跨平台的企业级智能搜索与助手系统,专为现代企业打造。它通过统一搜索入口,连接企业内外部的异构数据源,融合大模型能力,帮助团队高效访问知识,智能决策协作。

Coco AI 本次详细更新记录如下:
Coco AI 客户端 v0.8
功能特性 (Features)
- 改进版本升级,跳过此版本的按钮
- 支持从本地安装插件
- 子插件的 JSON 现在也可以设置 platforms 字段
- 插件设置页面现在可以卸载插件
- 新增插件设置项 'hide_before_open'
- App 搜索索引 app 的名字,现在索引多种语言的 app 名字,英文、中文以及系统语言
- Debug 模式下,支持 context menu
- 为 Linux (GNOME/KDE) 实现文件搜索
- 实现 MacOS 窗口管理插件
- 新增插件类型 View
- 对于文件搜索的结果,现在可以打开文件所在的文件夹
问题修复 (Bug Fixes)
- 修复更新检查失败的问题
- 修复 web 组件,登录状态的问题
- 修复快捷键无法打开插件商店的问题
- 修复设置插件快捷键在 Windows 上崩溃的问题
- 修复无法通过 "coco://" deeplink 登录的问题
- MacOS 文件搜索,确保 mdfind 进程不会成为僵尸进程
- 修复设置窗口打开是空白的问题
- 尽最大努力,确保用户添加的 search path 中的文件会被 indexer 索引
- 修复 MacOS 某些 app 设置空的 CFBundleDisplayName/CFBundleName 导致 app 名字为空的问题
改进优化 (Improvements)
- 将 query_coco_fusion() 函数拆分
- 清理 tauri::AppHandle’s 类型的范型参数 R
- 检查各个安装渠道的 plugin.json 文件,确保合法
- 在 MacOS 上不再为窗口设置 CanJoinAllSpaces 的属性
- 修复 web 组件构建的问题
- 为第三方插件安装的过程上锁
- MacOS/iOS: 支持从 Assets.car 提取 app 图标,从而不再跳过它们
- 放宽 MacOS 文件搜索的条件,避免无法搜到的问题
- 确保 Coco app 在呼出时,不会拿 focus
- 对于 web 组件,跳过登录检查
- 对于 View 插件,处理 HTML 文件,使用 convertFileSrc()处理如下 2 个 tag:"link[href]" and "img[src]"
Coco APP 相关截图

Coco AI 服务端 v0.8
重大变更(Breaking Changes)
- 更新语雀的文档 ID
- 重构数据源同步管理
功能特性 (Features)
- 支持通过路径层次方式访问数据源中的文档
- 处理文档搜索的 path_hierarchy 配置
- Confluence Wiki 连接器
- 为 Notion 连接器提取内容
- 新增网络存储连接器
- 新增 PostgreSQL 连接器
- 新增 MySQL 连接器
- 新增 GitHub 连接器
- 新增 飞书/Lark 连接器
- 新增 GitLab 连接器
- 新增 Salesforce 连接器
- 新增 Gitea 连接器
- 新增 MSSQL 连接器
- 新增 Oracle 连接器
问题修复 (Bug Fixes)
- 修正助手更新逻辑
- 生成唯一图标键以防止意外删除所有图标
- 在 Coco 服务器登录期间修改 access_token URL
- 修复 Web 小部件的权限问题
- 由于在搜索框中导入图标而导致的额外高度
- 全屏模式下页面滚动不工作
- 解决 API 令牌列表分页问题
- MSSQL 分页错误
- 修复 S3 连接器图标
改进优化 (Improvements)
- 移除未使用的 WebSocket API
- 为 Google Drive 添加缺失的根文件夹
- 更新创建/修改连接器页面上的默认连接器设置表单
- 调整数据源详情的标题
- 重构摘要处理器
- 为 Google Drive 添加缺失的文档
- 将 Easysearch 初始管理员密码更新为复杂规则
- 统一许可证头
- 更新默认数据源编辑页面
- 重构 OAuth 连接组件
- 将数据源列表的默认大小设置为 12
- 在设置中添加搜索设置
- 在集成全屏中支持页面模式
- 为列表项添加图标
- 重构非托管模式的 security API
- 支持通过路径层次方式访问 local_fs 连接器中的文档
- 支持通过路径层次方式访问 S3、网络驱动器、GitHub、GitLab 和 Gitee 连接器中的文档
Coco Server 相关截图

Easysearch v1.15
重大变更(Breaking Changes)
- 针对安全模块的角色名称进行规范,废弃不符合规范的角色
- 更新创建搜索管道的 API 的 json 结构和说明文档
功能特性 (Features)
- 新增 ui 插件,涵盖从集群,节点,索引,到分片等不同维度的监控和管理功能以及备份快照、跨集群复制、数据流、热点线程、限流限速配置等管理功能
- ai 插件正式提供混合搜索能力,结合了关键词搜索和语义搜索,以提升搜索相关性
- ai 插件正式提供混合搜索能力
- 允许动态的跨模板重用设置
改进优化 (Improvements)
- index-management 从 plugin 移动到 modules
- 精简证书错误时的日志输出
- 改进 search_pipeline 的统计指标
- 改进角色名称和描述
- 增加 数据流(Data streams)说明文档
- 更新搜索管道相关文档
- 去掉 ILM 配置索引的前缀,并兼容旧索引
Easysearch 新增的 UI 插件为 Easysearch 提供了轻量级界面化管理功能,不再依赖第三方对集群进行管理,真正做到开箱即用。 UI 相关截图如下:








更多详情请查看以下各产品的 Release Notes 或联系我们的技术支持团队!
期待反馈
欢迎下载体验使用,如果您在使用过程中遇到如何疑问或者问题,欢迎前往 INFINI Labs Github(https://github.com/infinilabs) 中的对应项目中提交 Feature Request 或提交 Bug。
下载地址: https://infinilabs.cn/download
邮件:hello@infini.ltd
电话:(+86) 400-139-9200
Discord:https://discord.gg/4tKTMkkvVX
也欢迎大家微信扫码添加小助手(INFINI-Labs),加入用户群一起讨论交流。

关于极限科技(INFINI Labs)

极限科技,全称极限数据(北京)科技有限公司,是一家专注于实时搜索与数据分析的软件公司。旗下品牌极限实验室(INFINI Labs)致力于打造极致易用的数据探索与分析体验。
极限科技是一支年轻的团队,采用天然分布式的方式来进行远程协作,员工分布在全球各地,希望通过努力成为中国乃至全球企业大数据实时搜索分析产品的首选,为中国技术品牌输出添砖加瓦。
招聘!搜索运维工程师(Elasticsearch/Easysearch)-全职/北京/12-20K
求职招聘 • INFINI Labs 小助手 发表了文章 • 0 个评论 • 10308 次浏览 • 2025-09-22 12:33
极限科技诚招全职搜索运维工程师(Elasticsearch/Easysearch)!
欢迎搜索技术热爱者加入我们,共同打造高效、智能的搜索解决方案!
在招岗位介绍
岗位名称
搜索运维工程师(Elasticsearch/Easysearch)
Base:北京
薪资待遇:12-20K,五险一金,双休等
岗位职责
- 负责客户现场的 Elasticsearch/Easysearch/OpenSearch 搜索引擎集群的日常维护、监控和优化,确保集群的高可用性和性能稳定;
- 协助客户进行搜索引擎集群的部署、配置及版本升级;
- 排查和解决 Elasticsearch/Easysearch/OpenSearch 集群中的各种技术问题,及时响应并处理集群异常;
- 根据业务需求设计和实施搜索索引的调优、数据迁移和扩展方案;
- 负责与客户沟通,提供技术支持及相关培训,确保客户需求得到有效满足;
- 制定并实施搜索引擎的备份、恢复和安全策略,保障数据安全;
- 与内部研发团队和外部客户进行协作,推动集群性能改进和功能优化。
岗位要求
- 全日制本科及以上学历,2 年以上运维工作经验;
- 拥有 Elasticsearch/Easysearch/OpenSearch 使用经验,熟悉搜索引擎的原理、架构和相关生态工具(如 Logstash、Kibana 等);
- 熟悉 Linux 操作系统的使用及常见性能调优方法;
- 熟练掌握 Shell 或 Python 等至少一种脚本语言,能够编写自动化运维脚本;
- 具有优秀的问题分析与解决能力,能够快速应对突发情况;
- 具备良好的沟通能力和团队合作精神,能够接受客户驻场工作;
- 提供 五险一金,享有带薪年假及法定节假日。
加分项
- 计算机科学、信息技术或相关专业;
- 具备丰富的大规模分布式系统运维经验;
- 熟悉 Elasticsearch/Easysearch/OpenSearch 分片、路由、查询优化等高级功能;
- 拥有 Elastic Certified Engineer 认证;
- 具备大规模搜索引擎集群设计、扩展和调优经验;
- 熟悉其他搜索引擎技术(如 Solr、Lucene)者优先;
- 熟悉大数据处理相关技术(比如: Kafka 、Flink 等)者优先。
简历投递
- 邮件:hello@infini.ltd(邮件标题请备注姓名 求职岗位)
- 微信:INFINI-Labs (加微请备注求职岗位)

关于极限科技(INFINI Labs)

极限科技,全称极限数据(北京)科技有限公司,是一家专注于实时搜索与数据分析的软件公司。旗下品牌极限实验室(INFINI Labs)致力于打造极致易用的数据探索与分析体验。
极限科技是一支年轻的团队,采用天然分布式的方式来进行远程协作,员工分布在全球各地,希望通过努力成为中国乃至全球企业大数据实时搜索分析产品的首选,为中国技术品牌输出添砖加瓦。
我们在做什么
极限科技(INFINI Labs)正在致力于以下几个核心方向:
1、开发近实时搜索引擎 INFINI Easysearch INFINI Easysearch 是一个分布式的搜索型数据库,实现非结构化数据检索、全文检索、向量检索、地理位置信息查询、组合索引查询、多语种支持、聚合分析等。Easysearch 可以替代 Elasticsearch,同时添加和完善多项企业级功能。Easysearch 助您拥有简洁、高效、易用的搜索体验。详情参见:https://infinilabs.cn
2、打造下一代实时搜索引擎 INFINI Pizza INFINI Pizza 是一个分布式混合搜索数据库系统。我们的使命是充分利用现代硬件和人工智能的潜力,为企业提供量身定制的实时智能搜索体验。我们致力于满足具有挑战性的环境中高并发和高吞吐量的需求,同时提供无缝高效的搜索功能。详情参见:https://pizza.rs
3、为现代团队打造的统一搜索与 AI 智能助手 Coco AI Coco AI 是一款完全开源的统一搜索与 AI 助手平台,它通过统一搜索入口,连接企业内外部的异构数据源,融合大模型能力,帮助团队高效访问知识,智能决策协作。详情参见:https://coco.rs
4、积极参与全球开源生态建设 通过开源 Coco AI、Console、Gateway、Agent、Loadgen 等搜索领域产品和社区贡献,推动全球开源技术的发展,提升中国在全球开源领域的影响力。INFINI Labs Github 主页:https://github.com/infinilabs
5、提供专业服务 为客户提供包括搜索技术支持、迁移服务、定制解决方案和培训在内的全方位服务。
6、提供国产化搜索解决方案 针对中国市场的特殊需求,提供符合国产化标准的搜索产品和解决方案,帮助客户解决使用 Elasticsearch 时遇到的挑战。
极限科技(INFINI Labs)通过这些努力,旨在成为全球领先的实时搜索和数据分析解决方案提供商。
如何使用极限网关实现 Elasticsearch 集群迁移至 Easysearch
Elasticsearch • INFINI Labs 小助手 发表了文章 • 0 个评论 • 12731 次浏览 • 2025-09-21 14:50
之前有博客介绍过通过 Reindex 的方法将 Elasticsearch 的数据迁移到 Easysearch 集群,今天再介绍一个方法,通过 极限网关(INFINI Gateway) 来进行数据迁移。
测试环境
| 软件 | 版本 |
|---|---|
| Easysearch | 1.12.0 |
| Elasticsearch | 7.17.29 |
| INFINI Gateway | 1.29.2 |
迁移步骤
- 选定要迁移的索引
- 在目标集群建立索引的 mapping 和 setting
- 准备 INFINI Gateway 迁移配置
- 运行 INFINI Gateway 进行数据迁移
迁移实战
- 选定要迁移的索引
在 Elasticsearch 集群中选择目标索引:infinilabs 和 test1,没错,我们一次可以迁移多个。

- 在 Easysearch 集群使用源索引的 setting 和 mapping 建立目标索引。(略)
- INFINI Gateway 迁移配置准备
去 github 下载配置,修改下面的连接集群的部分
1 env:
2 LR_GATEWAY_API_HOST: 127.0.0.1:2900
3 SRC_ELASTICSEARCH_ENDPOINT: http://127.0.0.1:9200
4 DST_ELASTICSEARCH_ENDPOINT: http://127.0.0.1:9201
5 path.data: data
6 path.logs: log
7 progress_bar.enabled: true
8 configs.auto_reload: true
9
10 api:
11 enabled: true
12 network:
13 binding: $[[env.LR_GATEWAY_API_HOST]]
14
15 elasticsearch:
16 - name: source
17 enabled: true
18 endpoint: $[[env.SRC_ELASTICSEARCH_ENDPOINT]]
19 basic_auth:
20 username: elastic
21 password: goodgoodstudy
22
23 - name: target
24 enabled: true
25 endpoint: $[[env.DST_ELASTICSEARCH_ENDPOINT]]
26 basic_auth:
27 username: admin
28 password: 14da41c79ad2d744b90c
pipeline 部分修改要迁移的索引名称,我们迁移 infinilabs 和 test1 两个索引。
31 pipeline:
32 - name: source_scroll
33 auto_start: true
34 keep_running: false
35 processor:
36 - es_scroll:
37 slice_size: 1
38 batch_size: 5000
39 indices: "infinilabs,test1"
40 elasticsearch: source
41 output_queue: source_index_dump
42 partition_size: 1
43 scroll_time: "5m"
- 迁移数据
./gateway-mac-arm64
#如果你保存的配置文件名称不叫 gateway.yml,则需要加参数 -config 文件名

数据导入完成后,网关 ctrl+c 退出。

至此,数据迁移就完成了。下一篇我们来介绍 INFINI Gateway 的数据比对功能。
有任何问题,欢迎加我微信沟通。

关于极限网关(INFINI Gateway)

INFINI Gateway 是一个开源的面向搜索场景的高性能数据网关,所有请求都经过网关处理后再转发到后端的搜索业务集群。基于 INFINI Gateway,可以实现索引级别的限速限流、常见查询的缓存加速、查询请求的审计、查询结果的动态修改等等。
官网文档:https://docs.infinilabs.com/gateway
开源地址:https://github.com/infinilabs/gateway
Easysearch 国产替代 Elasticsearch:8 大核心问题解读
Easysearch • liaosy 发表了文章 • 0 个评论 • 11270 次浏览 • 2025-09-18 09:43
近年来,随着数据安全与自主可控需求的不断提升,越来越多的企业开始关注国产化的搜索与日志分析解决方案。作为极限科技推出的国产 Elasticsearch 替代产品,Easysearch 凭借其对搜索场景的深入优化、轻量级架构设计以及对 ES 生态的高度兼容,成为众多企业替代 Elasticsearch 的新选择。

我们在近期与用户的交流中,整理出了大家最关心的八大问题,并将它们浓缩为一篇技术解读,希望帮助你快速了解 Easysearch 的优势与定位。
用户最关心的八大问题
- Easysearch 对数据量的支撑能力如何,能应对 PB 级数据存储吗?
答:完全可以。Easysearch 支持水平扩展,通过增加节点即可线性提升存储与计算能力。在实际应用中,已成功支撑 PB 级日志与检索数据。同时,其存储压缩率相比 Elasticsearch 7.10.2 平均高出 2.5~3 倍,显著节省硬件成本。
- 在高并发写入场景下,Easysearch 和 ES 的性能差异有多大?
答:在相同硬件配置下,使用 Nginx 日志进行 bulk 写入压测,Easysearch 在多种分片配置下的写入性能相比 Elasticsearch 7.10.2 提升 40%-70%,更适合高并发写入场景。
- 是否支持中文分词?需要额外插件吗?
答:中文分词一直是 Elasticsearch 用户的「必装插件」。而在 Easysearch 中,中文分词是开箱即用的,同时支持 ik、pinyin 等主流分词器,还能自定义词典,方便电商、内容平台等场景。
- 从 ES 迁移到 Easysearch 是否复杂?会影响业务吗?
答:迁移往往是国产替代的最大顾虑。为此,Easysearch 提供了 极限网关 工具,支持全量同步和实时增量同步。迁移过程中业务可继续读写,只需短暂切换连接地址,几乎无感知。
- 监控与运维工具是否完善?是否支持 Kibana?
答:Easysearch 提供完整的监控与运维体系。从 Easysearch 1.15.x 版本起自带 Web UI 管理控制台(类似简化版 Kibana),支持索引管理、查询调试、权限控制等功能。同时还提供 INFINI Console 实现多集群管理与深度监控等。也可以通过配置让 Kibana 连接 Easysearch(部分高级功能可能受限)。
- 小型团队技术能力有限,用 Easysearch 运维难度高吗?
答:Easysearch 的一大设计理念就是降低运维门槛。Easysearch 提供一键部署脚本,减少手动配置参数,支持自动分片均衡与故障节点恢复,无需专职运维人员也能稳定运行,非常适合技术资源有限的团队。
- Easysearch 是否支持数据备份与恢复?操作复杂吗?
答:支持快照(Snapshot),可备份到本地磁盘或对象存储(S3、OSS 等)。恢复时仅需执行快照恢复命令,满足企业级数据安全需求。
- 对比 ES,Easysearch 在使用体验上最大的不同是什么?
答:Easysearch 保持与 Elasticsearch 类似的接口与查询 DSL,用户几乎无学习成本即可上手。同时,它针对国产化环境和搜索场景做了优化,运维更轻量,成本更可控。
结语:Easysearch,国产化搜索的新选择
作为一款国产自主可控的搜索与日志分析引擎,Easysearch 不仅继承了 Elasticsearch 的核心能力,更在性能、易用性、资源效率和中文支持等方面进行了深度优化。对于希望实现国产化替代、降低运维成本、提升系统性能的企业来说,Easysearch 是一个值得认真考虑的新选择。

如果你正在评估 Elasticsearch 的替代方案,不妨从 Easysearch 开始,体验更轻量、更高效的搜索新架构。
如需了解更多技术细节与使用案例,欢迎访问官方文档与社区资源:
- Easysearch 官网文档
- Elasticsearch VS Easysearch 性能测试
- 使用 Easysearch,日志存储少一半
- Kibana OSS 7.10.2 连接 Easysearch
- 自建 ES 集群通过极限网关无缝迁移到云上
- INFINI Console 一站式的数据搜索分析与管理平台

极限科技(INFINI Labs)招聘搜索运维工程师(Elasticsearch/Easysearch)
求职招聘 • INFINI Labs 小助手 发表了文章 • 0 个评论 • 6839 次浏览 • 2025-08-12 15:31

极限科技诚招全职搜索运维工程师(Elasticsearch/Easysearch)!
欢迎搜索技术热爱者加入我们,共同打造高效、智能的搜索解决方案!
在招岗位介绍
岗位名称
搜索运维工程师(Elasticsearch/Easysearch)
Base:北京/西安
薪资待遇:10-15K,五险一金,双休等
岗位职责
- 负责客户现场的 Elasticsearch/Easysearch/OpenSearch 搜索引擎集群的日常维护、监控和优化,确保集群的高可用性和性能稳定;
- 协助客户进行搜索引擎集群的部署、配置及版本升级;
- 排查和解决 Elasticsearch/Easysearch/OpenSearch 集群中的各种技术问题,及时响应并处理集群异常;
- 根据业务需求设计和实施搜索索引的调优、数据迁移和扩展方案;
- 负责与客户沟通,提供技术支持及相关培训,确保客户需求得到有效满足;
- 制定并实施搜索引擎的备份、恢复和安全策略,保障数据安全;
- 与内部研发团队和外部客户进行协作,推动集群性能改进和功能优化。
岗位要求
- 全日制本科及以上学历,2 年以上运维工作经验;
- 拥有 Elasticsearch/Easysearch/OpenSearch 使用经验,熟悉搜索引擎的原理、架构和相关生态工具(如 Logstash、Kibana 等);
- 熟悉 Linux 操作系统的使用及常见性能调优方法;
- 熟练掌握 Shell 或 Python 等至少一种脚本语言,能够编写自动化运维脚本;
- 具有优秀的问题分析与解决能力,能够快速应对突发情况;
- 具备良好的沟通能力和团队合作精神,能够接受客户驻场工作;
- 提供 五险一金,享有带薪年假及法定节假日。
加分项
- 计算机科学、信息技术或相关专业;
- 具备丰富的大规模分布式系统运维经验;
- 熟悉 Elasticsearch/Easysearch/OpenSearch 分片、路由、查询优化等高级功能;
- 拥有 Elastic Certified Engineer 认证;
- 具备大规模搜索引擎集群设计、扩展和调优经验;
- 熟悉其他搜索引擎技术(如 Solr、Lucene)者优先;
- 熟悉大数据处理相关技术(比如: Kafka 、Flink 等)者优先。
简历投递
- 邮件:hello@infini.ltd(邮件标题请备注姓名+求职岗位)
- 微信:INFINI-Labs (加微请备注求职岗位)

关于极限科技(INFINI Labs)

极限科技,全称极限数据(北京)科技有限公司,是一家专注于实时搜索与数据分析的软件公司。旗下品牌极限实验室(INFINI Labs)致力于打造极致易用的数据探索与分析体验。
极限科技是一支年轻的团队,采用天然分布式的方式来进行远程协作,员工分布在全球各地,希望通过努力成为中国乃至全球企业大数据实时搜索分析产品的首选,为中国技术品牌输出添砖加瓦。
我们在做什么
极限科技(INFINI Labs)正在致力于以下几个核心方向:
1、开发近实时搜索引擎 INFINI Easysearch
INFINI Easysearch 是一个分布式的搜索型数据库,实现非结构化数据检索、全文检索、向量检索、地理位置信息查询、组合索引查询、多语种支持、聚合分析等。Easysearch 可以替代 Elasticsearch,同时添加和完善多项企业级功能。Easysearch 助您拥有简洁、高效、易用的搜索体验。详情参见:https://infinilabs.cn
2、打造下一代实时搜索引擎 INFINI Pizza
INFINI Pizza 是一个分布式混合搜索数据库系统。我们的使命是充分利用现代硬件和人工智能的潜力,为企业提供量身定制的实时智能搜索体验。我们致力于满足具有挑战性的环境中高并发和高吞吐量的需求,同时提供无缝高效的搜索功能。详情参见:https://pizza.rs
3、为现代团队打造的统一搜索与 AI 智能助手 Coco AI
Coco AI 是一款完全开源的统一搜索与 AI 助手平台,它通过统一搜索入口,连接企业内外部的异构数据源,融合大模型能力,帮助团队高效访问知识,智能决策协作。详情参见:https://coco.rs
4、积极参与全球开源生态建设
通过开源 Coco AI、Console、Gateway、Agent、Loadgen 等搜索领域产品和社区贡献,推动全球开源技术的发展,提升中国在全球开源领域的影响力。INFINI Labs Github 主页:https://github.com/infinilabs
5、提供专业服务
为客户提供包括搜索技术支持、迁移服务、定制解决方案和培训在内的全方位服务。
6、提供国产化搜索解决方案
针对中国市场的特殊需求,提供符合国产化标准的搜索产品和解决方案,帮助客户解决使用 Elasticsearch 时遇到的挑战。
极限科技(INFINI Labs)通过这些努力,旨在成为全球领先的实时搜索和数据分析解决方案提供商。

