如何在elasticsearch中存钱

sti*_*ity 9 python elasticsearch

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

GET catalog/product/_search
{
  "filter": {
    "range": {
      "price": {
        "from": 230.0,
        "to": 300.0
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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

The*_*Ham 16

在较新的版本(检查5.0),可能是最好的选择是使用scaled_floatscaling_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
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

你可以在这里找到他们的文档.


Ant*_*t P 10

发生这种情况是因为ElasticSearch没有小数或货币的内置类型,因此您的值很可能被转换为a float并且遭受浮点精度问题.

您应该能够通过简单地将值存储为long(例如,美分数而不是美元数)并转换为decimal应用程序端和从应用程序端转换来解决此问题.

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