ES原理 基于 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还支持前缀查找和自动补全功能,这对于搜索引擎的实现非常有用 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日...数据库全文搜索ES大约 7 分钟