一、概述
ES中支持的常见的数字类型有
long
integer
short
byte
double
float
half_float
scaled_float
如下表:
官方文档地址:Numeric field types | Elasticsearch Guide [8.2] | Elastic
今天我们主要总结一下scaled_float这种数字类型。
scaled_float:带有缩放因子的缩放类型浮点数。需配合缩放因子scaling_factor一起使用。
什么时候使用scaled_float类型呢?
有时候,我们需要存储浮点类型的数据,比如价格等,单位为元。这时候其实推荐价格使用scaled_float类型,然后我们将比例因子(scaling_factor)设置为100,这样我们的价格在ES中就会以“分”进行存储。
例如:
假设缩放因子scale_factor为100,这样scaled_float字段将在ES内部存储10.25(元)为1025(分)。存储10.2588(元)为1026(分)。
scaled_float类型注意事项
必须指定缩放因子scaling_factor。ES索引时,原始值会乘以该缩放因子并四舍五入得到新值,ES内部储存的是这个新值,但返回结果仍是原始值。使用比例因子的好处是整型比浮点型更易压缩,节省磁盘空间。
注意: scaling_factor属性是只针对scaled_float这个数据类型才有,不要在其他类型上使用此属性。
二、实践
接下来,我们通过一个简单的示例来演示scaled_float类型的字段的使用。
(1)、创建包含类型为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内部存储的是:
13.3225 * 100(缩放因子) = 1332.25,然后四舍五入得到1332,所以内部真正存储的是1332。
(3)、存储第二个值
PUT order/_doc/2
{
"totalAmount": 13.3277
}
实际上,ES内部存储的是:
13.3277 * 100(缩放因子) = 1332.77,然后四舍五入得到1333,所以内部真正存储的是1333。
(4)、基于totalAmount条件进行查询匹配
GET order/_search
{
"query": {
"match": {
"totalAmount": 13.3245
}
}
}
查询结果:
"hits" : [
{
"_index" : "order",
"_type" : "_doc",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"totalAmount" : 13.3225
}
}
]
通过查询结果可以看到,通过13.3245查询出了ID为1的文档,实际上ES是将查询条件:13.3245 * 100(缩放因子) = 1332.45,然后四舍五入之后到最近的长值得到1332,这样就能匹配到ID为1的文档。
需要注意的是,虽然ES在内部做了缩放处理,但是查询返回值还是原始值(13.3225)。
GET order/_search
{
"query": {
"match": {
"totalAmount": 13.3267
}
}
}
查询结果:
"hits" : [
{
"_index" : "order",
"_type" : "_doc",
"_id" : "2",
"_score" : 1.0,
"_source" : {
"totalAmount" : 13.3277
}
}
]
通过查询结果可以看到,通过13.3267查询出了ID为2的文档,实际上ES是将查询条件:13.3267 * 100(缩放因子) = 1332.67,然后四舍五入之后到最近的长值得到1333,这样就能匹配到ID为2的文档。
需要注意的是,虽然ES在内部做了缩放处理,但是查询返回值还是原始值(13.3277)。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。