ELK系列(4) - Elasticsearch cannot write xcontent for unknown value of type class java.math.BigDecimal
目录
问题与分析
在使用Elasticsearch进行index数据时,发现报错如下:
|
|
从异常信息看,显然ES无法接受BigDecimal类型,经过百度,也确实如此。在一篇博文评论中解释如下:
应该是客户端代码里将查询的数值定义成了java.math.BigDecimal,而ES不支持这个类型。之所以2.2没有问题,是因为之前的transport client发送数据之前将其序列化成了json,而在5.x以后,使用的内部的transport protocol,数据类型如果不匹配会抛错误。
所以数据类型的定义上,需要使用ES支持的类型。
解决方案
方案一:转变成其他ES支持的数据类型
我使用的是6.4.2版本的Elasticsearch,该版本尚不支持BigDecimal或者BigInteger的数据类型,所以在index到Elasticsearch之前,需要转换成其他数据类型,这里要注意不要数据溢出了:
- BigDecimal要转变成Double类型
- BigInteger要转变成Long类型
方案二:使用更高版本的ES
我在看6.7.1版本的Elasticsearch源码时发现已经可以支持BigDecimal或者BigInteger的数据类型了,所以直接使用该版本或更高版本的就行了。
下面附上两个版本的支持的数据类型的源码:
- 6.4.2版本的Elasticsearch相关源码
|
|
- 6.7.1版本的Elasticsearch相关源码
|
|
可以发现,在6.7.1版本的源码里,多出了最后的两种数据类型的支持:BigInteger和BigDecimal。
参考链接
警告
本文最后更新于 May 12, 2019,文中内容可能已过时,请谨慎使用。