SolrCloud导入文档遇NumberFormatException,字段已设为string类型
嘿,刚看到你的问题,作为Solr新手遇到这种情况确实挺困惑——明明把student_count定义成了string类型,插入2.5却触发了数字格式异常,这大概率是以下几个原因之一,咱们一个个排查:
1. 你的schema.xml可能根本没被SolrCloud加载
现在很多较新的Solr版本默认使用managed-schema而非传统的schema.xml。如果你的SolrCloud集合配置的是ManagedIndexSchemaFactory,那你修改schema.xml的内容完全不会生效——Solr会直接忽略这个文件,转而使用managed-schema里的配置。
怎么确认?打开集合的solrconfig.xml,找到schemaFactory节点:
<schemaFactory class="org.apache.solr.schema.ManagedIndexSchemaFactory"> <bool name="mutable">true</bool> <str name="managedSchemaResourceName">managed-schema</str> </schemaFactory>
如果是上面这样,你有两个选择:
- 把
schemaFactory改成ClassicIndexSchemaFactory(让Solr读取schema.xml):<schemaFactory class="org.apache.solr.schema.ClassicIndexSchemaFactory"/> - 直接在
managed-schema里修改student_count的字段类型为string。
修改后记得重载你的集合——可以用Solr Admin里Core Admin的Reload按钮,或者发送POST /solr/<collection_name>/reload请求。
2. 存在匹配的Dynamic Field覆盖了显式字段
检查你的schema(不管是schema.xml还是managed-schema)里有没有类似这样的动态字段:
<dynamicField name="*_count" type="int" indexed="true" stored="true"/>
虽然显式定义的字段优先级理论上更高,但如果你的显式字段写在动态字段之后,或者动态字段的通配符刚好精准匹配student_count,就可能出现Solr优先使用动态字段的情况。
解决方法:
- 把显式的
student_count字段定义移到所有动态字段之前; - 或者修改动态字段的模式,避免和你的显式字段冲突(比如改成
*_num_count)。
3. 数据导入工具自动推断了字段类型
如果你是用DataImportHandler、CSV导入或其他工具批量导入数据,这些工具可能会自动推断字段类型——比如看到2.5就当成浮点数,尝试以数字类型插入,而非字符串类型。
举个例子,CSV导入时如果没指定字段类型,Solr的CSV解析器会自动推断,这时候你需要强制指定student_count为字符串:
- 在CSV导入请求里添加参数
fieldTypes=student_count:string; - 或者在DataImportHandler的配置文件里,明确把
student_count的类型映射为string。
4. 旧的schema缓存没更新
就算你修改了正确的schema文件,SolrCloud的节点可能还缓存着旧的配置。这时候你需要:
- 先尝试重载整个集合;
- 如果重载没用,重启SolrCloud的所有节点,确保新的schema被加载。
最后再确认下插入数据的格式:比如用JSON提交时,最好显式把student_count的值用引号包裹成字符串,像这样:
{ "student_count": "2.5" }
如果直接写"student_count": 2.5(数字类型),Solr理论上会自动转成字符串,但某些配置(比如字段的validator)可能会阻止这种转换,所以显式传字符串更稳妥。
内容的提问来源于stack exchange,提问作者ProgrammingUnicorn

