我正试图将文档插入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的更改。请参阅此以了解有关删除映射类型的更多信息。