框计算垂直搜索之索引篇

简介:

阿拉丁的索引服务适用于所有需要文本或者半文本检索的资源,例如招聘资源需要能够在“职位名称”以及“公司名称”里检索出查询词:

 

因为阿拉丁内部资源比较多,所以在索引设计时需要考虑到不同资源的需求,这里面至少有两个因素需要考虑,一个是时效性,另一个是数据量。

 

时效性指的是一个资源的数据从修改到生效需要的时间,时效性高表示生效时间短,有的资源甚至需要立即生效;而生效时间长的资源也会分成很多档次,有小时级的,有天级的,甚至有更长时间的静态资源。数据量指的是一个资源的数据规模,从最小的数千条到千万级甚至亿级,不同数据量级别的资源会用不同的方式进行索引构建以及索引检索。以下简单列举了不同时效性和数据量条件下的索引方式:

  时效性高 时效性低
数据量小 实时内存索引 周期性文件索引
数据量大 实时混合索引 分布式文件索引

实时索引需要实时支持索引的增加以及删除操作,更新操作可以看作是删除操作和增加操作的组合。对于数据量小的资源,可以将索引完全放入内存,在内存中建立倒排和用于屏蔽的bit vector,增加操作可以直接在索引拉链的末端添加新的doc_id,注意这里的doc_id是全局分配的,保证索引拉链按照doc_id的升序排序;删除操作比较简单,直接在bit vector里设置屏蔽位即可。对于数据量比较大的资源,由于索引无法完全放入内存,需要建立文件索引,但由于文件索引的紧致压缩的特点,无法实时地在倒排拉链中添加doc_id,在这种情况下,解决时效性问题可以有两种办法,一种是尽量缩短建索引时间,例如基于map-reduce的分布式建库技术可以将千万级别的建库时间缩短到10分钟以内,这种索引我们称为伪实时索引;另一种比较复杂的方式是混合索引,即索引的增量部分存于内存中,在检索时需要将内存索引和文件索引合并,这种方式在做检索时处理较复杂,所以在阿拉丁主要采用的还是伪实时索引方式处理大数据量、高时效性资源数据。

对时效性低的数据也有不同的处理方式,对于数据量比较小的资源,单机索引能完全涵盖,此时只需要周期性的构建索引然后进行索引切换就可以了;对于大数据量的资源,单机索引无法涵盖,索引必须分布到多台机器上,分布方式有按term切分以及按照doc_id切分两种方式,阿拉丁现在是按照doc_id进行切分,一个doc对应的所有term都会分布到同一台机器上。分布式索引的主要困难是检索流程比较复杂,需要将query分发到多台索引机上,然后对返回的多个结果进行整合,这里还要处理单台或多台索引机失效重查的情况。

最后简单谈一下阿拉丁的索引构建流程。对实时内存索引,增加、删除索引都是实时流,但是频繁索引修改会导致索引拉链碎片增多,需要有专门的任务定时整理索引拉链,一方面是清理碎片,紧致排列索引拉链;另一方面也需要对过长的拉链进行截断。对文件索引,使用分布式建库是个非常高效的方法,阿拉丁的文件索引建库主要是采用这种方式。文件索引由于是静态的,能够采用多种压缩算法进行处理,当然这种压缩并不一定是极致压缩,需要取得磁盘读取效率和CPU占用之间的平衡。另外,由于文件索引的读取效率相对于内存仍然很低,为尽量提高效率,阿拉丁主要采用了两种办法解决,一种是使用flash卡代替磁盘,尽量提高磁盘读取速率;另一种是使用缓存,缓存使用LRU算法,将最常访问的拉链放在内存中,检索时可以直接从内存中取数据,减少对磁盘的访问。

 













本文转自百度技术51CTO博客,原文链接:http://blog.51cto.com/baidutech/743773,如需转载请自行联系原作者

相关文章
|
3天前
|
云安全 人工智能 自然语言处理
|
7天前
|
人工智能 Java API
Java 正式进入 Agentic AI 时代:Spring AI Alibaba 1.1 发布背后的技术演进
Spring AI Alibaba 1.1 正式发布,提供极简方式构建企业级AI智能体。基于ReactAgent核心,支持多智能体协作、上下文工程与生产级管控,助力开发者快速打造可靠、可扩展的智能应用。
712 17
|
10天前
|
数据采集 人工智能 自然语言处理
Meta SAM3开源:让图像分割,听懂你的话
Meta发布并开源SAM 3,首个支持文本或视觉提示的统一图像视频分割模型,可精准分割“红色条纹伞”等开放词汇概念,覆盖400万独特概念,性能达人类水平75%–80%,推动视觉分割新突破。
747 57
Meta SAM3开源:让图像分割,听懂你的话
|
8天前
|
搜索推荐 编译器 Linux
一个可用于企业开发及通用跨平台的Makefile文件
一款适用于企业级开发的通用跨平台Makefile,支持C/C++混合编译、多目标输出(可执行文件、静态/动态库)、Release/Debug版本管理。配置简洁,仅需修改带`MF_CONFIGURE_`前缀的变量,支持脚本化配置与子Makefile管理,具备完善日志、错误提示和跨平台兼容性,附详细文档与示例,便于学习与集成。
329 116
|
10天前
|
机器学习/深度学习 人工智能 自然语言处理
AgentEvolver:让智能体系统学会「自我进化」
AgentEvolver 是一个自进化智能体系统,通过自我任务生成、经验导航与反思归因三大机制,推动AI从“被动执行”迈向“主动学习”。它显著提升强化学习效率,在更少参数下实现更强性能,助力智能体持续自我迭代。开源地址:https://github.com/modelscope/AgentEvolver
494 37
|
23天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
2天前
|
Rust 安全
掌握Rust文件读取(从零开始的IO操作指南)
本教程手把手教你用Rust读取文件,涵盖`read_to_string`一次性读取和`BufReader`逐行高效读取,适合初学者掌握安全、高效的Rust文件操作,助你轻松入门系统编程。
149 113