Solr创建Schema失败求助:已准备好待索引JSON数据
嘿,我看你在Solr里创建Schema并导入JSON数据的时候栽了跟头,别慌,咱们一步步来搞定它。先瞅一眼你给的JSON数据,都是数字键对应不同类型的值——有日期、字符串、数字,这得针对性地配置Schema才行。
第一步:先搞懂Solr Schema的核心要求
Solr不像NoSQL数据库那样能自动识别字段,必须提前在Schema里定义好每个字段的规则:
- 你JSON里的每个键(比如
122、49)都要对应Schema里的一个<field>节点 - 每个字段要指定匹配的字段类型:日期用日期类型、字符串用字符串类型、数字用对应数值类型,不然Solr不知道怎么处理这些数据
第二步:给你写个适配的Schema示例
下面是针对你提供的JSON数据写的managed-schema(Solr 6+版本常用的Schema文件)示例,你可以直接拿去修改:
<schema name="fix-message-schema" version="1.6"> <!-- 先定义基础字段类型 --> <fieldType name="string" class="solr.StrField" sortMissingLast="true" /> <!-- 自定义日期类型,匹配你数据里的`yyyyMMdd-HH:mm:ss.SSS`格式 --> <fieldType name="custom_date" class="solr.DatePointField" docValues="true"> <analyzer> <tokenizer class="solr.KeywordTokenizerFactory"/> <filter class="solr.DateFormatFilterFactory" format="yyyyMMdd-HH:mm:ss.SSS" /> </analyzer> </fieldType> <fieldType name="int" class="solr.IntPointField" docValues="true" /> <fieldType name="float" class="solr.FloatPointField" docValues="true" /> <!-- 对应你JSON里的所有字段 --> <field name="122" type="custom_date" indexed="true" stored="true" /> <field name="49" type="string" indexed="true" stored="true" /> <field name="382" type="int" indexed="true" stored="true" /> <field name="151" type="float" indexed="true" stored="true" /> <field name="9" type="string" indexed="true" stored="true" /> <field name="10071" type="custom_date" indexed="true" stored="true" /> <field name="15" type="string" indexed="true" stored="true" /> <field name="56" type="string" indexed="true" stored="true" /> <field name="54" type="int" indexed="true" stored="true" /> <field name="10202" type="string" indexed="true" stored="true" /> <field name="10537" type="string" indexed="true" stored="true" /> <field name="10217" type="string" indexed="true" stored="true" /> <field name="48" type="string" indexed="true" stored="true" /> <field name="201" type="int" indexed="true" stored="true" /> <field name="40" type="int" indexed="true" stored="true" /> <field name="8" type="string" indexed="true" stored="true" /> <field name="167" type="string" indexed="true" stored="true" /> <field name="421" type="string" indexed="true" stored="true" /> <field name="10292" type="int" indexed="true" stored="true" /> <field name="10184" type="string" indexed="true" stored="true" /> <field name="456" type="int" indexed="true" stored="true" /> <field name="11210" type="string" indexed="true" stored="true" /> <field name="1133" type="string" indexed="true" stored="true" /> <field name="10515" type="int" indexed="true" stored="true" /> <field name="10" type="int" indexed="true" stored="true" /> <field name="11032" type="int" indexed="true" stored="true" /> <!-- Solr必填的默认字段 --> <field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" /> <field name="_version_" type="plong" indexed="true" stored="true" /> </schema>
⚠️ 注意:你给的JSON里没有id字段,但Solr默认要求id是文档唯一标识且必填。你可以:
- 给每条JSON数据加个
id字段(比如用48字段的值,看起来是唯一的) - 或者把Schema里
id的required属性改成false(不推荐,会影响后续文档的更新/删除)
第三步:正确导入JSON数据
Schema配置好重启Solr后,就可以导入数据了:
- 确保你的JSON数据是每行一个JSON对象(多条数据的情况),或者单个合法的JSON对象(单条数据)
- 用Solr自带的
post工具导入(推荐):
bin/post -c 你的核心名称 path/to/你的数据文件.json
- 或者用
curl命令导入:
curl -X POST -H "Content-Type: application/json" http://localhost:8983/solr/你的核心名称/update --data-binary @path/to/你的数据文件.json
- 最后一定要提交变更,不然数据不会生效:
curl http://localhost:8983/solr/你的核心名称/update?commit=true
第四步:常见问题排查
如果还是报错,先看错误信息对应解决:
- 提示
undefined field:说明你Schema漏定义了某个JSON里的字段,对照着补全就行 - 日期解析错误:检查自定义日期类型的
format是否和你的数据格式完全匹配(比如yyyyMMdd-HH:mm:ss.SSS对应20180320-08:08:35.038) - 数字类型转换错误:如果JSON里的数字是字符串格式(比如
"0"),Solr会自动转成对应数值类型,不用额外处理;如果是纯数字字符串且不需要数值运算,也可以把字段类型设为string
内容的提问来源于stack exchange,提问作者Choix
相关产品推荐
相关产品推荐

