上一篇使用了向量数据库,跟向量数据库匹配的就是比较厉害的EC搜索。
下面是我的笔记,希望能帮到你

在海量数据中通过关键词检索出有效信息的场景中,在应用——》中间层——》数据的中间层部署。

(1)、四种关键的结构

·倒排索引Inverted Index:文本切分(分词)后统计每个词项对应的ID,然后把词项按字典排序,ID集合与词项共同构成倒排索引,用于搜索

·Term Index:由于数据链过大,只能存在磁盘中,所以又有了一个新的优化手段Term Index:可以将部分词项中相同的部分提取出来,再构建出一个精简目录树,树枝去设定偏移量,这个目录树就是Term Index,可以直接放在内存里,占用空间很小。实现加速搜索

·Stored Fields:行式存储结构,存储完整的文档内容

·Doc Values:列式存储结构,以空间大小换时间效率,将散落在文档的某个字段集中存放,比如时间存放一列。价格存放一列,当需要对集中存放的字段排序就可以直接读取这个字段列进行排序和耦合处理。

(2)、其他概念

·segment:具备上面的四种关键结构的一个完整搜索结构的最小单元 ·Lucene:如果有新的文档要写入segment的话就创建一个新的segment,让老的segment负责读,新的负责写,可以并发同时多个读就可以啦,不定期合并小的segment可以减少空间。这个单机文本检索库就是Lucene。但是他没有高性能和高拓展性,很烦

·高性能:当多个调用方同时竞争Lucene资源会导致长时间等待。所以根据类设置不同的Lucene,他们有不同的index name,让用户根据需要搜索不同的index name,这样就降低了搜索压力,还可以进一步优化,把大的Lucene接着分为小的Lucene就行。

·高扩展性:将存储的信息分散给很多机器,每个机器是一个Node,通过增加Node,提升性能

·高可用:如果一个Node挂了就没法用了,办法就是加副本,主分片和副本分片,副本分片做一个备胎。

·结构优化:每个Node都加入不同的请求,比如集群管理(Master Node),存储数据(Data Node),处理请求(Coordinate Node)。当然,当集群规模化时候就可以这样干了。

·去中心化:协调Node之间的数据,在node之间共享信息就可以进行自行选择谁是主服务器,谁挂了等

(3)ES

任何语言都可以接入ES接口去进行搜索,增删改查等。

搜索过程:查询阶段、获取阶段

查询阶段:用户发送搜索请求——》集群中的协调节点——》根据index name 信息可知分片数量和目标分片——》到达分片——》并发搜索多个segment——》通过segment里的倒排索引获取到对应文档ID和排序信息——》将结果聚合返回协调节点——》协调节点将多个分片数据进行排序聚合,舍弃大部分不需要的数据

获取阶段:协调节点用Id请求数据文档的分片——》分片底层的Lucene库从segment里读出完整文档内容——》返回协调节点——》协调节点将数据结果返回给客户端。

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