You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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结果。


排查与解决思路

  • 验证向量数据完整性

    1. 检查存入的embedding是否为长度1536的Float32数组,转换为Buffer后长度应为1536 * 4(每个Float32占4字节),打印Buffer.from(embedding.buffer).length确认。
    2. 确保查询时的embeddingArray不是空数组,且长度严格等于1536,避免因维度不匹配导致查询失败。
  • 索引与键的匹配校验

    1. 用Redis CLI执行KEYS jobs:*,确认存入的键确实以jobs:开头,与索引的PREFIX设置一致。
    2. 对于JSON类型索引,确认schema中的$.embeddings路径与JSON数据中的字段完全匹配(注意大小写、字段名拼写)。
  • 查询语法与参数检查

    1. 尝试将查询的DIALECT改为3,部分Redis Stack版本对DIALECT 2的KNN支持存在兼容问题。
    2. 对比存入时的向量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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 20:12:43