现场是这样的。代码里 search 传 limit=50,返回的 hits 只有 10 条,日志确认参数已传入,服务端 2.4 单机,collection 建的时候没设分片。

中间走过弯路,把「segment 未合并时每个段只回前几条,总数被摊薄」当成主因,改完现象没变。

这类报错背后常见的原因有几处,逐个排除就行。集合的结果窗口受 proxy 配置限制,超出部分直接截断;查询带了 offset,offset 加 limit 超过窗口被截;客户端在收到结果后又按阈值筛了一遍,代码里没注意。

先确认返回条数与 limit 的关系

python -c "from pymilvus import Collection;print(len(Collection('kb').search([[0.1]*8],'emb',{'metric_type':'IP'},limit=50)[0]))"

然后查服务端的结果窗口配置

curl -s http://127.0.0.1:9091/metrics | findstr -i query_result_window

再往下把小集合的 segment 合并后再试

python -c "from pymilvus import Collection;print(Collection('kb').compact())"

剩下的就是对结果去重后统计真实条数

python -c "print(len({1:0.9,2:0.8,3:0.7}))"

怎么算真的好了,看的是同一批现象。同一条查询返回 50 条 hits,去重后仍为 50,日志里 limit 与返回数一致,不再固定 10 条。

这里还有个坑。返回条数被截时先看服务端配置,改客户端参数没用;测试环境数据少,很难发现这个上限。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。

作者 9823189