You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为含嵌套对象的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"/>

关键说明

  1. 类型匹配:根据JSON字段的实际数据类型选择Solr内置类型,比如commonElementCount是整数用int,timeMillis是时间戳用long,文本内容用text_general,布尔值用boolean。
  2. 嵌套解析逻辑:Solr会自动识别JSON中的嵌套对象,将thrown.commonElementCount这类路径映射到schema中对应的字段,无需额外插件或配置。
  3. 动态字段优化(可选):如果后续thrown可能新增未知子字段,可添加动态字段规则减少重复配置:
    <dynamicField name="thrown.*" type="text_general" indexed="true" stored="true"/>
    
    注意:动态字段会统一匹配所有thrown.前缀的字段,若子字段类型差异较大,建议还是显式定义每个子字段以保证索引效率。

验证步骤

  1. 保存配置后重启Solr core。
  2. 提交你的JSON文档到Solr,通过Admin界面的Query页面,尝试查询thrown.name:org.hibernate.bytecode.internal.bytebuddy.PrivateAccessorException这类嵌套字段,验证是否正常索引和返回结果。

内容的提问来源于stack exchange,提问作者Kranksw

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 11:47:12