lucene
Posted 仰望星空的程序
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了lucene相关的知识,希望对你有一定的参考价值。
Lucene最初设计是实现全文检索功能, 即只处理字符串. 因此, 在处理数值时, Lucene也是将数值编码为字符串。
将数值转换成字符串, Lucene-5.2.0对应的实现类为org.apache.lucene.util.NumericUtils。
NumericUtils把Int类型数值编码为6byte字符串. 其中的1byte用于区别原数据类型为Int还是Long:
SHIFT_START_INT = 0x60;
SHIFT_START_LONG = 0x20;
另外的5byte表示原数的补码。但是负数的补码大于绝对值相同的正数的补码,这在排序上不合理。所以使用NumericUtils.intToPrefixCoded()对补码进行处理。
NumericUtils对Float类型处理机制如下: 将Float转成Int, 然后按照Int类型处理。那么Float如何转成Int呢,首先要了解计算机是如何存储浮点数.
IEEE 754-1985 将存储空间分成三个部分,从左到右(最高位到最低位)的顺序依次是:符号位(sign)、exponent(指数位)、fraction(分数位)。其中sign占1-bit, exponent占8-bit, fraction占23-bit。
------------------------------------------------
| 0 |1000 0001 |010 0000 0000 0000 0000 0000 |
------------------------------------------------
|Sign | exponent | fraction |
------------------------------------------------
上面的exponent是129,由于指数是以127为正负分界的,所以实际指数位是129-127=2
小数位由于是科学计数法,比如1.11自动忽略了前面的"1.",变成0.11。所以实际小数是1+2^(-2)=1.25
所以最终是1.25*2^2=5.0
以上是关于lucene的主要内容,如果未能解决你的问题,请参考以下文章