lucene分析8

2021SC@SDUSC
或然跟随规则
Lucene 的索引结构中存在这样的情况,某个值 A 后面可能存在某个值 B,也可能不存在,需
要一个标志来表示后面是否跟随着 B。
一般的情况下,在 A 后面放置一个 Byte,为 0 则后面不存在 B,为 1 则后面存在 B,或者 0
则后面存在 B,1 则后面不存在 B。
但这样要浪费一个 Byte 的空间,其实一个 Bit 就可以了。
在 Lucene 中,采取以下的方式:A 的值左移一位,空出最后一位,作为标志位,来表示后
面是否跟随 B,所以在这种情况下,A/2 是真正的 A 原来的值。
如果去读 Apache Lucene - Index File Formats 这篇文章,会发现很多符合这种规则的:
.frq 文件中的 DocDelta[, Freq?],DocSkip,PayloadLength?
.prx 文件中的 PositionDelta,Payload? (但不完全是,如下表分析)
当然还有一些带?的但不属于此规则的:
.frq 文件中的 SkipChildLevelPointer?,是多层跳跃表中,指向下一层表的指针,当然如
果是最后一层,此值就不存在,也不需要标志。
.tvf 文件中的 Positions?, Offsets?。
在此类情况下,带?的值是否存在,并不取决于前面的值的最后一位。
而是取决于 Lucene 的某项配置,当然这些配置也是保存在 Lucene 索引文件中的。
如 Position 和 Offset 是 否 存 储 , 取 决 于 .fnm 文 件 中 对 于 每 个 域 的 配 置
(TermVector.WITH_POSITIONS 和 TermVector.WITH_OFFSETS)
为什么会存在以上两种情况,其实是可以理解的:
对于符合或然跟随规则的,是因为对于每一个 A,B 是否存在都不相同,当这种情况大
量存在的时候,从一个 Byte 到一个 Bit 如此 8 倍的空间节约还是很值得的。
对于不符合或然跟随规则的,是因为某个值的是否存在的配置对于整个域(Field)甚至整
个索引都是有效的,而非每次的情况都不相同,因而可以统一存放一个标志。
文章中对如下格式的描述令人困惑:
Positions --> <PositionDelta,Payload?> Freq

Payload --> <PayloadLength?,PayloadData>
PositionDelta 和 Payload 是否适用或然跟随规则呢?如何标识 PayloadLength 是否存在呢?
其实 PositionDelta 和 Payload 并不符合或然跟随规则,Payload 是否存在,是由.fnm 文件中对
于每个域的配置中有关 Payload 的配置决定的(FieldOption.STORES_PAYLOADS) 。
当 Payload 不存在时,PayloadDelta 本身不遵从或然跟随原则。
当 Payload 存在时,格式应该变成如下:Positions --> <PositionDelta,PayloadLength?,PayloadData>
Freq
从而 PositionDelta 和 PayloadLength 一起适用或然跟随规则。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值