如何为含嵌套对象的JSON文档创建Solr Managed Schema?
如何为带嵌套对象的JSON创建Solr Managed Schema
问题描述
我有一份需要提交至Solr的JSON文档,内容如下:
{ "threadId":"1", "app":"application-name", "server":"server-name", "loggerFqcn":"org.apache.commons.logging.LogAdapter$Log4jLog", "level":"INFO", "endOfBatch":"false", "thrown": { "commonElementCount": 0, "localizedMessage": "private accessor [email]", "message": "private accessor [email]", "name": "org.hibernate.bytecode.internal.bytebuddy.PrivateAccessorException", "extendedStackTrace": "org.hibernate.bytecode.internal.bytebuddy.Priv.." }, "message":"Starting MonitorApiApplication v0.0.1-SNAPSHOT using Java 17.0.8.1 with PID 1 (/opt/app/monitor-api.jar started by root in /opt/app)", "threadPriority":"5", "user":"test", "timeMillis":"1697531693066", "UNIQUE_ID":"e31bbf2c-2b19-4d41-9d4e-ce44c95df667", "_version_":"1779990992732028928", "_root_":"e31bbf2c-2b19-4d41-9d4e-ce44c95df667" }
该文档包含嵌套对象thrown,我需要创建支持嵌套文档的Solr Managed Schema,但在网上未找到相关示例。尝试过Solr Cloud和Schema Designer均无法解决问题,需要帮助。
解决方案
Solr通过点分隔字段名原生支持JSON嵌套对象解析,无需特殊的嵌套文档配置(除非你需要处理父子级关联的嵌套文档,当前场景为扁平嵌套,用点分隔字段即可)。以下是适配你JSON结构的Managed Schema示例:
完整字段配置
在Solr core的managed-schema文件中添加以下配置(或通过Schema API提交):
<!-- 顶层字段定义 --> <field name="threadId" type="string" indexed="true" stored="true"/> <field name="app" type="string" indexed="true" stored="true"/> <field name="server" type="string" indexed="true" stored="true"/> <field name="loggerFqcn" type="string" indexed="true" stored="true"/> <field name="level" type="string" indexed="true" stored="true"/> <field name="endOfBatch" type="boolean" indexed="true" stored="true"/> <field name="message" type="text_general" indexed="true" stored="true"/> <field name="threadPriority" type="int" indexed="true" stored="true"/> <field name="user" type="string" indexed="true" stored="true"/> <field name="timeMillis" type="long" indexed="true" stored="true"/> <field name="UNIQUE_ID" type="string" indexed="true" stored="true" required="true" multiValued="false"/> <field name="_version_" type="long" indexed="true" stored="true"/> <field name="_root_" type="string" indexed="true" stored="true"/> <!-- 嵌套对象thrown的子字段 --> <field name="thrown.commonElementCount" type="int" indexed="true" stored="true"/> <field name="thrown.localizedMessage" type="text_general" indexed="true" stored="true"/> <field name="thrown.message" type="text_general" indexed="true" stored="true"/> <field name="thrown.name" type="string" indexed="true" stored="true"/> <field name="thrown.extendedStackTrace" type="text_general" indexed="true" stored="true"/>
关键说明
- 类型匹配:根据JSON字段的实际数据类型选择Solr内置类型,比如
commonElementCount是整数用int,timeMillis是时间戳用long,文本内容用text_general,布尔值用boolean。 - 嵌套解析逻辑:Solr会自动识别JSON中的嵌套对象,将
thrown.commonElementCount这类路径映射到schema中对应的字段,无需额外插件或配置。 - 动态字段优化(可选):如果后续
thrown可能新增未知子字段,可添加动态字段规则减少重复配置:
注意:动态字段会统一匹配所有<dynamicField name="thrown.*" type="text_general" indexed="true" stored="true"/>thrown.前缀的字段,若子字段类型差异较大,建议还是显式定义每个子字段以保证索引效率。
验证步骤
- 保存配置后重启Solr core。
- 提交你的JSON文档到Solr,通过Admin界面的Query页面,尝试查询
thrown.name:org.hibernate.bytecode.internal.bytebuddy.PrivateAccessorException这类嵌套字段,验证是否正常索引和返回结果。
内容的提问来源于stack exchange,提问作者Kranksw
相关产品推荐
相关产品推荐

