ES-倒排索引

来源

  • 来源于需要根据属性的值来查找响应的记录
  • 该种索引表中的每一项都包括一个属性值和具有该属性值的各记录的地址
  • 是由属性值来确定记录的位置
  • 倒排索引是实现单词到文档映射关系的最佳实现方式和最有效的索引结构

包含内容

  1. 单词词典 : 文档中的关键词组成的词典(用户可能通过这些个词典查询)
  2. 倒排文件 : 倒排列表记载了出现过某个单词的所有文档的文档列表及单词在该文档中出现的位置信息,每条记录称为一个倒排项(Posting)。根据倒排列表,即可获知哪些文档包含某个单词。存放倒排列表的文件就是倒排文件

构建方法

简单法

1. 将文档分析成单词term标记
2. 使用hash去重单词term
3. 对单词生成倒排列表

倒排列表就是文档编号DocID,没有包含其他的信息(如词频,单词位置等),这就是简单的索引。
这个简单索引功能可以用于小数据,例如索引几千个文档。然而它有两点限制:
1. 需要有足够的内存来存储倒排表,对于搜索引擎来说, 都是G级别数据,特别是当规模不断扩大时 ,我们根本不可能提供这么多的内存。
2. 算法是顺序执行,不便于并行处理。

合并法

  • 归并法,即每次将内存中数据写入磁盘时,包括词典在内的所有中间结果信息都被写入磁盘,这样内存所有内容都可以被清空,后续建立索引可以使用全部的定额内存。

  • 合并流程:

    1. 页面分析,生成临时倒排数据索引A,B,当临时倒排数据索引A,B占满内存后,将内存索引A,B写入临时文件生成临时倒排文件,
    2. 对生成的多个临时倒排文件 ,执行多路归并 ,输出得到最终的倒排文件 ( inverted file)。

索引创建过程中的页面分析 ,特别是中文分词为主要时间开销。算法的第二步相对很快。这样创建算法的优化集中在中文分词效率上。

更新策略

  • 完全重建策略:当新增文档到达一定数量,将新增文档和原先的老文档整合,然后利用静态索引创建方法对所有文档重建索引,新索引建立完成后老索引会被遗弃。此法代价高,但是主流商业搜索引擎一般是采用此方式来维护索引的更新(这句话是书中原话)
  • 再合并策略:当新增文档进入系统,解析文档,之后更新内存中维护的临时索引,文档中出现的每个单词,在其倒排表列表末尾追加倒排表列表项;一旦临时索引将指定内存消耗光,即进行一次索引合并,这里需要倒排文件里的倒排列表存放顺序已经按照索引单词字典顺序由低到高排序,这样直接顺序扫描合并即可。其缺点是:因为要生成新的倒排索引文件,所以对老索引中的很多单词,尽管其在倒排列表并未发生任何变化,也需要将其从老索引中取出来并写入新索引中,这样对磁盘消耗是没必要的。
  • 原地更新策略:试图改进再合并策略,在原地合并倒排表,这需要提前分配一定的空间给未来插入,如果提前分配的空间不够了需要迁移。实际显示,其索引更新的效率比再合并策略要低。
  • 混合策略:出发点是能够结合不同索引更新策略的长处,将不同索引更新策略混合,以形成更高效的方法。

原理

  • 文档1:中国古代的精美散文(长文章已关键词进行排序)
  • 文档2:古代精美散文作者
  • 文档3:如何写出精美散文

词典集合:

单词ID 单词 倒排列表
1 中国 1
2 古代 1,2
3 精美 1,2,3
4 散文 1,2,3
5 作者 2
6 如何 3
7 写出 2

简单实施策略

  1. 为文档设置对应的唯一文档编号
  2. 使用粉刺系统对所有文档进行分词并记录
  3. 对每个单词进行唯一编号(单词词典:用来维护文档中出现过的所有单词的相关信息)
  4. 记录每个单词在哪个文档中出现过(单词ID、单词、倒排列表(文档ID序列以及其他相应的详细的文件属性信息(后续用来计算重要性的计算因子,这个计算因子的解决决定了查询结果的顺序)))
  5. 呈现查询结果

猜你喜欢

转载自blog.csdn.net/it_dx/article/details/81586246