Easysearch 版 analysis-ik 相比开源 IK 有一个告急的增强:支持多辞书。简朴说就是差异字段可以挂差异词库,可以叠加默认辞书,也可以只用自界说辞书。这是开源单辞书 IK 做不到的。
功能实现初期,重要精神放在把本领跑通上。但在厥后的一次写入压测中,我们发现 Easysearch 的写入吞吐和 Elasticsearch 有显着差距,终极定位到题目出在多辞书的实现方式上——字段终极该用哪套辞书,原来应该在分词前就算好,结果代码里把这个选择丢进了分词的热路径,每次分词都要反复切辞书、重复扫同一段文本。
这篇文章记载的就是我们怎么一步步把性能拉返来、终极反超基线的过程。
题目怎么冒出来的
4 月 20 号,我们跑了一轮体系级写入压测。数据、mapping、settings、并发和 bulk 参数都一样,Elasticsearch 8.19.5 和 Easysearch 2.1.2 的写入吞吐差距大得有点不对劲:
时间场景ElasticsearchEasysearch阐明2026-04-20 第 2 次有用重跑29900 docs / bulk=250 / concurrency=3 端到端写入压测129.44 docs/s31.21 docs/s这是整条写入链路的 docs/s,不是单独分词吞吐2026-04-20 诊断样本5000 docs / bulk=250 / concurrency=3156.25 docs/s30.67 docs/sEasysearch 的累计索引耗时约为 Elasticsearch 的 8.0x
当时服务器上跑的就是早期多辞书版本。背面修性能,追的就是这个版本和开源单辞书 IK 基线之间的差距。
这一步还不能直接确定题目就在分词器。但差距摆在这儿了,得继续往下排。我们先清除了几个常见干扰因素:
- refresh_interval
- 动态同义词 HTTP 服务
- mapping / settings 不划一
- 网络层和 bulk 客户端自己
采样结果很快把范围收窄了。Elasticsearch 那里热门比力分散,Easysearch 这边呢,分词链路里出现了非常会合的开销——分词过程中反复做辞书选择和字典查找。
瓶颈不在 Lucene 写入链路自己,就在 analysis-ik 的多辞书实现上。
根因分析
第一类题目出在实现模子上。多辞书想表达的是”这个字段终极用哪套辞书”,这件事完全可以在分词前算好。但早期代码里,硬是把它酿成了运行时的事:
- “字段用哪个辞书”酿成了”运行时多轮扫描”——同一段文本对着多套辞书各来一遍。
- 全局字典切换的动作放进了每字符的热路径。
- 结果就是同一段文本的扫描和查找本钱翻了好几倍。
以是题目不是多辞书自然慢,是实现把本该提前算好的东西塞进了热路径反复做。
第二类题目是后续优化过程中留下的额外开销。背面加的跨界限、停用词、长文本等测试自己不是性能题目的泉源,它们的作用是把精确性界限补齐,确保每次优化不会改变分词结果。
末了通过性能分析确认,残留开销重要来自两处:缓存掷中前还在做不须要的数据复制;诊断逻辑在生产热路径上产生了额外开销。修完之后这两处热门都从火焰图上消散了,阐明性能回退确实来自真实的代码路径本钱,不是测试抖动。
修复过程
整个修复分四个阶段。
第一阶段:把多辞书从”运行时分发”收敛为”终极有用辞书视图”
多辞书本领生存,但不再让分词器在热路径里反复切辞书、重复扫文本。改成在分词前就把字段终极收效的辞书算好,分词过程只面临一个已经收敛好的辞书视图。
说白了就是把模子拉回精确方向——多辞书管表达本领,热路径只管分词。
第二阶段:渐渐打掉热路径上的常数开销
留下来的每一项优化,都颠末正式性能测试和采样分析验证。原则就一条:不改分词语义,只淘汰热路径上反复发生的查找、分配和判定。
第三阶段:补齐精确性护栏
精确性测试必须先到位,否则吞吐提拔没故意义——万一分词结果变了,跑得再快也白搭。
这一轮重点覆盖了这些轻易出题目的场景:
- 真跨界限场景
- 数字和量词归并,如 1号
- 自界说辞书里的含符号词
- 增补平面字符跨界限稳固性
- 停用词过滤后的偏移量
- 长文本样本的稳固性
- 正式性能测试数据集的分词结果对齐
背面全部的吞吐数字,条件都是分词结果划一,克制把分词举动的厘革误当成性能提拔。
第四阶段:清算末了的残留开销
到 4 月 28 号,末了一轮修复会合处置处罚两个地方:
- 辞书视图掷中缓存时直接返回,不再多做一次数据复制
- 诊断逻辑默认关掉,不让线上哀求为调试本领买单
这两处修完,Easysearch 版 IK 就不但是规复到单辞书版本附近了,在正式测试里已经显着领先。
用数据看规复过程
为了不把体系级写入压测和分词器性能测试混在一起,下面只看几个关键节点。2026-04-20 的 docs/s 是体系级写入吞吐,背面的 tok/s 是单独的分词器吞吐。
这里说的”开源 IK 基线”就是开源 IK 的单辞书实现对照版本。全部正式吞吐结论都创建在同一数据集、同一测试方法、分词结果划一的条件上。
时间口径关键结果阐明2026-04-23 17:02 CST初期本地复现服务器多辞书版本 61.39 万 tok/s,单辞书版本 114.48 万 tok/s单辞书版本快 86.49%,性能差距被明白复现2026-04-24 09:51:12~09:55:15 CST第一次正式追平smart 相对开源单辞书基线 +7.26%从显着落伍追到略微领先2026-04-25 04:14~04:16 CST双模式阶段复核smart +16.88%,max_word +20.09%领先上风开始扩大2026-04-28 12:30:56 CST最新正式复核smart +30.96%,max_word +21.31%当前最新结果整个过程就是:
- 先袒暴露显着的性能退化
- 渐渐缩小差距
- 追平,然后开始领先
- 终极在分词结果完全划一的条件下,正式反超
最早的本地复现数据很关键:服务器当时跑的多辞书版本只有 613896.67 tok/s,单辞书版本 1144843.77 tok/s。背面全部修复就是冲着这个差距去的。
三张图分别对应题目袒露、分词复现和修复结果:第一张展示服务器 bulk 写入吞吐的体系级差距;第二张展示多辞书版本和单辞书版本的本地分词差距;第三张展示分词结果对齐后,Easysearch 版 IK 怎么一步步追上来,终极实现 25%~30% 的分词性能提拔。
为什么说 Easysearch 版 IK 现在更好
这次修复的代价不但是扫除了几个热门,更告急的是把多辞书本领、分词精确性和性能测试体系一起补齐了。
1. 功能更强,性能代价可控
开源单辞书 IK 模子简朴,但表达本领也弱。Easysearch 的多辞书本领要办理的是字段级词库隔离、自界说辞书叠加这些现实需求。
关键题目是:能不能把这些本领的性能开销压到富足低。修复后的结果证实,可以。
2. 精确性护栏更完备
这轮补上的测试不但是几个短样例,覆盖了更轻易翻车的界限条件:
- 真跨界限场景
- 长文本稳固性
- 自界说辞书和符号词
- 数字量词归并
- 停用词过滤后的偏移量
这意味着以后再做性能优化,必须同时包管分词结果稳固。想靠改分词举动换吞吐,测试会先拦住。
3. 性能测试体系更严格
这轮之后,Easysearch 对 analysis-ik 的正式性能结论同一按一套尺度出:
- 同一数据集
- 同一测试方法
- smart 和 max_word 双模式
- 分词结果划一
- 有性能分析结果支持
这套体系能克制两个常见坑:只看单轮吞吐颠簸就下结论,大概分词结果已经变了还在比性能。
小结
多辞书本领在实现初期,重要精神放在功能补齐上——先把字段级词库隔离、自界说辞书叠加这些本领跑通,性能优化是背面分阶段来的事,没办法一挥而就。
这轮优化下来,核心思绪实在就一条:把辞书选择从分词热路径里挪出去,提前收敛好,让分词过程只面临终极的辞书视图。再共同热门清算和精确性护栏,增强功能和更高性能完全可以兼得。
停止 2026 年 4 月 28 日,在本地 Mac 条记本上的多轮 benchmark 中,Easysearch 版 IK 在 smart 模式约莫领先开源单辞书 IK 基线 25%~30%,max_word 模式约莫领先 20% 左右,分词结果完全划一。详细数字每次跑会有颠簸,但趋势是稳固的。
这也是 Easysearch 版 IK 相对开源版更有代价的地方:不是多了几个设置项,而是在多辞书本领、分词精确性和分词性能三个方面都给出了可验证的结果。
关于 Easysearch
INFINI Easysearch 是一个分布式的搜索型数据库,实现非布局化数据检索、全文检索、向量检索、地理位置信息查询、组合索引查询、多语种支持、聚合分析等。Easysearch 可以完善更换 Elasticsearch,同时添加和美满多项企业级功能。Easysearch 助您拥有轻便、高效、易用的搜索体验。
作者:张磊,极限科技(INFINI Labs)搜索引擎研发负责人,对 Elasticsearch 和 Lucene 源码比力熟悉,现在重要负责公司的 Easysearch 产物的研发以及客户服务工作。
免责声明:如果侵犯了您的权益,请联系站长及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金. |