当前位置: 首页 > news >正文

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
  • 测试文本1
  • 测试文本2
咚巴拉/阿卡利巴
阿卡利巴/咚巴拉
  • 测试文本1
  • 测试文本2
咚巴拉/阿卡利巴
  • 测试文本1
咚巴拉/阿卡利巴

额外执行:
FT.SYNUPDATE my_idx my_syn 咚巴拉 阿卡利巴
  • 测试文本1
  • 测试文本1
咚巴拉/null
阿卡利巴/null

额外执行:
FT.SYNUPDATE my_idx my_syn 咚巴拉 阿卡利巴
  • 测试文本1
  • 测试文本2
  • 测试文本1
  • 测试文本2

结论

  • 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,并为以后开展其他项目的开启提供简易的后端模版。(非后端工程师) 由于文档是代码写完之后,为了记录项目中需要注意的技术点,因此文档的叙述方式并非开发顺序&#xff0…...

[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&#xff0…...

算法-二叉树的最大路径和

为了找到二叉树的最大路径和,我们需要考虑所有可能的路径,包括不经过根节点的路径,所以其实如果你从整体上来一条路径一条路径的遍历,太复杂,我们可以换个思路,从每个节点出发,就把那个节点当成…...

解决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. 音频路由的基本概念 源&#xff08;Source&#xff09;&#xff1a;音频信号的发出方&#xff0c;通常是一个音频输入设备&#xff0c;如麦克风、音频播放设备等。接收端&#xff08;Sink&#xff09;&#xff1a;音频信号的接收方&#xff0c;通常是音频输出设备&#xff…...

母线槽温度监测的哪个部位?安科瑞母线槽测温解决方案-安科瑞黄安南

安科瑞生产厂家&#xff1a;黄安南 壹捌柒/陆壹伍/零陆贰叁柒 母线槽简单来说充当着电缆的角色只不过它是大电流的输送设备&#xff0c;一般是铜排或者绿排做导体&#xff0c;用非烯性绝缘材料做支撑&#xff0c;搭配金属外壳。相对于电缆来说母线槽的载流能力强、电能损耗低、…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作&#xff0c;无需更改相机配置。但是&#xff0c;一…...

基于服务器使用 apt 安装、配置 Nginx

&#x1f9fe; 一、查看可安装的 Nginx 版本 首先&#xff0c;你可以运行以下命令查看可用版本&#xff1a; apt-cache madison nginx-core输出示例&#xff1a; nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

生成 Git SSH 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...

苍穹外卖--缓存菜品

1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓存逻辑分析&#xff1a; ①每个分类下的菜品保持一份缓存数据…...

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下&#xff0c;知识图谱凭借其高效的信息组织能力&#xff0c;正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合&#xff0c;探讨知识图谱开发的实现细节&#xff0c;帮助读者掌握该技术栈在实际项目中的落地方法。 …...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全&#xff08;Thread Safety&#xff09; 线程安全是指在多线程环境下&#xff0c;某个函数、类或代码片段能够被多个线程同时调用时&#xff0c;仍能保证数据的一致性和逻辑的正确性&#xf…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…...