Solr 9.4稠密向量KNN查询返回错误点积/余弦值问题
Solr 9.4 KNN查询点积分数异常的原因与解决方法
问题原因
KNN查询返回的分数并非原始点积值,而是经过线性变换后的结果。这是Lucene HNSW索引处理点积相似度时的内部逻辑:为了将点积的取值范围(负无穷到正无穷)转换为适合索引存储的非负距离范围,会对原始点积做如下变换:
返回分数 = (原始点积 + 1) / 2
代入你的理论点积值验证:(0.92582 + 1) / 2 = 0.96291,和你得到的0.96291006完全匹配(浮点精度差异可忽略)。而流式表达式的dotProduct函数是直接计算原始点积,没有应用该变换,所以结果正确。
解决方法
方法1:用vectorSimilarity函数直接获取原始点积
在KNN查询的fl参数中,通过vectorSimilarity函数实时计算原始点积值,示例查询:
curl -X GET 'http://localhost:8983/solr/documents/select' \ --data-urlencode 'q={!knn f=vector topK=1}[0.26726124,0.53452248,0.80178373]' \ --data-urlencode 'fl=*,score,raw_dot_product:vectorSimilarity(vector, "[0.26726124,0.53452248,0.80178373]", "dot_product")'
返回结果中的raw_dot_product字段即为正确的原始点积值0.92582。
方法2:对返回分数反向变换还原原始点积
如果不想额外计算,可通过公式将KNN返回的分数还原为原始点积:
原始点积 = 2 * KNN返回分数 - 1
代入你的返回分数0.96291006,计算得:2*0.96291006 -1 = 0.92582012,与理论值一致。
内容的提问来源于stack exchange,提问作者H4kim
相关产品推荐
相关产品推荐

