从 ik-analyzer 到自研:打造电商级分词引擎的实战之路

68 阅读10分钟

从 ik-analyzer 到自研:打造电商级分词引擎的实战之路

十余年搜索引擎从业经验,3项发明专利,从 ik-analyzer 的深度用户到自研分词引擎 Surfing-Segment 的开发者,这是一段技术人的进化之路。

一、缘起:一次失败的搜索

2015年的某个深夜,我盯着监控大盘上的搜索转化率曲线,眉头紧锁。

用户搜索:"VIKAGU VG263B 螺纹锁"
系统返回:0 条结果

但我明明知道,仓库里躺着几百件这个型号的产品。问题出在哪?

打开日志一看,分词结果是这样的:

VIKAGU | VG | 263 | B | 螺纹 | 锁

型号被生硬地切碎了。而商品标题里写的是 "微卡固螺丝胶VG263B",品牌用的中文名"微卡固",分词器根本没认出 VIKAGU 和微卡固是同一个品牌。

这不是个例。 在工业品电商领域,这样的问题每天都在发生:

  • SKF 6205-2RS 轴承 → 被切成 SKF | 6205 | 2 | RS
  • 3M™ VHB™ 5952 → 被切成 3 | M | VHB | 5952
  • ABB ACS880-01-430A-3 → 切分后完全无法匹配

当时我们用的是 ik-analyzer,一款在中文分词领域已经称得上标杆的工具。它快速、准确、消歧能力强,唯一的问题是——它是为通用文本设计的,不是为工业品电商设计的。

这次失败的搜索,成为了 Surfing-Segment 项目的起点。

二、ik-analyzer:巨人的肩膀

在决定自研之前,我先花了大量时间深入研究 ik-analyzer。

2.1 ik-analyzer 的优雅设计

林良益先生开发的 ik-analyzer 采用了经典的 Trie 树结构,配合高效的分词策略:

用户词典 → Trie树索引 → 正向最大匹配 → 歧义处理 → 分词结果

它的三大优势让我印象深刻:

1. 性能出色
Trie 树的查找复杂度是 O(m),m 是词的长度。对于 "中华人民共和国" 这样的长词,只需要 7 次节点遍历就能完成匹配。

2. 准确度高
正向最大匹配策略 + 歧义处理机制,让它在通用文本上的准确率能达到 95% 以上。

3. 可扩展性
支持自定义词典,用户可以根据业务需求添加专有名词。

2.2 遇到的瓶颈

但在电商场景下,特别是工业品/汽配/3C 数码等品类,ik-analyzer 遇到了三个核心问题:

问题 1:型号无法动态识别

工业品的型号千变万化,不可能全部收录进词典:

  • 轴承型号:6205、6205-2RS、6205-2RS1、6205-ZZ...
  • 每个品牌有自己的编码规则
  • 新型号层出不穷

ik-analyzer 的方案:全部加入词典
现实情况:词典会无限膨胀,维护成本爆炸

问题 2:品牌多语言混用

同一个品牌,用户的搜索习惯五花八门:

  • 中文:微卡固、威卡固
  • 英文:VIKAGU
  • 拼音:weikagu

ik-analyzer 的方案:通过同义词词典关联
现实情况:需要人工维护 N×M 个映射关系,且无法处理未收录的变体

问题 3:专业术语的多段切分

对于 "M20强力胶水" 这样的文本:

  • M20 是规格型号,应该保持完整
  • 但同时也要能匹配 "M20"、"强力胶"、"胶水" 的单独搜索

ik-analyzer 的方案:只能选择粗粒度或细粒度切分其中一种
现实情况:需要同时支持多粒度切分,才能覆盖不同的搜索意图

三、自研的决心

3.1 为什么不改 ik-analyzer?

这是很多人会问的第一个问题。

我确实尝试过扩展 ik-analyzer,但很快发现:

  1. 架构限制 - Trie 树的设计天然适合静态词典,要加入动态解析逻辑会破坏原有的优雅性
  2. 性能权衡 - 在 ik 的基础上叠加复杂逻辑,会影响它原本的高性能
  3. 维护成本 - fork 一个成熟项目后,后续升级和维护会变得困难

3.2 技术目标的确立

