使用节点客户端库在Elasticsearch中插入数字(浮点)



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

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

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

我不能在ES中的映射中使用文本,因为我显然想对这些字段进行数学运算。所以我对上面的所有内容都使用了一个"float"映射。

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

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

我已经尝试了各种不同的组合,将它们存储为"text"不允许我按照自己的意愿查询它们,如果我不定义映射,我会为字段指定一个"long"类型,这会截断它们。如果我使用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

非常感谢您的帮助,谢谢。

更新:

scaled_floot对我来说不太好用,所以我最终做了这个";条纹方式";

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

也用过这个https://currency.js.org/以确保乘法和输出不会受到JS中浮点的"众所周知"问题的影响。

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

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

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

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

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

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

最新更新