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

AWS MemoryDB向量检索结合JSON字段过滤失效问题咨询

问题解答

需求可行性确认

AWS MemoryDB 7.1(启用RedisSearch)完全支持向量相似检索结合JSON元数据前置过滤,无需手动后置处理。不管是标签型字段(如tenant)还是数值型字段,都能在索引阶段将嵌套JSON字段提取为可检索的索引字段,检索时结合KNN向量查询完成过滤。

当前tenant过滤失效的原因与修复

你当前的问题出在查询字符串的语法顺序和格式错误:

  • 错误地将过滤条件放在了KNN语法的箭头前,导致过滤逻辑未被正确解析;
  • Tag字段的查询语法无需多余符号。

修正后的检索代码

ef_runtime = 512
offset = page_number * page_size
total_k = offset + page_size
tenant='abc'

# 正确语法:先写过滤条件,再用=>连接KNN检索逻辑
query_string = f'@tenant:{tenant} => [KNN {total_k} @vector $query_vec AS vector_score] => {{$EF_RUNTIME: {ef_runtime}}}'
q = (Query(query_string)
  .dialect(2)
  .sort_by('vector_score', asc=True)
  .return_fields('vector_score', 'metadata')
  .paging(offset, page_size))

params_dict = { "query_vec": user_vector_bytes }

results = redis_client.ft('my_index').search(q, params_dict)

额外验证点

确认你的数据存储格式是Hash类型,且metadata字段是标准JSON字符串,例如:

redis_client.hset("item:1", mapping={
    "vector": user_vector_bytes,
    "metadata": '{"tenant": "abc", "price": 99.9, "category": "electronics"}'
})

数值字段过滤的实现方案

如果需要基于JSON元数据中的数值字段(如metadata.price)过滤,只需在索引阶段添加对应的数值型字段索引,检索时结合范围过滤语法即可。

1. 更新索引schema

from redis.commands.search.field import VectorField, TextField, TagField, NumericField

schema = [
  VectorField(
    "vector",                           
    "HNSW",
    {
      "TYPE": "FLOAT32",
      "DIM": 32,
      "DISTANCE_METRIC": "COSINE"
    }
  ),
  TextField("metadata"),
  TagField("$.metadata.tenant", as_name="tenant"),
  # 添加数值字段索引,提取metadata中的price字段
  NumericField("$.metadata.price", as_name="price")
]

definition = IndexDefinition(
  prefix=["item:"],
  index_type=IndexType.HASH
)

# 注意:若已有索引,需先删除再重建(或用ALTER INDEX添加字段)
redis_client.ft('my_index').create_index(schema, definition=definition)

2. 结合数值过滤的向量检索示例

比如检索tenant=abc且price<=100的物品,同时做向量KNN:

query_string = f'@tenant:{tenant} @price:[0 100] => [KNN {total_k} @vector $query_vec AS vector_score] => {{$EF_RUNTIME: {ef_runtime}}}'
q = (Query(query_string)
  .dialect(2)
  .sort_by('vector_score', asc=True)
  .return_fields('vector_score', 'metadata')
  .paging(offset, page_size))

results = redis_client.ft('my_index').search(q, params_dict)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 03:27:36