基于在搜索引擎领域的积累(3项发明专利都与此相关),我为 Surfing-Segment 设定了四个核心目标:

目标 1:继承 ik-analyzer 的优点

  • 保留 Trie 树的高效结构
  • 保持词典匹配的准确性
  • 兼容自定义词典机制

目标 2:实现型号动态解析

  • 不依赖词典,能识别未知型号
  • 支持常见的型号模式(数字+字母组合、连字符分隔等)
  • 可配置解析规则

目标 3:增强品牌同义词处理

  • 中英文品牌自动关联
  • 拼音变体支持
  • 标准化输出(统一到官方名称)

目标 4:支持多段切分

  • 单次分词产生多粒度结果
  • 为每个词添加语义标签(品牌/型号/属性/商品)
  • 便于后续的搜索召回和排序

四、Surfing-Segment 的诞生

4.1 核心设计理念

Surfing-Segment 的设计遵循一个核心理念:

词典匹配 + 动态解析 = 精确分词

传统分词器只做词典匹配:

文本 → 词典查询 → 分词结果

Surfing-Segment 的流程是:

文本 → 词典匹配 → 型号动态解析 → 同义词标准化 → 多粒度切分 → 语义标注 → 分词结果

4.2 实战案例:一次完整的分词过程

让我们通过一个真实案例,看看 Surfing-Segment 是如何工作的。

输入文本:

微卡固/VIKAGU 螺丝胶VG263B 威卡固螺纹锁高强度耐高温密封单组分M20强力胶水 50ml

Step 1: 词典匹配

微卡固 → [品牌词典命中]
VIKAGU → [品牌词典命中]  
螺丝胶 → [商品词典命中]
螺纹锁 → [商品词典命中]
高强度、耐高温、密封、单组分 → [属性词典命中]
强力胶水 → [商品词典命中]
50ml → [量词模式匹配]

Step 2: 型号动态解析

VG263B → 模式:[字母]{2}[数字]{3}[字母]{1} → 识别为型号
M20 → 模式:M[数字]+ → 识别为规格型号

Step 3: 同义词标准化

微卡固 → 标准词:威卡固
VIKAGU → 标准词:威卡固

Step 4: 语义标注

微卡固 [brand] → 威卡固
VIKAGU [brand, sn] → 威卡固  
螺丝胶 [goods]
VG263B [sn]
威卡固 [brand] → 威卡固
螺纹锁 [goods]
高强度 [attribute]
耐高温 [attribute]
密封 [attribute]
单组分 [attribute]
M20 [sn]
强力胶水 [goods]
50ml [quantifier]

最终输出表格:

分词内容标签位置范围标准词
微卡固brand0-3威卡固
VIKAGUsn, brand5-10威卡固
螺丝胶goods12-15
VG263Bsn17-22
威卡固brand24-27威卡固
螺纹锁goods28-31
高强度attribute32-35
耐高温attribute36-39
密封attribute40-42
单组分attribute43-46
M20sn47-49
强力胶水goods50-54
50mlquantifier56-60

4.3 技术突破点

相比 ik-analyzer,Surfing-Segment 实现了以下突破:

1. 型号动态识别

  • 不需要把所有型号加入词典
  • VG263B、M20 这样的型号自动识别
  • 识别准确率 > 92%(基于 10万+ 商品测试)

2. 品牌多语言统一

  • 微卡固、VIKAGU 自动映射到标准词 "威卡固"
  • 搜索任一变体都能召回完整结果
  • 品牌召回率提升 40%+

3. 多粒度智能切分

  • "强力胶水" 既保留整体,也切分为 "强力胶"、"胶水"
  • 满足不同精确度的搜索需求
  • 搜索覆盖率提升 25%+

4. 语义标签赋能

  • 每个词都有明确的语义类型
  • 为后续的相关性排序提供依据
  • 支持 "品牌+型号" 等组合查询优化

五、集成与验证

5.1 Elasticsearch 插件

为了降低使用门槛,我为 Surfing-Segment 开发了 Elasticsearch 插件:

# 安装插件
./bin/elasticsearch-plugin install file:///path/to/surfing-segment-plugin.zip

# 配置分析器
PUT /products
{
  "settings": {
    "analysis": {
      "analyzer": {
        "surfing": {
          "type": "surfing_segment"
        }
      }
    }
  }
}

