无法从CSV索引Decimal值:SOLR 6.6.2数据导入异常求助
解决Solr 6.6.2 CSV导入Decimal字段NumberFormatException问题
问题根源
你遇到的问题本质是Price字段被Solr自动推断成了整数类型(比如int/long),当导入带小数的数值时,自然会触发NumberFormatException。Solr 6+默认使用managed-schema(而非旧版的schema.xml)来管理字段,自动字段映射虽然方便,但如果首次导入的是整数,就会把字段类型锁定为整数,后续带小数的数值就无法解析了。
解决方案
下面分两种常用方式帮你修复:
方式一:用Schema API修改字段类型(推荐,Solr 6+官方推荐方式)
先确认当前Price字段的类型:
打开Solr Admin界面,进入你的core,点击左侧菜单的Schema,在Fields搜索框输入Price,就能看到它当前的类型(比如int)。修改字段为支持小数的类型:
发送一个POST请求到你的Solr core的schema接口,比如:curl -X POST -H 'Content-type:application/json' --data-binary '{ "replace-field": { "name": "Price", "type": "pdouble", "stored": true, "indexed": true } }' http://localhost:8983/solr/your-core-name/schemapdouble是Solr内置的精确双精度浮点类型,适合价格这类需要保留小数的场景;- 如果需要更高精度(比如货币计算),可以先自定义一个
DecimalField类型,再修改Price字段:
然后再用curl -X POST -H 'Content-type:application/json' --data-binary '{ "add-field-type": { "name": "currency_decimal", "class": "solr.DecimalField", "precisionStep": "8", "positionIncrementGap": "0" } }' http://localhost:8983/solr/your-core-name/schemareplace-field把Price的类型改成currency_decimal。
重新导入CSV:修改完成后,再导入带小数的Price数据就不会报错了。
方式二:切换回传统的schema.xml(适合习惯旧版操作的用户)
如果你更熟悉Solr 4的schema.xml方式,也可以切换回去:
- 找到你的core目录下的
conf/managed-schema文件,复制一份并重命名为schema.xml; - 打开
solrconfig.xml,找到schemaFactory配置,把默认的ManagedIndexSchemaFactory改成ClassicIndexSchemaFactory:<!-- 注释掉原来的ManagedSchema配置 --> <!-- <schemaFactory class="ManagedIndexSchemaFactory"> <bool name="mutable">true</bool> <str name="managedSchemaResourceName">managed-schema</str> </schemaFactory> --> <!-- 添加ClassicSchema配置 --> <schemaFactory class="ClassicIndexSchemaFactory"/> - 在
schema.xml里找到或添加Price字段的定义,指定支持小数的类型:<field name="Price" type="pdouble" indexed="true" stored="true"/> - 重启Solr服务,然后重新导入CSV即可。
额外提醒
为了避免后续再出现类似问题,建议在首次导入数据前,先手动定义好所有字段的类型(不管用API还是schema.xml),不要依赖Solr的自动推断——自动推断在数据类型复杂时很容易出错。
内容的提问来源于stack exchange,提问作者JGilmartin
相关产品推荐
相关产品推荐

