使用Redis作为向量数据库时向量搜索无结果的求助
Redis向量搜索查询返回0结果的排查与解决
我正尝试按照Redis官方文档示例,用TypeScript计算两个嵌入数组的距离。已成功创建索引并加载数据,但无论如何查询Redis,都返回0条结果。
使用JSON键
简化代码如下:
const INDEX_NAME = 'idx:jobs'; const client = createClient({ socket: { host: 'cache', port: 6379, // Number.parseInt(REDIS_PORT, 10), connectTimeout: 10000, // tls: true, }, }); const schema: RediSearchSchema = { '$.title': { type: SchemaFieldTypes.TEXT }, '$.document': { type: SchemaFieldTypes.TEXT }, '$.embeddings': { type: SchemaFieldTypes.VECTOR, DIM: 1536, DISTANCE_METRIC: 'COSINE', ALGORITHM: VectorAlgorithms.FLAT, TYPE: 'FLOAT32' } } client.on('error', (error) => { console.error('Redis error', { error }); client.disconnect(); }); app.listen(port, async () => { await client.connect(); await client.ft.create(INDEX_NAME, schema, { PREFIX: 'jobs:', ON: 'JSON' }); const id1 = randomUUID(); await client.json.SET(`jobs:${id1}`, '.', { title: 'dummy1', document: 'test stuff', embeddings: embedding }); const id2 = randomUUID(); await client.json.SET(`jobs:${id2}`, '.', { title: 'dummy', document: 'test stuff', embeddings: embedding }); const id3 = randomUUID(); await client.json.SET(`jobs:${id3}`, '.', { title: 'dummy', document: 'test stuff', embeddings: embedding }); console.log(`Server is running at http://localhost:${port}`, client.isReady); });
使用KNN方法查询:
const embeddingArray = []; // 实际为长度1536的浮点数数组 const embeddings = new Float32Array(embeddingArray); const result = await client.ft.search( INDEX_NAME, '(*)=>([KNN 3 @embeddings $query_vector AS vector_score])', { DIALECT: 2, RETURN: ['vector_score', 'title', 'document'], PARAMS: { 'query_vector': Buffer.from(embeddings.buffer), }, } );
使用Hash键
尝试Redis Stack UI中的Hash键示例,修改存入逻辑:
await client.hSet(`jobs:${id1}`, { title: 'dummy1', document: 'test stuff', embeddings: Buffer.from((new Float32Array(embedding)).buffer) });
同时将索引设置为ON: 'HASH',查询方式不变,仍返回0结果。
排查与解决思路
验证向量数据完整性
- 检查存入的
embedding是否为长度1536的Float32数组,转换为Buffer后长度应为1536 * 4(每个Float32占4字节),打印Buffer.from(embedding.buffer).length确认。 - 确保查询时的
embeddingArray不是空数组,且长度严格等于1536,避免因维度不匹配导致查询失败。
- 检查存入的
索引与键的匹配校验
- 用Redis CLI执行
KEYS jobs:*,确认存入的键确实以jobs:开头,与索引的PREFIX设置一致。 - 对于JSON类型索引,确认schema中的
$.embeddings路径与JSON数据中的字段完全匹配(注意大小写、字段名拼写)。
- 用Redis CLI执行
查询语法与参数检查
- 尝试将查询的
DIALECT改为3,部分Redis Stack版本对DIALECT 2的KNN支持存在兼容问题。 - 对比存入时的向量Buffer与查询时的Buffer,确保二进制数据完全一致,可打印两者的前8字节进行比对。
- 尝试将查询的
手动测试验证
在Redis CLI中执行手动查询,排除代码封装的问题:FT.SEARCH idx:jobs "(*)=>[KNN 3 @embeddings $query_vector AS vector_score]" DIALECT 3 RETURN 3 vector_score title document PARAMS 2 query_vector "<你的向量Buffer十六进制字符串>"也可以用相同的向量存入再查询,验证索引逻辑是否正常。
Hash类型额外注意点
用HGET jobs:<id> embeddings查看Hash字段值,确认存储的是二进制数据而非字符串化的Buffer。
内容的提问来源于stack exchange,提问作者Jesus Diaz Rivero
相关产品推荐
相关产品推荐

