You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Solr嵌套查询中显示匹配子文档的向量距离得分

在Solr嵌套文档查询中保留子文档的KNN匹配得分

核心问题原因

Solr的parent查询默认不会将子文档的原始KNN匹配得分传递到返回的子文档字段中,仅会计算父文档的聚合得分(比如你用的score=max),导致子文档的score字段默认显示为0。

优化解决方案(一步查询实现)

通过自定义子文档返回字段列表和调整查询参数,直接在一次查询中返回带真实得分的子文档,无需分两次查询。

1. 修改查询的fl参数,明确要求返回子文档得分

将原查询中的fl参数修改为:

fl=*,score,[child fl=id,text_piece,embedding,score],[explain style=nl]

关键是给[child]添加fl子参数,明确指定需要返回子文档的score字段,强制Solr将子文档的匹配得分填充到结果中。

2. 调整完整查询语句

结合你的KNN查询需求,最终的完整查询语句如下(修正了原语句的语法问题):

q={!parent which='doc_type:parent' score=max}{!knn f=embedding topK=2}[0.2,0.1,-0.5,...]&fl=*,score,[child fl=id,text_piece,embedding,score],[explain style=nl]

这里的score=max仍负责计算父文档的聚合得分(取匹配子文档的最高得分),同时[child fl=...]确保子文档自身的KNN得分被返回。

3. 验证schema配置(可选)

确保你的schema中,子文档的相关字段(尤其是embedding)已正确配置为支持KNN查询(比如使用VectorField类型),score作为Solr内置字段无需额外定义,只需在[child]的fl中指定即可。

预期返回结果

调整后,匹配的子文档会显示真实的KNN得分,示例如下:

docs: [
{
 "id": 1, 
 "doc_type": "parent",
 "text": "sentence A. sentence B. sentence C. ",
 "children": [
  {"id":2,"text_piece":"sentence A.","score":0.849,"embedding":[...]},
  {"id":3,"text_piece":"sentence B.","score":0.5,"embedding":[...]},
  {"id":4,"text_piece":"sentence C.","score":0.0,"embedding":[...]}
 ],
 "[explain]": {"match": true, "value": 0.849, "description": "Score based on 2 child docs in range from  129 to 130, using score mode Max", "details": [{"match": true, "value": 0.849,"description": "within top 2"}, {"match": true, "value": 0.5,"description": "within top 2"}]}
}
]

方案优势

相比两步查询的方式,该方案:

  • 减少了一次Solr请求,降低网络开销和服务端负载
  • 代码逻辑更简洁,无需额外处理结果合并
  • 避免了两次查询间的数据不一致风险

内容的提问来源于stack exchange,提问作者YPanY

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 17:50:37