Redis Search系列 - 第四讲 支持中文
目录
- 一、支持中文
- 二、自定义中文词典
- 2.1 Redis Search设置FRISOINI参数
- 2.2 friso.ini文件相关配置
- 1)自定义friso UTF-8字典
- 2)修改friso.ini配置文件
- 三、实测中文分词效果
一、支持中文
Redis Stack 从版本 0.99.0 开始支持中文文档的添加和分词。中文文档的索引与其他语言不同,因为中文分词是通过扫描输入文本并根据预定义词典匹配字符或字符序列来完成的,而不是简单地使用空格或标点符号进行分词。Redis Stack 使用 Friso 中文分词库来实现这一功能,通常不需要额外配置。
Friso 是使用 c 语言开发的一款开源的高性能中文分词器,使用流行的mmseg算法实现。完全基于模块化设计和实现,可以很方便的植入其他程序中, 例如:MySQL,PHP,并且提供了php5, php7, ocaml, lua的插件实现。源码无需修改就能在各种平台下编译使用,加载完 20万的词条(UTF-8字典仅为2.53MB),内存占用稳定为 14.5M.
创建索引时支持中文:
# 创建JSON索引支持中文
FT.CREATE itemIdx ON JSON PREFIX 1 item: # 使用LANGUAGE参数(默认值english)设置支持中文分词LANGUAGE chinese
SCHEMA $.name AS name TEXT $.description as description TEXT $.price AS price NUMERIC $.colors.* AS colors TAG $.location AS loc GEO# 检索时支持中文
# 若在创建索引时已设置了LANGUAGE,则检索时无需再次设置LANGUAGE参数
FT.SEARCH itemIdx 你好 LANGUAGE chinese
二、自定义中文词典
如果你希望使用自定义词典,可以在加载Redis Search模块时在模块级别进行设置。FRISOINI设置可以指向包含相关设置和词典文件路径的 friso.ini 文件。 请注意,没有默认的 friso.ini 文件位置。RediSearch 自带的 friso.ini 和词典文件在构建时已编译到模块二进制文件中。
2.1 Redis Search设置FRISOINI参数
具体设置FRISOINI参数的方式包括:
1)加载Redis Search模块时设置FRISOINI:
redis-server --loadmodule ./redisearch.so FRISOINI /opt/dict/friso.ini
# 或
MODULE LOAD redisearch.so FRISOINI /opt/dict/friso.ini
2)运行时设置FRISOINI:
# 格式: FT.CONFIG SET OPT1 VAL1
FT.CONFIG SET FRISOINI /opt/dict/friso.ini
注: 方式 2) 官网说可以,但实测在运行时修改FRISOINI配置提示不支持,提示如下:
3)在Docker镜像中通过环境变量设置FRISOINI:
# Redis Stack
docker run -d
--name redis-stack
-p 6379:6379
# 设置Redis Search配置参数
-e REDISEARCH_ARGS="FRISOINI /opt/dict/friso.ini"
redis/redis-stack:latest
2.2 friso.ini文件相关配置
1)自定义friso UTF-8字典
首先下载friso UTF-8字典:
https://github.com/lionsoul2014/friso/tree/master/vendors/dict/UTF-8
在该dict/UTF-8目录下新建自定义的字典,如下图新建lex-biz.lex,在该自定义文件中输入业务专属的词条及其同义词集合,lex-biz.lex文件示例内容如下:
# 格式:词条/同义词集合
# 示例格式1(无同义词): 你好/null
# 示例格式2(有同义词): 研究/琢磨,研讨,钻研
水煮鱼/水煮黑鱼,水煮清江鱼,椒盐水煮鱼,水煮鱼片,川香水煮鱼
麻辣烫/null
麻辣拌/null
麻辣香锅/null
拌面/凉拌面,炸酱面
炒面/炒河粉,炒粉,炒米粉,炒米线
之后修改dict/UTF-8目录下的friso.lex.ini文件,在__LEX_CJK_WORDS__配置下添加上面自定义的字典文件lex-biz.lex,具体配置参见下图:

