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

如何在Redisearch-Py中按指定Domain过滤JSON数据搜索结果?

用Redisearch Tag机制过滤生产环境数据方案

一、先在Schema中定义dom为Tag字段

把dom字段定义为Redisearch的Tag类型,这类字段专门针对标签类场景做了优化,过滤查询效率远高于普通字符串匹配。

新建索引时配置

如果是从零创建索引,直接在Schema里添加Tag字段:

from redis.commands.search.field import TagField, JsonField
from redis.commands.search.indexDefinition import IndexDefinition, IndexType

# 适配JSON结构的Schema定义
schema = (
    JsonField("$.content", as_name="content"),  # 用于搜索的核心内容字段
    TagField("$.dom", as_name="dom")             # 将dom字段映射为Tag类型
)

# 创建索引,指定数据前缀和类型
rs = redis_client.ft("prod_search_idx")
rs.create_index(
    schema,
    definition=IndexDefinition(
        prefix=["app_data:"],  # 你的数据key前缀,按需调整
        index_type=IndexType.JSON
    )
)

已有索引补充Tag字段

如果索引已经存在,用FT.ALTER命令追加Tag字段:

rs.alter_index("prod_search_idx", TagField("$.dom", as_name="dom"))

二、查询时强制过滤dom=prod的条目

不管用户输入什么搜索关键词,都在查询条件中固定加入@dom:{prod}的Tag过滤规则,确保只返回生产环境的数据。

基础搜索+Tag过滤代码示例

from redis.commands.search.query import Query

def search_prod_content(keyword):
    rs = redis_client.ft("prod_search_idx")
    # 拼接查询条件:关键词搜索 + 生产环境Tag过滤
    query = Query(f"@content:{keyword} @dom:{prod}").paging(0, 10)  # 分页参数按需调整
    result = rs.search(query)
    return result.docs

自动补全场景适配

如果是自动补全需求,可以单独为prod环境生成专属补全词库,避免混入其他环境数据:

# 先拉取所有prod环境数据,生成补全词库
prod_docs = rs.search(Query("@dom:{prod}")).docs
for doc in prod_docs:
    redis_client.ft("prod_autocomplete").sugadd("content_sug", doc.content, 1.0)

# 补全查询直接调用prod专属词库
suggestions = redis_client.ft("prod_autocomplete").sugget("content_sug", keyword, fuzzy=True)

三、额外优化提示

  • 若dom字段可能存在多值,可通过SEPARATOR参数指定分隔符(默认是,),但本场景固定为prod,无需调整。
  • 可以把@dom:{prod}封装成固定查询前缀,避免业务代码重复编写过滤规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 13:53:18