在数据爆炸的今天,企业对于搜索引擎的期待早已超越了简单的“能查”,而是转向了“快写”、“秒查”以及“低成本存储”。作为一款基于 Apache Lucene 开发的分布式近实时搜索与分析引擎,INFINI Easysearch 在继承 Elasticsearch 优秀基因的同时,针对中国企业级场景进行了深度的内核级优化。
本文将深入剖析 Easysearch 在写入性能与查询效率两大核心维度的“黑科技”,揭示其如何帮助企业在海量数据场景下实现降本增效。
一、 架构基石:从内核开始的进化 #
Easysearch 并非简单的换皮,而是基于 Elasticsearch 7.10.2 这一里程碑版本进行深度二次开发。选择 7.10.2 作为基线不仅是因为其稳定性,更是因为其在协议变更前的开放性。Easysearch 在此基础上,重构了存储压缩逻辑、优化了查询执行计划,并引入了针对国产硬件和操作系统的底层适配,为高性能打下了坚实基础。
二、 写入优化:打破 I/O 瓶颈 #
在海量日志、监控指标或业务数据写入场景中,磁盘 I/O 和网络带宽往往是第一瓶颈。Easysearch 通过以下“黑科技”显著提升了写入吞吐量。
1. ZSTD + Source Reuse:多重压缩黑科技,存储直降 50%-80% #
虽然 Elasticsearch 8.x 也引入了 Zstandard (ZSTD) 压缩算法,但 Easysearch 通过独创的 Source Reuse (**源数据**复用) 技术与自定义 ZSTD 编码器的深度结合,实现了对传统存储方案的代际超越。
- 原理:
- Source Reuse (**源数据**复用):这是 Easysearch 的核心差异化技术。系统能自动识别 _source 文档中与索引字段(如 Keyword、数值等)重复的数据。开启后,Easysearch 在存储原始文档时会剔除这些冗余字段,在读取时通过索引数据动态还原,从而实现物理层面的本质“瘦身”。
- ZSTD 专项调优:在剔除冗余的基础上,Easysearch 采用大块(Block-based)压缩机制调用 ZSTD 算法,对剩余内容进行二次高压缩,进一步压榨存储空间。
- 收益:
- 存储成本“断崖式”降低:在双重加持下,Easysearch 的存储占用相比传统方案可降低 50%-80%。这意味着在同样的磁盘空间下,您可以存储 2 到 5 倍的数据量。
- 写入吞吐显著提升:由于需要写入磁盘的物理数据量大幅减少,磁盘 I/O 压力降低,在相同的硬件条件下,写入吞吐量直接获得质的飞跃。
- 查询性能二次加速:极小化的 _source 显著提升了 Page Cache 的命中率。fetch 阶段(取回文档原始内容)的随机磁盘读取大大减少,海量数据检索时的响应延迟明显缩短。
配置示例: 开启 ZSTD 压缩和Source Reuse只需在索引设置中指定:
PUT /my_index/_settings
{
"index": {
"codec": "zstd",
"source_reuse": true
}
}
2. 计算存储分离与可搜索快照 #
在日志归档等场景下,Easysearch 突破了“本地磁盘必须存放所有数据”的限制。
- 痛点:为了满足长期合规需求,企业需要保留数月甚至数年的日志,但这会导致本地存储成本飙升,且扩容困难。
- 黑科技:Easysearch 原生支持 可搜索快照 功能。它允许将数据直接备份至廉价的对象存储(如 S3、MinIO),并在需要时直接挂载为可读索引,无需将数据全部回传到本地磁盘。
- 原理:通过智能 I/O 调度,按需从对象存储拉取数据块,对上层应用完全透明。
- 收益:某头部车企案例显示,通过开启冷热分离和快照搜索,成功释放了 50% 的本地存储空间,并节省了大量主机资源。
三、 查询优化:从“能用”到“秒级响应” #
查询性能直接决定了用户体验。Easysearch 在聚合分析、精准检索等方面引入了多项企业级增强特性。
精确去重 #
在数据分析中,count(distinct) 往往伴随较高的内存开销。Elasticsearch 原生的 Cardinality 聚合基于 HyperLogLog++ 算法,速度快但属于近似统计,在需要强一致性的财务、审计场景中通常需要更谨慎的策略与配置。
- 黑科技:Easysearch 基于 HyperLogLog++算法,支持精度与内存的可控权衡,并会根据字段类型和内存开销自动选择更合适的统计路径(如 ordinals 或 direct),在高并发与大规模数据量下保持稳定性能。
- 性能:在海量文档场景中,Easysearch 能够以可控的资源开销提供高效的去重统计;同时通过 SQL 语法支持
COUNT(DISTINCT)与DISTINCT查询,便于在报表统计与业务分析中实现高性能、可管理的去重能力。
DSL 示例: 使用 Easysearch 增强的聚合语法进行精确去重:
GET /sales/_search
{
"size": 0,
"aggs": {
"unique_users": {
"cardinality": {
"field": "user_id",
"precision_threshold": 40000
}
}
}
}
2. 跨索引 JOIN #
在关系型数据库中,JOIN 是基本操作,但在搜索引擎中通常是禁忌。Easysearch 优化了跨索引 JOIN 的实现,使其在特定场景下变得可用且高效。
- 场景:订单索引与用户索引分离,但在展示订单列表时需要按 user_id = id 关联用户名等字段。
- 黑科技:跨索引 JOIN 由Easysearch的SQL查询引擎提供,采用分块 Hash Join(BlockHashJoin)执行策略:先按 blockSize 从一侧分批拉取结果并用关联键构建内存哈希表(Build),再扫描另一侧结果逐行查表匹配并拼接输出(Probe)。这种“分块建表 + 分块探测”的方式把内存占用控制在可预期范围内,并配合把当前块的关联键下推为“ terms 过滤”来减少另一侧的扫描量,从而提升关联查询效率。
- 案例:某销售线索管理 SaaS 客户,在查询中需要处理跨索引的复杂多对多关联。因涉及高基数关联条件,执行时极易产生类似“笛卡尔积”的计算膨胀,导致查询耗时高且频繁触发资源瓶颈。迁移后采用以下两步优化:
- 算法升级实现高效关联:在线查询层引入 Hash Join / BlockHashJoin 实现高效的等值关联,取代了低效的嵌套循环匹配(Nested Loop)。通过将算法复杂度从 O(M×N) 降低至接近 O(M+N),有效遏制了高负载下的资源损耗;
- 预聚合减少实时计算量:报表与分析类需求采用 Rollup 预聚合技术,实现“以空间换时间”,化实时计算为预处理,显著降低了海量数据聚合时的计算强度。
最终:成功将查询耗时从“几十秒级”降低至“秒级”。
3. 中文分词与内存优化 #
针对中文场景,Easysearch 对 IK 分词器进行了深度重构。
- 黑科技:优化了词典结构,支持基于上下文的词库加载。
- 收益:在支持超大规模词典的同时,大幅降低了内存占用。这使得单节点可以加载更多的分词数据或处理更大的并发请求,防止因 OOM(内存溢出)导致的节点宕机。
四、 总结 #
Easysearch 的性能飞跃并非偶然,而是建立在对分布式搜索原理的深刻理解以及对国产化企业场景的精准把握之上。
从 ZSTD 压缩带来的存储与 I/O 双赢,到 可搜索快照实现计算存储分离,再到 精确去重解决业务痛点,每一项技术的引入都旨在解决实际生产环境中的顽疾。对于追求高性能、高性价比以及自主可控的企业而言,Easysearch 不仅仅是一个 Elasticsearch 的替代品,更是释放数据价值的加速引擎。





