ElasticSearch核心技术解析:倒排索引与IK分词器如何解决中文搜索痛点
俞事 发布于 阅读:470
倒排索引
-
核心结构:
- 词项字典(Term Dictionary):存储所有文档中出现的唯一词项,按字典序排序,便于快速定位。
- 倒排列表(Posting List):记录每个词项对应的文档ID(DocID)、词频(TF)、位置(Position)及偏移量(Offset),支持布尔检索、短语查询等场景。
- 压缩算法:通过FOR(Frame Of Reference)、Roaring Bitmap等技术压缩倒排列表,降低存储与内存占用。
-
解决搜索痛点的机制:
- 快速定位文档:通过词项字典直接跳转到目标词项的倒排列表,避免全表扫描。
- 相关性评分:结合词频、逆文档频率(IDF)等计算文档相关性(如TF-IDF、BM25算法)。
- 近实时搜索:通过内存缓冲区(Indexing Buffer)和段(Segment)合并机制,实现数据写入后秒级可查。
IK分词器
-
中文分词挑战:
- 歧义切分:如“结婚的和尚未结婚的”存在多种切分可能。
- 未登录词识别:新词、专业术语(如“区块链”“奥密克戎”)无法被传统词典覆盖。
- 长词组合:需平衡细粒度切分与语义完整性(如“中华人民共和国”应整体切分)。
-
IK核心功能:
- 细粒度切分(ik_smart):保证语义连贯性,适合精准搜索场景。
示例:“苹果手机”切分为[苹果, 手机]
。 - 最大词长切分(ik_max_word):穷举所有可能组合,适合召回率优先场景。
示例:“中国共产党”切分为[中国, 共产党, 中共, 国共, 产党]
。 - 自定义词典扩展:支持用户添加行业术语、热词,解决未登录词问题。
- 歧义消除算法:基于隐马尔可夫模型(HMM)与正向/逆向最大匹配策略,优化切分准确性。
- 细粒度切分(ik_smart):保证语义连贯性,适合精准搜索场景。
倒排索引与IK协同优化中文搜索
- 精准词项匹配:
- IK分词器将中文文本切分为独立词项,倒排索引建立词项与文档的映射关系。
示例:搜索“机器学习”时,IK切分为[机器, 学习, 机器学习]
,倒排索引同时命中短词与长词组合。
- IK分词器将中文文本切分为独立词项,倒排索引建立词项与文档的映射关系。
- 解决歧义与长词问题:
- 通过ik_max_word生成多粒度词项,结合倒排索引的TF-IDF权重,优先返回高相关性结果。
- 动态更新支持:
- IK支持热更新自定义词典,倒排索引通过段合并机制实时生效新词,无需重建全量索引。
配置示例(Elasticsearch)
PUT /my_index
{
"settings": {
"analysis": {
"analyzer": {
"ik_custom": {
"type": "custom",
"tokenizer": "ik_max_word",
"filter": ["lowercase"]
}
}
}
},
"mappings": {
"properties": {
"content": {
"type": "text",
"analyzer": "ik_custom",
"search_analyzer": "ik_smart"
}
}
}
}