Solr如何筛选同时匹配多类子文档的父文档?
Solr 检索同时包含指定子文档的父文档问题解决
需求与数据结构
需要检索同时包含名为'review1'的评论子文档和名为'student1'的学生子文档的图书父文档,使用的嵌套数据结构示例如下:
{ "id": "1", "bookName_s": "Core Concepts", "bookDescription_s": "This is the description", "isbn_s": "ABCD:123", "type_s":"book", "reviews": [ { "id": "2", "Name_s": "review1", "detail_s": "sample review", "type":"review" } ], "students": [ { "id": "3", "Name_s": "student1", "type":"student", "student_s": "test student" } ] }
原方案的问题
最初使用的查询语句:
{!parent which="type:book"}(type:review AND Name_s:review1) OR (type:student AND Name_s:student1)
会返回仅包含review1评论或仅包含student1学生的图书,不符合“同时满足两个条件”的需求。
将OR替换为AND后:
{!parent which="type:book"}(type:review AND Name_s:review1) AND (type:student AND Name_s:student1)
无法得到任何结果——因为该查询会试图寻找单条文档同时具备type=review和type=student、Name_s=review1和Name_s=student1,而这些单值字段不可能同时存储两个不同值。
正确解决方案
要实现“同时包含两种子文档”的需求,需要让Solr分别检查父文档是否包含每个指定子文档,再取两个结果的交集。以下是几种可行的写法:
方法1:用+组合多个parent查询
q=+{!parent which="type_s:book"}(type:review AND Name_s:review1) +{!parent which="type_s:book"}(type:student AND Name_s:student1)
每个{!parent}查询会筛选出包含对应子文档的父文档,+表示必须同时满足两个条件,最终得到同时包含两种子文档的图书。
方法2:用过滤查询(fq)分两次过滤
q=*:* &fq={!parent which="type_s:book"}type:review AND Name_s:review1 &fq={!parent which="type_s:book"}type:student AND Name_s:student1
两个fq分别过滤出包含对应子文档的父文档集合,Solr会自动取两个集合的交集,最终得到符合要求的结果。
方法3:嵌套parent查询
{!parent which="type_s:book"}type:review AND Name_s:review1 AND {!parent which="type_s:book"}type:student AND Name_s:student1
原理和方法1一致,通过AND组合两个独立的parent查询,确保父文档同时满足两个子条件。
内容的提问来源于stack exchange,提问作者Frank
相关产品推荐
相关产品推荐

