如何通过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]
解决方案
修正请求实体的JSON格式
你当前用Arrays.asList(customerFeedJson).toString()把JSON字符串转成了列表的字符串形式,这会破坏原始JSON结构,导致Solr无法解析嵌套的Map内容。直接使用原始的customerFeedJson作为请求体即可:HttpEntity<String> requestEntity = new HttpEntity<>(customerFeedJson);调整Solr字段注解配置
@Indexed("orders_*")的写法不符合SolrJ对Map字段的处理逻辑,改为直接指定字段映射规则,或者将@Field注解的child=true配合明确的动态字段使用。- 对于混合了数值和对象的Map结构,SolrJ的解析逻辑会受限,建议拆分数据结构,避免同一Map中存在不同类型的value。
验证Solr Schema配置
确保你的Solr schema中存在支持嵌套结构的动态字段定义,比如:<dynamicField name="orders_*" type="string" indexed="true" stored="true"/> <!-- 若需存储嵌套对象,需确保schema支持嵌套文档,比如启用`_childDocuments_`相关配置 -->优化数据结构(推荐)
将混合类型的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
相关产品推荐
相关产品推荐

