如何在elasticsearch中存储资金

2024-06-06 01:28:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经创建了一个elasticsearch索引,并且我当前的映射将一个项目的美元金额存储为字符串。事实证明这很困难,因为我无法正确搜索/筛选此值。

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

价格映射为字符串。我使用了一个字符串,因为从python十进制值开始,我遇到了这样的问题:这个值突然得到17.98999999999999998789这样的值。这种情况有时才发生,但我不想讨论从python十进制到java double/float的问题(所以我只是str()这个东西)。

对更好的方法有什么想法吗?我应该咬紧牙关把价格定在双倍还是浮动?


Tags: to项目字符串fromsearchget情况range
2条回答

发生这种情况的原因是ElasticSearch没有用于小数或货币的内置类型,因此您的值很可能被转换为float,并遇到浮点精度问题。

您只需将值存储为long(例如,美分数而不是美元数)并转换到decimal应用程序端,就可以绕过这个问题。

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

在较新版本(选中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
        }
      }
    }
  }
}

你可以在这里找到他们的doc

相关问题 更多 >