Redisearch全文索引在Python客户端查询无结果求助
问题排查与修复
核心错误点
1. 全文搜索语法不匹配
你用Query("s")搜索时,Redisearch的全文索引默认是匹配完整词汇,而你的key字段值是shahrukh khan这类完整名称,不存在独立的s词汇,因此返回空结果。要匹配以s开头的词汇,需使用前缀搜索语法:Query("s*")。
2. 索引创建的潜在问题
如果之前已存在同名索引,create_index会执行失败导致索引未生效。建议添加索引存在性检查,先删除旧索引再创建:
try: rs.dropindex() except redis.ResponseError: pass # 索引不存在时忽略错误
3. pl字段的JSON语法错误
你的d1/d2/d3中pl字段的字符串JSON存在语法错误:"t: "act"缺少引号闭合,应改为"t": "act"。虽然不影响当前key字段的搜索,但会导致后续操作pl字段时出错。
修复后的完整代码
import redis from redis.commands.json.path import Path from redis.commands.search.field import TextField, NumericField from redis.commands.search.indexDefinition import IndexDefinition, IndexType from redis.commands.search.query import Query # 修正pl字段的JSON语法错误 d1 = {"key": "shahrukh khan", "pl": '{"d": "mvtv", "id": "1234-a", "img": "foo.jpg", "t": "act", "tme": "1965-"}', "org": "1", "p": 100} d2 = {"key": "salman khan", "pl": '{"d": "mvtv", "id": "1236-a", "img": "fool.jpg", "t": "act", "tme": "1965-"}', "org": "1", "p": 100} d3 = {"key": "aamir khan", "pl": '{"d": "mvtv", "id": "1237-a", "img": "fooler.jpg", "t": "act", "tme": "1965-"}', "org": "1", "p": 100} schema = ( TextField("$.key", as_name="key"), NumericField("$.p", as_name="p"), ) r = redis.Redis(host='localhost', port=6379) rs = r.ft("idx:au") # 先删除旧索引(如果存在) try: rs.dropindex() except redis.ResponseError: pass # 创建新索引 rs.create_index( schema, definition=IndexDefinition( prefix=["au:"], index_type=IndexType.JSON ) ) # 插入数据 r.json().set("au:mvtv-1234-a", Path.root_path(), d1) r.json().set("au:mvtv-1236-a", Path.root_path(), d2) r.json().set("au:mvtv-1237-a", Path.root_path(), d3) # 使用前缀搜索语法查询以s开头的key result = rs.search(Query("s*")) print(result.docs)
验证结果
运行修复后的代码,rs.search(Query("s*"))会返回shahrukh khan和salman khan两个文档,符合预期。
内容的提问来源于stack exchange,提问作者NedStarkOfWinterfell
相关产品推荐
相关产品推荐

