广告系统
每个Document都是由多个field组成,每个field中包含一系列的词语,构建索引的目的是为了加快检索的速度,根据映射关系方向的不同,索引可以分为:
-
倒排索引(index)
倒排索引存储了从单词到DocID的映射关系,形如:
词-->(Doc1,Doc2,...,DocN)
倒排索引主要用在检索中,它能快速的定位用户查询到关键字对应的Document。
-
正排索引(attribute)
正排索引存储从DocID到field的映射关系,形如:
DocID-->(term1,term2,...termn)
正排索引分单值和多值两种,单值attribute由于长度是固定的(不包括string类型),因此查找效率高,而且可以支持更新。多值attribute表示某个field中有多个数据(数量不固定),由于长度不确定,因此查找效率相较与单值更慢,而且不能支持更新。
正排索引主要是在查询到了某个Document后,根据docid值能快速获取到其attribute用来统计、排序、过滤中。
目前引擎支持的正排字段基本类型包括:INT8(8位有符号数字类型), UINT8(8位无符号数字类型), INT16(16位有符号数字类型), UINT16(16位无符号数字类型), INTEGER(32位有符号数字类型), UINT32(32位无符号数字类型), INT64(64位有符号数字类型), UINT64(64位无符号数字类型), FLOAT(32位浮点数), DOUBLE(64位浮点数), STRING(字符串类型)
多值的attribute只是一个field中可能出现数量不确定的单值attribute,引擎对上述的单值类型attribute都支持对应的多值attribute(例如multi_int8,multi_string)。
-
摘要(summary)
summary的存储形式与attribute类似,但是summary是将一个Document对应的多个field存储在一起,并且建立映射,所以能很快从docid定位到对应的summary内容。
summary主要是用于结果的展示,一般而言summary的内容都比较大,对于每次查询而言不适合取过多的summary,只有最终需要展示结果的Document会取到对应的summary。
由于summary过大,引擎在存储summary时提供压缩的机制,在schema中配置summary压缩,那么引擎在存储时会用zlib压缩后再存储,读取时引擎会先解压,再返回给用户。
5.2.1 倒排索引介绍
倒排索引的介绍:包括什么是倒排索引,倒排索引存储的基本组成。以及各个组成部分在检索中的作用。
-
什么是倒排索引?
倒排索引也常被称为反向索引、置入档案或反向档案,是一种索引方法,被用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射。它是文档检索系统中最常用的数据结构。
-
倒排索引可以为我们做什么?
通过倒排索引,可以快速定位单词所在的文档列表以及该词在文档中的位置,词频等信息。供信息分析使用。
-
通过倒排索引我们可以获取哪些信息?
Table 5.1. 倒排索引存储信息列表
信息名称 描述 ttf 全称:total term frequency, 表示检索词在所有文档中出现的总次数 df 全称:document frequency, 表示包含检索词的文档总数 tf 全称:term frequency, 表示检索词在文档中出现的次数 docid 全称:document id, 是文档在引擎中的唯一标识,可以通过docid获取到原文档的其他信息。 fieldmap 全称:field map, 用于记录包含检索词的field信息(TODO: Link 什么是field??) section 信息 用户可以为某些文档分段,然后为每一段添加附属信息。该信息可以在检索时取出,供后续处理使用 position 用于记录检索词在文档中的位置信息 positionpayload 全称:position payload, 用户可以为文档不同位置设置payload信息,并可以在检索时取出,供后续处理用 docpayload 全称:document payload, 用户可以为某些文档添加附属信息,并可以在检索时取出,供后续处理使用 termpayload 全称:term payload, 用户可以为某些词添加附属信息,并可以在检索时取出,供后续处理使用 -
倒排索引的基本结构有哪些?
Table 5.2. 倒排索引的基本结构
结构名称 描述 dictionary 词典, 存储检索词和倒排链的映射信息。引擎可以通过词典查找检索词对应的倒排信息位置 doclist 全称:document list,存储包含检索词的文档信息 positionlist 全称:position list,存储每一篇文档中检索词所在的位置信息 truncatelist 全称:truncate list(截断链),用于提高引擎性能,根据用户的配置,将一些优质文档单独建倒排索引,以提高检索性能 bitmap 用于提高引擎性能,根据用户的配置,将一些倒排结构采用bitmap方式存储,以减少倒排所占空间,提高检索性能(TODO link 什么是bitmap?) -
倒排索引检索的基本流程
当用户查询单词M的倒排索引时,首先引擎会查询词典文件,找到索引词在倒排索引文件(posting文件)的起始位置。
随后引擎通过解析倒排链,获取词M存储在倒排链的三部分信息:TermMeta,DocList, PositionList。
TermMeta存储的是对索引词的基本描述,主要包括词的df、ttf、termpayload信息。
DocList包含索引词的文档信息列表,文档信息包括:DocumentId,文档中的检索词频(tf), docpayload, 包含检索词的field信息(termfield)。
PositionList是检索词在文档中的位置信息列表,主要包括检索词在文档中的具体位置(position)和positionpayload信息。