RedisSearch是Redis官方提供的全文检索模块,但在处理中文内容时,如果直接采用默认设置建立索引,检索效果会非常差。根本原因在于RedisSearch默认的分词逻辑是基于空白字符和标点符号进行切分,这天然适合英文单词,却完全无法应对连续书写、没有词边界的中文语句。要让中文查询既不错漏也不胡乱匹配,必须在索引定义阶段就介入分词器的选择,并配合词典管理。

为什么默认配置搜不准中文
很多团队在初次使用RedisSearch时,会执行一条简单的FT.CREATE命令,然后写入“智能手机优惠政策”这类字段,接着用FT.SEARCH尝试查找“手机”。结果经常返回空集合,或者只能搜到完整包含原句的记录。这是因为在未声明语言的情况下,RedisSearch把字段当作普通文本,按照非中文规则处理,整段话被视作一个不可拆分的记号。
从底层看,RedisSearch依赖Snowball等分词器做词干提取,这些工具对CJK(中日韩)字符没有内建切分规则。中文不像英文靠空格断词,必须借助专门的分词算法,例如基于词典的最大正向匹配,或统计语言模型。模块从2.0版本后内置了简单的中文支持,但需要通过显式参数开启,否则引擎不会调用相应逻辑。
另一个容易被忽视的点是,即便开启了基础中文模式,网络新词、行业术语仍可能切错。比如“大模型推理加速”可能被拆成“大”“模型”“推理”“加速”,但若业务里“大模型”是一个整体概念,默认词典就无法识别。因此配置中文分词不仅是改个参数,还涉及后续词典扩展。
使用FT.CREATE指定中文分词器
在Redis命令行中,创建支持中文的索引需要给字段加上LANGUAGE chinese选项,或者在全局指定默认语言。下面是一条典型的建索引语句,它对product_name字段启用中文处理:
FT.CREATE idx_product ON hash PREFIX 1 product:
SCHEMA
product_name TEXT LANGUAGE chinese
description TEXT LANGUAGE chinese
price NUMERIC
上述语句中,TEXT类型的两个字段都标明了LANGUAGE chinese,这意味着写入这些字段的值会送进中文分词流程,查询时也同样按中文粒度切词。如果不写LANGUAGE,RedisSearch按全局默认语言(通常是english)建倒排索引,中文就成了“天书”。
除了逐字段声明,也可以在FT.CREATE后加LANGUAGE chinese作为整个索引的默认语言,这样所有TEXT字段自动继承,减少重复书写。但要注意,如果某些字段存的是英文商品编码,强行用中文分词反而打乱编码,此时应单独覆盖为LANGUAGE english。
创建完成后,可以用FT.INFO idx_product查看分词器信息,确认返回结果里出现chinese相关描述。只有配置真正生效,后续的搜索才能正确召回“手机”从而匹配“智能手机”的记录。下面是用phpredis扩展在PHP里建索引的等价代码:
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$args = [
'idx_product', 'ON', 'hash', 'PREFIX', '1', 'product:',
'SCHEMA',
'product_name', 'TEXT', 'LANGUAGE', 'chinese',
'description', 'TEXT', 'LANGUAGE', 'chinese',
'price', 'NUMERIC'
];
$redis->rawCommand('FT.CREATE', ...$args);
扩展词典与自定义分词实践
内置中文分词只覆盖了常用词,面对垂直领域往往力不从心。RedisSearch允许通过外部词典文件增强识别能力,通常将专有名词写入文本文件,每行一个词,然后在模块配置里加载。例如电商行业把“苹果手机”“鸿蒙系统”加入mydict.dic,重启加载后,引擎切词时会优先把这些词作为整体。
加载自定义词典需要在redis.conf中配置module参数,类似:loadmodule /path/redisearch.so EXTLOAD /path/mydict.dic。修改后必须重启Redis服务,新词典才生效。在容器环境里,可以把词典挂进卷并调整启动命令,避免每次重建镜像。没有加载词典前,即便LANGUAGE chinese正确,行业新词仍会被切碎。
实践中还应关注停用词。中文里“的”“了”等高频字无意义,RedisSearch提供停用词表,可屏蔽它们减小索引体积。你可以在创建索引时用STOPWORDS参数传入常见虚词列表,提升查询效率。配合自定义词典与停用词,一个兼顾准确与性能的中文搜索方案就成型了。以下示例展示带停用词的创建方式:
FT.CREATE idx_article ON hash PREFIX 1 art:
STOPWORDS 2 的 了
SCHEMA
title TEXT LANGUAGE chinese
body TEXT LANGUAGE chinese
最后提醒,分词配置不是一劳永逸。业务词库随产品迭代变化,应建立定期更新词典并滚动重启的机制。同时可用FT.SEARCH做回归测试,输入典型query检查召回条目,确认“中文分词配置”真正服务于精准检索而非摆设。
RedisSearch中文分词RediSearch_ftcreate修改时间:2026-08-16 10:10:30