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

如何通过Spring Data Solr将子列表数据完整写入Solr

问题:Solr仅索引Map中的单个字段,如何完整索引所有数据

原始数据

"orders":{    
    "placed_orders_count":2,    
    "0":{        
        "order_id":"000000001",        
        "order_date":"2019-03-27 14:25:03"    
    },    
    "1":{        
        "order_id":"000000002",        
        "order_date":"2019-03-27 14:25:03"    
    }    
}

尝试的代码

String customerFeedJson = new Gson().toJson(customerFeedsolr.getOrders());
String solrUrl = solrServerUrl.concat(customerFeedPrefix).concat(Constants.HYPHEN).concat(String.valueOf(siteID))
                        .concat(Constants.SOLR_URL_QUERIES);
HttpEntity<String> requestEntity = new HttpEntity<String>(Arrays.asList(customerFeedJson).toString());
restTemplate.exchange(solrUrl, HttpMethod.POST, requestEntity, String.class);

Solr字段配置

public class CustomerFeedSolr {

    @Indexed("orders_*")
    @Field(child = true)
    private Map<String, ?> orders;
//Getters and Setters
}

索引结果对比

期望结果

"placed_orders_count":[2.0],
 "0":[    
    "order_id":"000000001",    
    "order_date":"2019-03-27 14:25:03" 
 ],
  "1":[    
    "order_id":"000000002",    
    "order_date":"2019-03-27 14:25:03" 
 ]

实际结果

"placed_orders_count":[2.0]

解决方案

  1. 修正请求实体的JSON格式
    你当前用Arrays.asList(customerFeedJson).toString()把JSON字符串转成了列表的字符串形式,这会破坏原始JSON结构,导致Solr无法解析嵌套的Map内容。直接使用原始的customerFeedJson作为请求体即可:

    HttpEntity<String> requestEntity = new HttpEntity<>(customerFeedJson);
    
  2. 调整Solr字段注解配置

    • @Indexed("orders_*")的写法不符合SolrJ对Map字段的处理逻辑,改为直接指定字段映射规则,或者将@Field注解的child=true配合明确的动态字段使用。
    • 对于混合了数值和对象的Map结构,SolrJ的解析逻辑会受限,建议拆分数据结构,避免同一Map中存在不同类型的value。
  3. 验证Solr Schema配置
    确保你的Solr schema中存在支持嵌套结构的动态字段定义,比如:

    <dynamicField name="orders_*" type="string" indexed="true" stored="true"/>
    <!-- 若需存储嵌套对象,需确保schema支持嵌套文档,比如启用`_childDocuments_`相关配置 -->
    
  4. 优化数据结构(推荐)
    将混合类型的Map拆分为清晰的实体类结构,让SolrJ能准确映射所有字段:

    public class CustomerFeedSolr {
        @Field("placed_orders_count")
        private int placedOrdersCount;
        
        @Field(child = true)
        private List<Order> orders;
        // Getters and Setters
    }
    
    public class Order {
        @Field("order_id")
        private String orderId;
        @Field("order_date")
        private String orderDate;
        // Getters and Setters
    }
    

    这种结构能避免Map混合数据类型导致的解析问题,同时让Solr的索引逻辑更清晰。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 01:45:32