我正在尝试将文档插入到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
任何帮助都非常感谢,谢谢。
发布于 2020-12-15 02:03:28
更新:
scaled_float对我来说不是很好,所以我最终采用了这种“条纹方式”。
也就是说,以美分表示所有的货币金额,安全,磁盘上的空间更少,不需要定义映射。
我还使用了这个https://currency.js.org/来确保乘法和输出不会受到JS中浮点数的“众所周知”问题的影响。
发布于 2020-12-15 01:22:12
由于这可能对阅读的人有用,我认为答案可能是使用这种映射:
"price": {
"type": "scaled_float",
"scaling_factor": 100
}不仅磁盘效率更高,而且不会出现上述问题。
我会让这个线程保持更新,看看是否能正常工作。
发布于 2020-12-15 01:26:01
我不熟悉节点客户端库,但在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中不推荐使用类型,并对索引创建、put映射、get映射、put模板、get模板和get字段映射API进行了破坏性更改。请参阅此处了解有关removal of mapping types的更多信息。
https://stackoverflow.com/questions/65293248
复制相似问题