如何在Solr 9中结合过滤查询高效获取相似度分数?
需求场景
我正在使用Solr 9进行查询-文档的最优相似度计算,需求为先筛选特定字段值的文档,再对匹配到的所有文档计算相似度。具体场景为:文档包含embedding(向量字段)和id字段,我只想获取id=1、2、3的文档,给定查询向量后,返回每个目标文档与该查询向量的相似度分数。
尝试的方案
方案1:fq + knn 查询
使用fq筛选指定id,q字段采用knn查询,但受限于Solr当前机制,无法返回所有目标文档。官方给出的限制说明如下:
When using knn in re-ranking pay attention to the topK parameter.
The second pass score(deriving from knn) is calculated only if the document d from the first pass is within the k-nearest neighbors(in the whole index) of the target vector to search.
This means the second pass knn is executed on the whole index anyway, which is a current limitation.
方案2:内存中计算相似度
使用fq筛选指定id,返回结果包含embedding字段,之后在本地内存中计算相似度。但存在网络延迟问题,因为返回的embeddings数据量较大,导致Solr响应体积过大。
问题
- 上述官方提到的KNN重排限制是否会被修复?如果会,预计什么时候解决?
- 有没有办法压缩Solr的响应内容,提升获取速度?
回答
问题1:KNN重排限制的修复情况
目前Solr官方尚未公开明确的修复时间表。该限制源于当前KNN重排的设计逻辑:第二阶段的KNN计算仍会遍历整个索引,仅对第一阶段结果中属于全局TopK的文档计算相似度。若需追踪进度,可关注Solr官方的issue跟踪系统或社区讨论,但截至目前没有确定的发布版本或时间点。
问题2:压缩Solr响应的可行方法
有多种方式可压缩Solr响应、降低传输体积:
- 启用HTTP压缩:在Solr的Jetty配置中开启Gzip或Deflate压缩,现代客户端大多支持自动解压,能大幅缩减JSON/XML格式的响应体积。
- 精简返回字段:仅返回
id和必要字段,避免冗余数据;若采用方案2,仅返回id与embedding字段即可。 - 二进制格式传输向量:若客户端支持,可配置Solr将
embedding字段以二进制格式(如Float32数组的二进制形式)返回,相比JSON序列化的字符串,体积可缩小数倍。 - 分页查询(按需):若后续目标文档数量增加,可通过分页获取数据,减少单次响应的体积。
内容的提问来源于stack exchange,提问作者Noam

