如何在elasticsearch中存钱

时间:2015-06-10 20:52:29

标签: python elasticsearch

我创建了一个弹性搜索索引,我当前的映射将一个项目的美元金额存储为字符串。这被证明是困难的,因为我无法正确搜索/过滤此值。

GET catalog/product/_search
{
  "filter": {
    "range": {
      "price": {
        "from": 230.0,
        "to": 300.0
      }
    }
  }
}

将价格映射为字符串。我使用了一个字符串,因为从python十进制值开始,我遇到了这个值突然变为17.989999999999999999998789之类的值的问题。这种情况有时只会发生,但我不想进入从python十进制到java double / float的问题(所以我只是str()事情)。

对更好的方法有何看法?我应该咬紧牙关并将价格映射到双倍或浮动?

2 个答案:

答案 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应用程序端来实现此目的。

由于您只对已经枚举的值进行此转换,因此性能影响应该可以忽略不计。