2016-12-07 106 views
0

我想了解浮动如何存储在SolR中。 我在PHP(32位)的float值和SolR中的存储值之间有一个增量。SolR浮动(TrieFloatField)存储限制

我搜索的文档中, “附带SOLR字段类型”:

https://cwiki.apache.org/confluence/display/solr/Field+Types+Included+with+Solr

而且找到了TrieFloatField:

浮点字段(32位IEEE浮点)。 precisionStep =“0” 启用有效的数字排序并最小化索引大小; precisionStep =“8”(默认值)可启用有效的范围查询。

但我不知道如何估计将存储的值。 这是我做的一些测试。 我试着在浮动场和结果要插入的值:使用哪种约束

ok: 2097151.1 
ko: 2097152.1 -> 2097152 
ko: 20971521 -> 20971520 
ok: 16777216 
ko: 16777217 -> 16777216 
ko: 4294967296 -> 4294967300 
ok: 4294967300 
ko: 4294967301 -> 4294967300 

我不明白,这不是四舍五入。 也许这是一个二元约束,因为它看起来是取整到的2

https://en.wikipedia.org/wiki/Power_of_two#The_first_96_powers_of_two

2^21 = 2,097,152 
2^24 = 16,777,216 
2^32 = 4,294,967,296 

权力,你可以看到,这些值接近的由SOLR存储的人。

有人知道SolR商店如何浮动吗? 以及如何评估它与PHP?

感谢。

回答

0

显然,比较浮动的最安全的方法是使用pack()。 将数据打包成二进制字符串以安全地比较两个浮点数。

http://php.net/manual/en/language.types.float.php#119860

因此,作为一个替代使用

$float1 === $float2 

一个可以使用

pack('f', $float1) === pack ('f', $float2) 

一个大脚注,一要真正记住一个减少你的准确度的比较。 AFAIK是安全比较两个花车的唯一方法(除了epsilon方法)。

0

正如你所说的,它是一个32位浮点数。 32位浮点数不能准确表示0到2^32之间的所有值,因此会有不准确的数字和不能用这些位表示的数字。

您可以使用像IEEE754 Floating Point Conversion这样的转换器来测试您包含的值,并且它们都转换为您从Solr返回的值。

浮点数不准确,并且不是魔术 - 仍然只有2^32个不同的值可用,所以当您试图存储不准确映射到可能的值的值时,32位FP可以表示,你会得到不准确的。

双引入更高的准确性(64位与32位),并且您可以使用TrieDoubleField替代在Solr中使用双打。

另一种选择,取决于你需要的是使用一个长字段来代替,当存储一个值并在出路时除以该值时乘以10或100。这将允许您精确地表示一个十进制数字,在点之后有两位数字。

+0

非常感谢,我会尝试在PHP中转置此JavaScript示例。 – Quezako

+0

何,我没有看到您的链接实际上是使用.py文件...所以我必须自己搜索。 – Quezako