之后即可将整个dict/UTF-8字典目录整体拷贝,如拷贝到redis-stack-server的Docker镜像(或者服务器)中,如将其拷贝到Docker镜像的/usr/local/share/friso/dict/UTF-8/目录下。
2)修改friso.ini配置文件
首先从git仓库下载friso.ini原始配置文件:
https://github.com/lionsoul2014/friso/blob/master/friso.ini
然后修改friso.ini配置文件中的friso.lex_dir为前文提到的自定义字典的存放目录/usr/local/share/friso/dict/UTF-8/:

最后将修改后的friso.ini文件拷贝到redis-stack-server的Docker镜像(或者服务器)中,如将其拷贝到Docker镜像的/usr/local/share/friso/目录下,最后便可通过前文提到的RedisSearch设置FRISOINI参数的某一种方式进行FRISOINI的设置,如在启动Docker时设置friso.ini配置文件:
docker run -d -t
--restart=always
--name redis-stack
-p 26379:6379 -p 28001:8001
-v /opt/redis-stack/local-data/:/data
# 将宿主机上的friso自定义字典、配置目录拷贝到容器内
-v /opt/support/redis-stack/friso:/usr/local/share/friso
# 设置Redis Search配置参数FRISOINI
-e REDISEARCH_ARGS="FRISOINI /usr/local/share/friso/friso.ini"
redis/redis-stack:latest
宿主机friso相关配置目录如下:

