Solr 8.8.1 嵌套文档搜索如何仅返回顶层父记录?
Solr父子文档检索仅返回父记录实现方案
核心查询实现
你已经通过solr_type字段标记父子文档的方案完全可用,无需额外调整nest_path相关配置,直接使用Solr内置的父文档查询语法即可实现需求:
- 核心逻辑:查询同时覆盖父文档自身匹配、子文档匹配返回对应父文档两种场景,最终过滤返回结果仅保留父文档
- 基础查询语法:
# 你的搜索条件可以替换为任意查询表达式,比如多字段匹配、范围查询等 q=(solr_type:parent AND [你的搜索条件]) OR {!parent which="solr_type:parent"}([你的搜索条件]) # 加过滤query双重保证返回结果仅为父文档 fq=solr_type:parent
示例查询
比如你需要搜索所有标题包含「CR」的内容,仅返回顶层父记录,完整请求参数如下:
q=(solr_type:parent AND dc_title_s:*CR*) OR {!parent which="solr_type:parent"}(dc_title_s:*CR*) fq=solr_type:parent wt=json indent=true
如果你需要在返回的父文档中附带匹配到的子文档内容,可在参数中新增返回字段配置:fl=*,[child parentFilter="solr_type:parent"]
优化建议
- 如果需要搜索的字段较多,建议提前在schema中配置copyField,将所有需要检索的字段统一拷贝到一个text类型的通用搜索字段,简化查询语句:
<field name="text" type="text_general" indexed="true" stored="false" multiValued="true"/> <copyField source="dc_*" dest="text"/>
配置后查询语句可以直接简化为:q=(solr_type:parent AND text:你的关键词) OR {!parent which="solr_type:parent"}(text:你的关键词)
- 父子文档索引时确保同一层级的父子文档
_root_字段值一致,Solr默认会为同批提交的父子文档自动填充该值,若父子文档分开提交需手动指定子文档的_root_为对应父文档的唯一键值。
内容的提问来源于stack exchange,提问作者Kevin
相关产品推荐
相关产品推荐

