2016-12-07 18 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