0

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

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

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

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

所以,对于这些领域中的每一个,我都有类似的东西:

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

我尝试了各种不同的组合,将它们存储为“文本”不允许我随意查询它们,如果我不定义映射,我会得到字段的“长”类型,这会截断它们,如果我使用 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

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

4

3 回答 3

1

更新:

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

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

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

于 2020-12-14T18:03:28.150 回答
0

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

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

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

我会保持这个线程更新,看看是否有效。

于 2020-12-14T17:22:12.323 回答
0

我不熟悉节点客户端库,但在弹性搜索中,错误表示 -

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 进行了重大更改。请参阅此以了解有关删除映射类型的更多信息。

于 2020-12-14T17:26:00.640 回答