Solr子查询fl中使用exists函数查询报错求助
Solr 8.11 Subquery Transformer 添加isSavedEntity字段解决方案
问题原因
你在subquery的fl中使用exists(query($someQuery))的语法不被支持——Solr的subquery transformer上下文无法直接在fl中解析这种嵌套的外部参数引用和exists(query())组合,导致400语法错误。
解决方案
直接在subquery的fl中使用Solr的if+match函数,判断childId是否命中目标列表,生成布尔值字段isSavedEntity,无需依赖外部参数someQuery。
修改后的完整查询示例
q=*:* &fq=category:parent &fl=*, subqueryTransformerName:[subquery] &subqueryTransformerName.q=+{!term f=parentId v=$row.id} childId:(1 2 3) &subqueryTransformerName.fl=*, isSavedEntity:if(match(childId, "1 2 3"), true, false)
方案说明
match(childId, "1 2 3"):判断当前文档的childId是否匹配列表中的任意值,返回布尔值if(...):将匹配结果转换为显式的true/false值,赋值给isSavedEntity字段
备选方案(保留权重提升逻辑)
如果你需要同时保留“保存的子项置顶”的权重提升,只需在subquery的q中继续使用SHOULD加权,fl部分不变:
subqueryTransformerName.q=+{!term f=parentId v=$row.id} (childId:(1 2 3)^100) &subqueryTransformerName.fl=*, isSavedEntity:if(match(childId, "1 2 3"), true, false)
这样既实现了子项权重提升,又能在返回的子文档中正确显示isSavedEntity字段,标识是否为用户保存的内容。
内容的提问来源于stack exchange,提问作者Sina Sarshar Pour
相关产品推荐
相关产品推荐

