Apache Solr复杂对象列表反序列化问题解决方案咨询
解决Solr返回扁平化嵌套结构的问题
嘿,作为Solr新手碰到这种嵌套对象列表被扁平化的问题太常见了!别担心,我给你几个实用的解决方案,你可以根据自己的需求来选:
1. 用Solr的嵌套文档(Nested Documents)特性
这是最推荐的方案,适合需要对嵌套字段做查询的场景。Solr支持父子文档结构,能帮你保留原有的层级关系:
- 首先在你的schema里添加
_root_字段(如果还没有的话):<field name="_root_" type="string" indexed="true" stored="false"/> - 索引文档时,把嵌套的子对象拆成独立的子文档,通过
_root_字段关联到父文档。比如你的示例文档可以写成:[ { "id": "parent1", "PropA": "AnyValue", "_root_": "parent1" }, { "id": "child1", "PropB_p1": "v1", "PropB_p2": "v2", "_root_": "parent1", "_childDocuments_": [] }, { "id": "child2", "PropB_p1": "v3", "PropB_p2": "v4", "_root_": "parent1", "_childDocuments_": [] }, // PropC的子文档同理 ] - 查询时,你可以用
{!child of="_root_:parent1"}来获取子文档,或者使用expand=true参数让Solr返回包含子文档的嵌套结构,这样反序列化时就能轻松还原原有的对象列表了。
2. 将嵌套结构序列化为JSON字符串存储
如果不需要对嵌套里的字段单独做查询,这个方法最简单:
- 把
PropB和PropC直接序列化成JSON字符串,比如:{ "PropA": "AnyValue", "PropB": "[{\"p1\":\"v1\",\"p2\":\"v2\"}, {\"p1\":\"v3\",\"p2\":\"v4\"}]", "PropC": "[{\"p1\":\"v1\",\"p2\":\"v2\"}, {\"p1\":\"v3\",\"p2\":\"v4\"}]" } - 在schema里把
PropB和PropC的字段类型设为string(不需要分词的话)或者text_general。这样Solr返回时会直接给你完整的JSON字符串,你拿到后自己反序列化就能还原成对象列表了。
3. 自定义Response Writer控制返回格式
Solr允许你自定义响应的输出格式,你可以配置一个能保留嵌套结构的JSON Writer:
- 打开
solrconfig.xml,添加一个自定义的JSON Writer配置,比如:<queryResponseWriter name="nested_json" class="org.apache.solr.response.JSONResponseWriter"> <lst name="defaults"> <str name="json.nl">arrarr</str> </lst> </queryResponseWriter> - 查询时指定
wt=nested_json参数,Solr就会以嵌套数组的形式返回你的列表字段,而不是扁平化的多值字段。不过这个方法需要你对Solr的配置有一点了解,适合有一定配置经验的场景。
4. 查询后自行组装结构
如果上面的方法都不想用,你也可以在拿到Solr返回的扁平化数据后,自己在代码里组装成原有的嵌套结构。比如遍历PropB.p1和PropB.p2的数组,把对应位置的元素组合成对象,再放到列表里。这个方法虽然麻烦,但不需要改Solr的配置,适合临时救急的场景。
内容的提问来源于stack exchange,提问作者Flavio CF Oliveira
相关产品推荐
相关产品推荐

