- 基于 lucence 引擎
- 通过关键词进行信息检索,搜索场景
基础:
倒排索引:
- 什么是倒排索引:
- 一个用于搜索的数据结构
- 倒排索引的核心概念:
-
词项 term:
- 将文本进行分词(LLM里面叫token化)后得到词项,词项就是一堆
-
词项字典 Term Dictionary:
- 将词项进行排序后得到词项字典,词项数量庞大时,可以通过二分法快速查询(此处可类比mysql的Page Dictionary作用也相似)
- 词项字典存在磁盘中,数据大
- 实际访问时先通过内存中的Term index,找到前缀匹配的词项位置,然后通过少量查找,定位到词项
-
Posting List:
- 作用:记录每个词项对应的文本ID的集合和其他信息
- Posting List包含:文本ID的集合、词项在每个文本内的offset、词频
-
Term Index:
- 作用:通过内存加速搜索
- 结构:基于词项前缀生成的一个精简的树结构(可对比参考跳表、b+树)
- 特点:词项索引存放在内存中,数据小,可以方便的快速查询
- 查询:先通过词项索引,找到词项在词项字典的大概位置,然后到词项字典中再查找
- 具体实现 FST 有限状态机:(可对比Tire树)
- FST的特点:(本质是有向图结构)
- 压缩性:FST通过共享公共前缀和后缀,大大减少了存储空间
- 高效查找:FST允许在子线性时间内查找词项,非常适合用于大规模的文本搜索
- 自动补全:FST还支持前缀查找和自动补全功能,这对于搜索引擎的实现非常有用
- FST的特点:(本质是有向图结构)
-
Stored Fields:
行式存储
- 作用:存放文件的原始信息
- 查询:可以通过文本ID,从Stored Fields,获取出整个文本内容(此处可类比MyISAM引擎)
-
Doc Values:
列式存储
- 作用:用于排序和聚合
- 说明:对某个字段排序文档,比如按时间、价格排序场景时,提升查询速度(此处可对比Mysql的二级索引)
- 原理:将散落在各个文档的某个字段集中存放在一起,
-
segment:
- 说明:segment是具备完整搜索功能的最小单元
- 组成:inverted index、Term index、stored fields、doc values共同构成一个segment
- segment读写规则:
- 写入:
- 将多个文档生成一个segment,生成后,segment不能再被修改
- 如果有新文档,则新生成一个 segment
- 读取:
- 并发同时读多个segment,并进行聚合操作
- 写入:
- segment合并:
- 避免segment过多影响性能、避免文件句柄耗尽
- 不定期将多个小segment合并
- segment合并过程:待补充
- segment合并中的查询:待补充
-
lucene:
- 单机文本检索库,由多个segment构成
-
2025年6月17日...大约 7 分钟