【问题标题】:Inserting numbers (floats) in Elasticsearch with the node client library使用节点客户端库在 Elasticsearch 中插入数字(浮点数)
【发布时间】:2021-03-25 08:12:53
【问题描述】:

我正在尝试将文档插入 Elasticsearch,它们的格式如下:

  {
  total: 1,
  subtotal: 1.2,
  totalDiscount: 0}

我遇到的问题是零,在 JavaScript 中,您不能强制将“0”表示为“0.0”或“0.00”。

我不能在 ES 的映射中使用文本,因为我显然想对这些字段进行数学运算。因此,我对上述所有内容都使用了“浮点”映射。

因此,对于每个字段,我都有类似的内容:

"subtotal": {
   "type": "float"
   },

我尝试了各种不同的组合,将它们存储为“文本”不允许我随意查询它们,如果我不定义映射,我会得到字段的“长”类型,即截断它们,如果我使用浮点数,我会得到一个异常mapper [totalDiscount] cannot be changed from type [float] to [long],如果我完全删除它们,所以跳过保存我也会得到一个错误

Rejecting mapping update to [...] as the final mapping would have more than 1 type

非常感谢任何帮助,谢谢。

【问题讨论】:

    标签: javascript node.js elasticsearch elasticsearch.js


    【解决方案1】:

    更新:

    scaled_float 对我来说效果不佳,所以我最终采用了这种“条纹方式”

    即以美分表示所有货币金额,安全,磁盘空间更少,无需定义映射即可工作。

    还使用https://currency.js.org/ 来确保乘法和输出不会受到 JS 中浮点数的“众所周知”问题的影响。

    【讨论】:

      【解决方案2】:

      因为这可能对阅读的人有用,我认为答案可能是使用这种映射:

      "price": {
      "type": "scaled_float",
      "scaling_factor": 100
      }
      

      不仅磁盘效率更高,而且不会出现上述问题。

      我会不断更新这个帖子,看看它是否有效。

      【讨论】:

        【解决方案3】:

        我对节点客户端库不熟悉,但是在elasticsearch中,错误表示-

        mapper [totalDiscount] cannot be changed from type [float] to [long]
        

        从上述错误来看,似乎在创建索引时,totalDiscount 字段是使用 float 字段数据类型定义的,而现在您将其更改为 long 数据类型。这是不可能的,这就是抛出上述错误的原因。

        Rejecting mapping update to [...] as the final mapping would have more than 1 type
        

        出现此错误的原因是 7.0 中的 API 已弃用类型,并对索引创建、放置映射、获取映射、放置模板、获取模板和获取字段映射 API 进行了重大更改。请参阅此以了解有关removal of mapping types 的更多信息。

        【讨论】:

        • 我在那个索引上肯定没有类型,因为它是刚刚创建的!
        猜你喜欢
        • 1970-01-01
        • 2017-02-12
        • 2018-04-27
        • 2016-02-20
        • 2014-08-09
        • 2015-09-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多