Redisearch处理中文时返回异常结果及相关问题求助
Redisearch中文相关异常问题及解决方案
问题描述
使用Redisearch时遇到中文相关异常,当前使用的Schema定义如下:
TagField("$.id", as_name="id"), TextField("$.brand", as_name="brand"), TextField("$.title", as_name="title"), TextField("$.category", as_name="category"), TextField("$.param", as_name="param"), TextField("$.tags", as_name="tags"), NumericField("$.price", as_name="price"), NumericField("$.comments.positive_ratio", as_name="positive_ratio"),
出现的异常情况:
- 无法存入包含中文的文档
- 执行中文检索时返回结果不符合预期,通过
EXPLAIN命令可看到分词逻辑的差异 - 官方文档未找到足够相关的解决资料
解决方案
1. 配置中文分词器
Redisearch默认分词器不支持中文,需为TextField指定中文分词器:
- Redis命令行创建索引:
FT.CREATE idx:products ON JSON PREFIX 1 "product:" SCHEMA $.id AS id TAG $.brand AS brand TEXT CHINESE $.title AS title TEXT CHINESE $.category AS category TEXT CHINESE $.param AS param TEXT CHINESE $.tags AS tags TEXT CHINESE $.price AS price NUMERIC $.comments.positive_ratio AS positive_ratio NUMERIC
- Python客户端配置:
修改原Schema定义,为每个TextField添加tokenizer="chinese"参数:
TagField("$.id", as_name="id"), TextField("$.brand", as_name="brand", tokenizer="chinese"), TextField("$.title", as_name="title", tokenizer="chinese"), TextField("$.category", as_name="category", tokenizer="chinese"), TextField("$.param", as_name="param", tokenizer="chinese"), TextField("$.tags", as_name="tags", tokenizer="chinese"), NumericField("$.price", as_name="price"), NumericField("$.comments.positive_ratio", as_name="positive_ratio"),
2. 确保字符编码正确
确认存入Redis的中文数据为UTF-8编码,Python中直接使用Unicode字符串即可,无需手动转码,避免编码错误导致中文存储失败。
3. 规范中文检索语法
- 普通中文关键词检索:
FT.SEARCH idx:products "@title:手机"
- 精确匹配中文短语(用双引号包裹):
FT.SEARCH idx:products '@title:"智能手机"'
4. 重建索引(若已创建错误索引)
Redisearch不支持修改已创建索引的分词器配置,若之前未指定中文分词器创建了索引,需先删除旧索引再重建:
FT.DROPINDEX idx:products
内容的提问来源于stack exchange,提问作者weiwei wang
相关产品推荐
相关产品推荐

