lucene
Posted 仰望星空的程序
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了lucene相关的知识,希望对你有一定的参考价值。
python可以把float类型二进制转为int类型二进制,转化代码:
import struct
def float2bin(num):
return ''.join(bin(ord(c)).replace('0b', '').rjust(8, '0') for c in struct.pack('!f', num))
def bin2float(bits):
return struct.unpack('f',struct.pack('I',int(bits,2)))
当然, 也可以用Java用以下函数查看一个Float小数的二进制字符串
System.out.println(Integer.toBinaryString(Float.floatToIntBits(3.14f)));
索引是需要分词的,原因是,程序员把索引想象成一个树结构,这种结构在查找上的速度性价比高。而为了存储性价比也一起高,如果一个节点的所有子节点都是符合查找条件的索引,那么就之间存储这个节点了,不存它的叶子节点了。分词就是为了制造这个树结构的每一条分支。
数值类型分词与文本分词不同, 比如整数1, 转换成字节数组后,其值为[60 8 0 0 0 1](注意数组中是16进制, 而非10进制),其中上一章提到,0x60是SHIFT_START_INT,标识数据类型是int。8对应二进制1000,但是分词是按16进制的步长来切分的,所以不必转为二进制来理解。
lucene源码里有个变量叫precisionStep,用来控制某个数被分词时,每块分词的大小,默认为4;precisionStep越大,每块分词就越大,树就越矮,查找速度就越快,然而查找精度就越低(想象一下极限情况, 就一个根节点和一堆叶子节点。要么存储一个根节点,用户查找然后蹦出一大坨结果,用户大怒,查了等于没查。要么存储一大坨叶子节点,磁盘炸了,运维怒。)precisionStep越小 ,每块分词就越小,树就越高,查找速度就越慢,然而查找精度就越高?其实不是,切分细致到某种程度的时候,再切细,你存储的节点数也不能更少了。所以precisionStep要多测一下,选合适的值。
以上是关于lucene的主要内容,如果未能解决你的问题,请参考以下文章