我创建了一个弹性搜索索引,我当前的映射将一个项目的美元金额存储为字符串。这被证明是困难的,因为我无法正确搜索/过滤此值。
GET catalog/product/_search
{
"filter": {
"range": {
"price": {
"from": 230.0,
"to": 300.0
}
}
}
}
将价格映射为字符串。我使用了一个字符串,因为从python十进制值开始,我遇到了这个值突然变为17.989999999999999999998789之类的值的问题。这种情况有时只会发生,但我不想进入从python十进制到java double / float的问题(所以我只是str()事情)。
对更好的方法有何看法?我应该咬紧牙关并将价格映射到双倍或浮动?
答案 0 :(得分:16)
在较新版本(已检查为5.0)中,最好的选择是在scaling_factor = 100
中使用PUT my_index
{
"mappings": {
"my_type": {
"properties": {
"number_of_bytes": {
"type": "integer"
},
"time_in_seconds": {
"type": "float"
},
"price": {
"type": "scaled_float",
"scaling_factor": 100
}
}
}
}
}
,例如:
List<FileItem> items = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request);
for (FileItem item : items) {
//handling...
}
你可以在这里找到他们的doc。
答案 1 :(得分:10)
这是因为ElasticSearch没有小数或货币的内置类型,因此您的值可能会转换为float
,并且会遇到浮点精度问题。
您应该能够通过简单地将值存储为long
(例如,分数而不是美元)以及转换到decimal
应用程序端来实现此目的。
由于您只对已经枚举的值进行此转换,因此性能影响应该可以忽略不计。