集成后,可以像使用 ik 分词器一样简单:

{
  "mappings": {
    "properties": {
      "title": {
        "type": "text",
        "analyzer": "surfing",
        "fields": {
          "keyword": {
            "type": "keyword"
          }
        }
      }
    }
  }
}

5.2 企业级验证

Surfing-Segment 已经在多家企业的生产环境中得到验证:

案例 1:工业品电商平台

  • 商品数量:500万+ SKU
  • 日搜索量:200万+ 次
  • 核心指标提升:
    • 搜索有结果率:72% → 89%(提升 17 个百分点)
    • 首位点击率:23% → 34%(提升 48%)
    • 搜索转化率:2.1% → 3.2%(提升 52%)

案例 2:汽配垂直平台

  • 核心痛点:OE号、品牌件号混杂
  • 解决方案:自定义型号解析规则
  • 效果:型号匹配准确率 94%+

案例 3:3C 数码商城

  • 核心痛点:型号规格多样、品牌别名复杂
  • 解决方案:扩展品牌同义词库 + 规格动态识别
  • 效果:长尾搜索有结果率提升 35%

5.3 性能表现

在性能方面,Surfing-Segment 与 ik-analyzer 处于同一量级:

指标ik-analyzerSurfing-Segment
单线程分词速度~500MB/s~420MB/s
内存占用50MB80MB
启动时间1.2s1.8s

性能略有下降(约 15%),但换来的是:

  • 型号识别能力:0% → 92%+
  • 品牌召回提升:40%+
  • 搜索转化率提升:50%+

这个权衡是值得的。

六、技术沉淀与开放

6.1 三项发明专利

在 Surfing-Segment 的研发过程中,积累了多项技术创新,其中 3 项已获得发明专利授权(具体专利号因商业原因未公开):

  1. 基于模式匹配的型号动态识别方法
  2. 多语言品牌词的自动同义词发现算法
  3. 面向搜索引擎的多粒度分词优化技术

这些专利不仅是技术能力的证明,更是在真实业务场景中反复打磨的结果。

6.2 开源回馈社区

虽然 Surfing-Segment 诞生于商业需求,但我始终认为技术的价值在于分享。

项目已在 Gitee 开源:

https://gitee.com/sh_wangwanbao/surfing-segment

开源的内容包括:

  • 核心分词引擎代码
  • Elasticsearch 插件
  • 完整的使用文档
  • 示例词典和配置

希望它能像当年 ik-analyzer 启发我一样,为更多开发者提供帮助。

6.3 持续演进

技术从来不是一成不变的。Surfing-Segment 还在持续演进:

近期规划:

  • 支持更多型号模式(正则表达式自定义)
  • 引入机器学习模型辅助语义标注
  • 优化大规模词典的加载性能

长期愿景:

  • 成为垂直电商领域的分词标准
  • 构建开放的词典生态
  • 探索跨语言分词的可能性

七、写在最后

从 2015 年那次失败的搜索,到今天 Surfing-Segment 在多家企业稳定运行,这段历程让我深刻体会到:

好的技术不是凭空产生的,而是在真实问题中磨练出来的。

ik-analyzer 是一座高峰,我没有想过去超越它。我只是在它的启发下,找到了一个更适合电商场景的解决方案。

如果你也在做搜索引擎优化,也遇到了类似的分词难题,欢迎试用 Surfing-Segment。如果它能帮你解决哪怕一个小问题,这个项目就有了意义。


下期预告:《Surfing-Segment 核心算法详解:型号动态解析的实现原理》

将深入讲解:

  • Trie 树的改造与优化
  • 型号识别的模式引擎设计
  • 同义词标准化的算法实现
  • 多段切分的策略选择

敬请期待!


关于作者

10余年搜索引擎领域从业经验,持有3项相关发明专利。从 ik-analyzer 的深度用户成长为分词引擎的开发者,专注于电商搜索优化和信息检索技术。

项目地址: gitee.com/sh_wangwanb…

技术交流: 欢迎在项目 Issues 中提问和讨论


本文是 "Surfing-Segment 分词引擎" 系列的第一篇,后续将陆续发布技术实现细节和应用案例,敬请关注。