
3.2.1 索引模块:提高搜索效率
索引模块的目的是处理内容数据并创建索引,这样搜索系统就可以不再处理高达几百T的数据,而只需要处理轻量级的索引即可,从而极大地提高了搜索效率。索引模块的原理架构如图3-14所示,分为内容采集层、内容转换层、索引创建层,下面分别进行介绍。
1.内容采集层
对于短视频社区,大家往往认为其内容源格式都比较规范(短视频上传时一般会要求必填标题、简介、地点、时间等信息),而不像其他全平台搜索引擎那样需要用网络爬虫去对各个站点进行爬取,然后再处理大量杂乱无章的数据。

图3-14 索引模块原理架构图
虽然如此,但因为如前面搜索系统产品介绍的那样,用户的搜索目的不仅是内容本身,还有话题、活动、商品等其他类型,所以社区的内容源不仅有短视频内容结构化的数据本身,还有其他内容类型,同时用户上传UGC内容时也会填写进大量的杂乱数据,某些平台的内容来源也不是只有UGC,也可能有其他OGC(Occupationally-Generated Content,职业生产内容)。
基于以上三点,需要转换组件将这些内容统一数据格式,之后,系统会将这些规范格式的内容存储进数据库。由于视频数据量远远大于图文,所以短视频社区往往需要非常强大的数据压缩技术,否则再多的存储设备也存不下海量的短视频内容。
2.内容转换层
在将内容存储进数据库之后,在创建索引前还需要进一步进行内容转换,将海量内容进行处理、整合与分类,提高检索效率。
内容解析这一步是将无论是什么形态的内容(文字/图片/音频/视频等)都统一解析成文字;因为用户的习惯仍然是通过输入文字来检索,而很少会用图片、音频、视频作为输入方式来搜索内容,检索系统为了查询输入与内容能够匹配,也需要将数据库统一解析成文字。
将内容解析成文字后,为了提高匹配效率需要进行切词处理,其中最常用的就是停用词处理,例如中文里的“的”“呢”等,英文里的of、to等,这些词没有实际意义但是却经常出现。这里需要先准备好一个停用词库,避免将有意义的词识别为停用词。
最后还需要进行内容的整合与分类,如果社区本身对内容有分区,例如美食区、娱乐区、数码区等,那么在底层索引里相对应的也应该进行分类,目的仍然是提高效率。
3.索引创建层
在处理好内容采集与内容转换后,我们终于可以进行索引创建了,这层需要处理好内容权重、权重配置、倒排、索引分布等事项。
首先,不可能每个视频内容都同样重要,我们需要对内容权重进行标记,提供给后续的排序模块来进行处理;其次,传统的文本检索可以通过tf-idf等方法计算词的权重,进而判断文档权重,但是视频内容由于其特殊性,往往还需要人工运营进行另外的权重配置,例如一个运用了3D渲染技术的视频,标题文案比较简单,同时也没有命中热度词,但是其视频内容本身质量很高,那么人工可以将该内容进行提权。
内容权重设置完成后,需要进行倒排,这是一项基础操作,将“内容-索引项”转换成“索引项-文档”,进行索引项与查询词的匹配,同时如果索引的量非常大,还需要进行索引分布的处理,将索引派发到不同的计算节点上,支持并行查询。