lucene分析8

lucene分析8,第1张

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 --> Freq

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

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5684562.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存