博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Lucene核心数据结构——FST存词典,跳表存倒排或者roarning bitmap 见另外一个文章...
阅读量:6081 次
发布时间:2019-06-20

本文共 937 字,大约阅读时间需要 3 分钟。

Lucene实现倒排表没有使用bitmap,为了效率,lucene使用了一些策略,具体如下:

1. 使用FST保存词典,FST可以实现快速的Seek,这种结构在当查询可以表达成自动机时(PrefixQuery、FuzzyQuery、RegexpQuery等)效率很高。(可以理解成自动机取交集)
此种场景主要用在对Query进行rewrite的时候。
2. FST可以表达出Term倒排表所在的文件偏移。
3. 倒排表使用SkipList结构。从上面的讨论可知,求倒排表的交集、并集、差集需要各种SeekTo(docId),SkipList能对Seek进行加速。

 

skiplist备忘

   如今大部分工具使用的倒排链已经不是简单的链表了。一个常用,比如lucene中用的,叫skiplist,是一种高效的链表结构,在查询、添加、删除的时间复杂度上做到O(logN)。如下图:

查询的过程很简单,从顶层开始,往后查询遇到节点的next()比待查的大或者到NIL了,节点不变下移一层继续向后查询,如此反复,直到到了底层还没查到。skiplist的资料也比较多,这里就不赘述了。

 

链表集合操作

   直接引用转述这篇博文:  。作者很细致地把过程都列出来了,真是方便了大家啊,建议顺着读一边。

    链表集合求交 

      lucene中用的是ConjunctionScorer ,大致过程是每条倒排链不断的推进到小于等于当前最大节点的位置。当然实现细节还是很丰富的,作者很细心的把过程都列出来了,建议顺着读一边。这里摘抄部分:

首先把倒排链按第一个next排序:

    

查看0~7的倒排链的第一个和最后一个是否相同,不同就开始找;取最后一个倒排的第一个元素8作为终点, 第一个链表开始找8

第0个链表 跳过1到了10,那么8也不用找了都去找10就行了

第1根链表找到了11,那么10也不用找了,找11,之后都这么做

......

之后遇到11,本次交集操作找到一个11,

  后续的计算也是同理,当然整个代码实现会比较复杂和讨巧。基本思路就是每条倒排链能根据当前文档迅速跳过不符合的docid,由于倒排链可以用skiplist查询,因此即使很长的倒排链,如果交集的数量很少,整个求解过程可以很快跳过不需要比较的节点。

转载地址:http://zyhgx.baihongyu.com/

你可能感兴趣的文章
SQL SERVER 中常见的高可用方案
查看>>
PHP 反射 初步测试
查看>>
安装MySQLdb-python时无法找到-lprobes_mysql处理一则
查看>>
对计算机模拟人脑的一个小想法
查看>>
CI分页器pagination的原理及实现
查看>>
The Rox Java NIO Tutorial
查看>>
如何选择婴幼儿奶粉?
查看>>
MySQL global Log
查看>>
BZOJ3564 : [SHOI2014]信号增幅仪
查看>>
发布流程考虑
查看>>
Openvswitch手册(1): 架构,SSL, Manager, Bridge
查看>>
EditText中文文档
查看>>
文本比较算法:Needleman/Wunsch算法
查看>>
c++文件读写操作
查看>>
理解Spring的Bean工厂
查看>>
excel中的数据粘贴不全到plsql中,excel 粘贴后空白,Excel复制粘贴内容不全
查看>>
设计指南剧情战斗(欢迎探讨)
查看>>
1、IOS开发--iPad之仿制QQ空间(登录界面搭建+登录逻辑实现)
查看>>
UIImagePickerController从拍照、图库、相册获取图片
查看>>
LeetCode-95. Unique Binary Search Trees II
查看>>