三、实测中文分词效果
测试文本1(关键词:咚巴拉)
“中午吃完了所谓的早茶 回去放下行李 休息了会
就来吃下午茶了[服务]两层楼 楼下只能收现金 楼上可以微信支付宝 先找座位再点单[环境]人很多
去的那时候还下雨 楼下楼上座无虚席 可见生意真是好啊「芝麻糊」其实是芝麻糊加了汤丸
我觉得这个不太腻 所以吃了挺多 「双皮奶」双皮奶第一口的味道我是很喜欢
但是吃多了有点腻 碗的分量不小 店里吃的挺多
不过不饿也就点了个招牌的尝尝咚巴拉得再有机会去的话换个别的尝尝.”
测试文本2(关键词:阿卡利巴)
“甜品一直是我的心头肉,既然来了广州,不吃甜品是不会罢休的 ,
可惜还有好几家没有办法前往。南信牛奶甜品专家,是非常火的甜品店,一万多条的评论就能看出之火爆,
到店是中午12 点左右,基本是爆满,还好三楼的时候刚好有一桌起来了,不然还真要站着等一会。
先点单付钱入座等待红豆双皮奶 15 元/ 份,等待时长大概 15分钟 ,食客实在太多了 ,
可选择冰热,夏天当然要吃冰的 !!吃的有点小恶心,又或者是自己吃不惯…
挺奇怪的杨枝甘露 20元 / 份,这家的杨枝甘露很稀,感觉没啥味道,料很少。。
游客店 … 随随便便了阿卡利巴利人均大概 20-30”
存在测试文本1和2,
且需要搜索出指定的关键词:咚巴拉、阿卡利巴,
则对应不同的字典定义的搜索结果命中情况见下表:
| 自定义字典 | 检索:咚巴拉FT.SEARCH my_idx '咚巴拉' | 检索:阿卡利巴FT.SEARCH my_idx '阿卡利巴' |
|---|---|---|
| 无 |
|
|
| 咚巴拉/null 阿卡利巴/null |
|
|
| 咚巴拉/阿卡利巴 阿卡利巴/咚巴拉 |
|
|
| 咚巴拉/阿卡利巴 |
|
|
| 咚巴拉/阿卡利巴 额外执行: FT.SYNUPDATE my_idx my_syn 咚巴拉 阿卡利巴 |
|
|
| 咚巴拉/null 阿卡利巴/null 额外执行: FT.SYNUPDATE my_idx my_syn 咚巴拉 阿卡利巴 |
|
|
结论
- Friso自定义字典(格式:
词条/同义词集合)中的词条在Redis Search中是好用的,可以自定义分词- Friso自定义字典(格式:词条/
同义词集合)中的同义词集合在Redis Search中不生效- 如果想要使用同义词功能,需借助Redis Search中的
同义词FT.SYNUPDATE等相关命令
相关文章:
Redis Search系列 - 第四讲 支持中文
目录 一、支持中文二、自定义中文词典2.1 Redis Search设置FRISOINI参数2.2 friso.ini文件相关配置1)自定义friso UTF-8字典2)修改friso.ini配置文件 三、实测中文分词效果 一、支持中文 Redis Stack 从版本 0.99.0 开始支持中文文档的添加和分词。中文…...
架构师备考-架构图设计案列
本文中所涉及的架构图主要参考软考-架构设计师历年Web 架构设计案例真题,在其基础上进行补充说明。 历年软考架构师案例题-Web架构设计考点 2014 MVC 架构2015、2016 J2EE 架构2017 经典网络架构2018 SOA 架构2019 分布式架构2020 SSM 架构2021 云平台架构2022 物…...
专业级Facebook直播工具推荐:提升你的直播体验
随着社交媒体的迅速发展,直播已成为现代内容传播的重要方式。Facebook作为全球最大的社交平台之一,为用户和企业提供了丰富的直播功能,吸引了众多观众和参与者。在这个竞争激烈的环境中,如何打造高质量的直播内容显得尤为重要。本…...
【NodeJS】NodeJS+mongoDB在线版开发简单RestfulAPI (三):Cors的设置及.env文件的设置
本项目旨在学习如何快速使用 nodejs 开发后端api,并为以后开展其他项目的开启提供简易的后端模版。(非后端工程师) 由于文档是代码写完之后,为了记录项目中需要注意的技术点,因此文档的叙述方式并非开发顺序࿰…...
[python flask 数据库ORM操作]
一、链接数据库 我们选择的框架是flask-sqlAlchemy 这个框架是对pymysql的封装。 连接数据库 #导入包 from flask_sqlalchemy import SQLAlchemy #创建flask app对象 app Flask(__name__) #设置配置信息 HOSTNAME "localhost" PORT 3306; USERNAME "root&…...
【JavaScript】如何优雅的编码if判断中的一个变量多个或条件
前言 你是否写过这样代码: ...if (status 1 || status 4 || status 6)...代码场景是这样的,记录有多个状态,当状态等于1,4,6时要做相同的逻辑。今天我们就分享一下如何简化写法,让代码更好看,更优雅。 使用 switch 语句 ...…...
SaaS云诊所系统源码,基于云计算技术的SAAS模式诊所管理系统,适用于诊所、门诊、卫生服务站、卫生站
SaaS云诊所管理系统源码,门诊管理系统源码,诊所药店云平台源码 云诊所管理系统是基于云计算的SAAS模式诊所管理系统,全面适用于诊所、门诊、卫生服务站、卫生站、卫生所、中医馆、药店、私人个体诊所、中小型门诊、乡村卫生室、医务室以及社…...
字节,AI产品经理面试,拿下offer!
如果大家最近打算找ai产品经理这方面的工作,可以对照着脑图准备起来啦。 这篇文章给大家讲解两道高频问题: 1)AI产品经理和传统产品经理有什么区别 2)AI 产品经理的工作职责和能力要求是什么? 这两个问题看似简单&a…...
Postgresql pgsql 插件之postgis 安装配置
相关链接: pgsql编译安装 一、说明 postgis是pgsql最强大的几个插件之一,可以用于地理信息系统(gis)的搭建 二、插件安装启动 由于我的pgsql是编译安装的,所以插件也是编译安装,更加灵活。 1.进入到源…...
单片机STC8H8K64U开发板_RA6809开发板 驱动彩屏显示
单片机STC8H8K64U开发板,型号RT8H8K001 预留Type C接口,可供电SWD下载: RA6809开发板,型号RT6809CNN01 预留Type C接口供电,预留MCU接口、电容触摸屏接口、液晶屏接口: 双臂合一,驱动和控…...
Redis底层和缓存雪崩,击穿,穿透
一、Redis的数据结构 1.动态字符串 我们知道Redis中保存的Key是字符串,value往往hi字符串或者字符串的集合。可见字符串是Redis中最常用的一种数据结构。不过,Redis 没有直接使用c语言的字符串,因为c语言字符串存在许多问题: …...
[Java基础] 集合框架
往期回顾 [Java基础] 基本数据类型 [Java基础] 运算符 [Java基础] 流程控制 [Java基础] 面向对象编程 [Java基础] 集合框架 [Java基础] 输入输出流 [Java基础] 异常处理机制 [Java基础] Lambda 表达式 目录 List 接口 数据结构 最佳实践 实战代码 Set 接口 数据…...
机器学习基础:算法如何让 AI 自我学习
大家好,我是Shelly,一个专注于输出AI工具和科技前沿内容的AI应用教练,体验过300款以上的AI应用工具。关注科技及大模型领域对社会的影响10年。关注我一起驾驭AI工具,拥抱AI时代的到来。 AI工具集1:大厂AI工具【共23款…...
25届字节跳动 抖音NLP算法工程师 面经
目录 一面/技术面 2024/08/30二面/技术面 2024/09/13 一面/技术面 2024/08/30 深挖实习(最近的一段实习)深挖论文(让我共享屏幕,然后对着自己的论文讲)论文做了多久完成的?主要都做了哪些工作?…...
转行网络工程师以后的就业前景如何?
就业前景如何本质上取决于你在这行业的发展状况,而发展状况又主要由你的技术水平和与人交流的能力所决定。 如果你的技术能力仅限于"安服仔"、"脚本小子"等入门级水平,那你的职业发展可能会像浮萍一样漂泊不定。但如果你能轻松编写…...
docker 和 containerd 关系
containerd 是一个开源的容器运行时,它是用来管理容器生命周期的守护进程。containerd 支持 Docker 和其他容器格式,并且是许多现代容器编排系统(如 Kubernetes)的基础组件之一。 containerd 提供了一个命令行工具 ctr࿰…...
算法-二叉树的最大路径和
为了找到二叉树的最大路径和,我们需要考虑所有可能的路径,包括不经过根节点的路径,所以其实如果你从整体上来一条路径一条路径的遍历,太复杂,我们可以换个思路,从每个节点出发,就把那个节点当成…...
解决url含%导致404错误
String imageUrl;// 使用WebClient下载图片WebClient webClient WebClientUtil.getWebClient();Mono<ByteArrayOutputStream> byteArrayOutputStreamMono webClient.get().uri(imageUrl).retrieve().bodyToFlux(DataBuffer.class) // 获取图片内容的DataBuffer流.reduc…...
[Linux Codec驱动]音频路由概念
1. 音频路由的基本概念 源(Source):音频信号的发出方,通常是一个音频输入设备,如麦克风、音频播放设备等。接收端(Sink):音频信号的接收方,通常是音频输出设备ÿ…...
母线槽温度监测的哪个部位?安科瑞母线槽测温解决方案-安科瑞黄安南
安科瑞生产厂家:黄安南 壹捌柒/陆壹伍/零陆贰叁柒 母线槽简单来说充当着电缆的角色只不过它是大电流的输送设备,一般是铜排或者绿排做导体,用非烯性绝缘材料做支撑,搭配金属外壳。相对于电缆来说母线槽的载流能力强、电能损耗低、…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...

