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

如何在Redis向量数据库中执行批量搜索?

Redis向量数据库批量KNN搜索实现方案

直接传入向量列表的批量搜索方式目前不可行,Redis Stack的Search命令(以及redis-py的封装)本身不支持单次请求中传入多个向量执行多轮KNN搜索。以下是两种可行的替代实现方案:

方案1:用Pipeline批量执行搜索请求

借助redis-py的Pipeline功能,把多个搜索请求打包成批量操作,能有效减少网络往返开销,这是最直接的解决方案。

示例代码:

import redis
import numpy as np
from redis.commands.search.query import Query

VECTOR_DIMENSIONS = 128
INDEX_NAME = "my_vector_index"

client = redis.Redis(host="localhost", port=6379, decode_responses=True)

# 准备多个查询向量
query_vectors = [
    np.random.rand(VECTOR_DIMENSIONS).astype(np.float32).tobytes(),
    np.random.rand(VECTOR_DIMENSIONS).astype(np.float32).tobytes()
]

# 创建Pipeline对象
pipe = client.pipeline()

# 给每个向量添加对应的搜索命令
for vec in query_vectors:
    query = (
        Query("*=>[KNN 2 @vector $vec as score]")
        .sort_by("score")
        .return_fields("id", "score")
        .paging(0, 2)
        .dialect(2)
    )
    pipe.ft(INDEX_NAME).search(query, {"vec": vec})

# 执行批量请求并获取所有结果
results = pipe.execute()

# 遍历处理每个向量的搜索结果
for idx, result in enumerate(results):
    print(f"第{idx+1}个向量的搜索结果:")
    for doc in result.docs:
        print(f"id: {doc.id}, score: {doc.score}")

方案2:用Redis Lua脚本实现(进阶)

如果追求更高的执行效率,可以编写Lua脚本在Redis服务器端直接执行多轮KNN搜索,进一步降低网络传输带来的延迟。

示例Lua脚本:

local index_name = KEYS[1]
local vector_list = ARGV
local results = {}

for i, vec in ipairs(vector_list) do
    -- 构建并执行FT.SEARCH命令
    local resp = redis.call("FT.SEARCH", index_name, "*=>[KNN 2 @vector $vec as score]",
        "SORTBY", "score",
        "RETURN", "2", "id", "score",
        "LIMIT", "0", "2",
        "DIALECT", "2",
        "PARAMS", "2", "vec", vec)
    table.insert(results, resp)
end

return results

Python调用示例:

# 注册并执行Lua脚本
lua_script = """
local index_name = KEYS[1]
local vector_list = ARGV
local results = {}

for i, vec in ipairs(vector_list) do
    local resp = redis.call("FT.SEARCH", index_name, "*=>[KNN 2 @vector $vec as score]",
        "SORTBY", "score",
        "RETURN", "2", "id", "score",
        "LIMIT", "0", "2",
        "DIALECT", "2",
        "PARAMS", "2", "vec", vec)
    table.insert(results, resp)
end

return results
"""

script = client.register_script(lua_script)
results = script(keys=[INDEX_NAME], args=query_vectors)

补充说明

  • Pipeline是将多个请求打包发送,Redis会逐个执行,但能避免多次网络请求的延迟损耗。
  • Lua脚本在Redis服务器端运行,性能更优,但要注意脚本的执行时长,避免影响Redis的正常服务。
  • 当前Redis Stack(含RediSearch模块)暂不支持单次FT.SEARCH命令传入多向量执行批量KNN搜索,后续版本可能会新增相关功能,可关注官方更新。

内容的提问来源于stack exchange,提问作者gu1show

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 05:17:20