Elasticsearch常見字段映射類型之scaled_float解讀
一、概述
ES中支持的常見的數(shù)字類型有
longintegershortbytedoublefloathalf_floatscaled_float
如下表:

官方文檔地址:Numeric field types | Elasticsearch Guide [8.2] | Elastic
今天我們主要總結(jié)一下scaled_float這種數(shù)字類型。
scaled_float:帶有縮放因子的縮放類型浮點數(shù)。需配合縮放因子scaling_factor一起使用。
什么時候使用scaled_float類型呢?
有時候,我們需要存儲浮點類型的數(shù)據(jù),比如價格等,單位為元。這時候其實推薦價格使用scaled_float類型,然后我們將比例因子(scaling_factor)設(shè)置為100,這樣我們的價格在ES中就會以“分”進行存儲。
例如:
假設(shè)縮放因子scale_factor為100,這樣scaled_float字段將在ES內(nèi)部存儲10.25(元)為1025(分)。存儲10.2588(元)為1026(分)。
scaled_float類型注意事項
必須指定縮放因子scaling_factor。ES索引時,原始值會乘以該縮放因子并四舍五入得到新值,ES內(nèi)部儲存的是這個新值,但返回結(jié)果仍是原始值。使用比例因子的好處是整型比浮點型更易壓縮,節(jié)省磁盤空間。
注意: scaling_factor屬性是只針對scaled_float這個數(shù)據(jù)類型才有,不要在其他類型上使用此屬性。
二、實踐
接下來,我們通過一個簡單的示例來演示scaled_float類型的字段的使用。
(1)、創(chuàng)建包含類型為scaled_float的字段
totalAmount(總價格)的索引order,并指定scaling_factor(縮放因子)為100
PUT order
{
"mappings": {
"properties": {
"totalAmount": {
"type": "scaled_float",
"scaling_factor": 100
}
}
}
}(2)、存儲第一個值
PUT order/_doc/1
{
"totalAmount": 13.3225
}實際上,ES內(nèi)部存儲的是:
13.3225 * 100(縮放因子) = 1332.25,然后四舍五入得到1332,所以內(nèi)部真正存儲的是1332。
(3)、存儲第二個值
PUT order/_doc/2
{
"totalAmount": 13.3277
}實際上,ES內(nèi)部存儲的是:
13.3277 * 100(縮放因子) = 1332.77,然后四舍五入得到1333,所以內(nèi)部真正存儲的是1333。
(4)、基于totalAmount條件進行查詢匹配
GET order/_search
{
"query": {
"match": {
"totalAmount": 13.3245
}
}
}查詢結(jié)果:
"hits" : [
{
"_index" : "order",
"_type" : "_doc",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"totalAmount" : 13.3225
}
}
]通過查詢結(jié)果可以看到,通過13.3245查詢出了ID為1的文檔,實際上ES是將查詢條件:13.3245 * 100(縮放因子) = 1332.45,然后四舍五入之后到最近的長值得到1332,這樣就能匹配到ID為1的文檔。
需要注意的是,雖然ES在內(nèi)部做了縮放處理,但是查詢返回值還是原始值(13.3225)。
GET order/_search
{
"query": {
"match": {
"totalAmount": 13.3267
}
}
}查詢結(jié)果:
"hits" : [
{
"_index" : "order",
"_type" : "_doc",
"_id" : "2",
"_score" : 1.0,
"_source" : {
"totalAmount" : 13.3277
}
}
]通過查詢結(jié)果可以看到,通過13.3267查詢出了ID為2的文檔,實際上ES是將查詢條件:13.3267 * 100(縮放因子) = 1332.67,然后四舍五入之后到最近的長值得到1333,這樣就能匹配到ID為2的文檔。
需要注意的是,雖然ES在內(nèi)部做了縮放處理,但是查詢返回值還是原始值(13.3277)。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
由淺到深帶你詳談Java實現(xiàn)數(shù)組擴容的三種方式
這篇文章主要詳細介紹了Java實現(xiàn)數(shù)組擴容的三種方式,新建一個數(shù)組,把原來數(shù)組的內(nèi)容搬到新數(shù)組中,使用system.arraycopy(),使用java.util.Arrays.copyOf()這三種方式,具有一定的參考價值,需要的朋友可以借鑒一下2023-06-06
Java?數(shù)據(jù)結(jié)構(gòu)與算法系列精講之貪心算法
我們可能在好多地方都會聽到貪心算法這一概念,并且它的算法思想也比較簡單就是說算法只保證局部最優(yōu),進而達到全局最優(yōu)。但我們實際編程的過程中用的并不是很多,究其原因可能是貪心算法使用的條件比較苛刻,所要解決的問題必須滿足貪心選擇性質(zhì)2022-02-02
Java網(wǎng)絡(luò)編程中的TCP/UDP詳解
這篇文章主要介紹了Java網(wǎng)絡(luò)編程中的TCP/UDP詳解,網(wǎng)絡(luò)編程是指編寫運行在多個設(shè)備的程序,這些設(shè)備都通過網(wǎng)絡(luò)連接起來,java.net 包中 J2SE 的 API 包含有類和接口,它們提供低層次的通信細節(jié),需要的朋友可以參考下2023-12-12

