搜索子文档时关联返回父文档详情并按得分排序的实现咨询
实现方案
方案1(基于Solr嵌套文档,你当前使用的_childDocuments_是Solr原生嵌套结构)
- 第一步:确保你的Solr schema已开启嵌套文档支持,不需要额外冗余字段,父文档更新时直接修改user文档即可,子文档无需任何变动,完全解决你担心的用户信息更新维护成本问题。
- 第二步:搜索时使用Block Join子查询语法,关键词匹配子文档的title字段:
其中q={!child of="type:user" score=max}title:"best phone"score=max表示父文档得分取关联子文档的最高匹配得分,保证排序准确性。 - 第三步:配置返回字段,仅返回匹配搜索条件的子文档,避免返回父文档下所有子文档:
fl=id,type,name,rating,[child childFilter="title:'best phone'"] - 第四步:排序默认按搜索得分降序即可,如果你需要结合用户rating调整排序权重,可以修改查询语句加入函数得分:
可以自定义权重系数调整排序逻辑,完全符合你给出的预期返回结果顺序。q={!func}({!child of="type:user" v="title:'best phone'"^2} + rating^0.5)
方案2(基于Elasticsearch父子文档)
如果你用的是Elasticsearch,用join类型实现:
- 第一步:在mapping中配置join字段,指定user为父类型,product为子类型
- 第二步:使用has_child查询匹配product的title,搭配inner_hits返回匹配的子文档:
{ "query": { "has_child": { "type": "product", "query": { "match": { "title": "best phone" } }, "inner_hits": {}, "score_mode": "max" } } } - 第三步:排序默认按查询得分即可,也可以自定义function_score结合父文档的rating字段调整排序。
两种方案都不需要在product中冗余存储user信息,用户更新姓名、评分等字段时,仅需要更新对应的user父文档,所有关联的product子文档会自动关联最新的父文档信息,维护成本为0。
内容的提问来源于stack exchange,提问作者alx
相关产品推荐
相关产品推荐

