现场是这样的。Weaviate 1.25.4 单节点,class Product 开了 multiTenancy,Python client v4 写入时指定 tenant_a,查询没带 tenant 直接报 class Product not found,换 REST 也一样。

中间走过弯路,把「集合名大小写与建表时不一致,服务端按区分大小写匹配」当成主因,改完现象没变。

真正麻烦的地方在于,几个原因的现象几乎一样。多租户 class 的查询必须显式给 tenant,默认没有全局视图;client v4 的参数名写成了 tenant 而不是 tenants;数据写在 tenant_a 分片,聚合查询在 1.25 里不跨租户。

第一件事是列出所有 class 名核对拼写

curl -s localhost:8080/v1/schema | jq -r '.classes[].class'

接着查该 class 下的租户列表

curl -s localhost:8080/v1/schema/Product/tenants | jq -r '.tenants[].name'

带 tenant 查询一条聚合

python -c "import weaviate;c=weaviate.connect_to_local();col=c.collections.get('Product').with_tenant('tenant_a');print(col.aggregate.over_all(total_count=True))"

末了换另一个租户对比数据

python query.py --class Product --tenant tenant_b --limit 5

改之前先确认了最近有没有人动过配置,避免白查一遍。

别只看报错消失,验证要多做一步。同一 query 能返回 tenant_a 下的 5 条记录,切到 tenant_b 拿到另一批,两边数据互不串。

多租户不是权限隔离,tenant 参数写错照样能查到别人的数据,业务层还得再加一层校验。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。

作者 9823189