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等相关命令

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/455740.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MoeCTF 2024 ---Misc方向WP

安全杂项 signin 题目描述: xdsec的小伙伴们和参赛者来上课,碰巧这一天签到系统坏了,作为老师的你,要帮他们 教师代签。 特殊提醒:luo同学今天好像在宿舍打游戏,不想来上课,这是严重的缺勤行为…

PoissonRecon学习笔记

1. Screened Poisson Reconstruction (SPR) 源码:https://github.com/mkazhdan/PoissonRecon However, as noted by several researchers, it suffers from a tendency to over-smooth the data. 泊松重建存在过度平滑的现象。 方法:position and gradi…

【QT】QChart绘制曲线与散点图

功能描述:绘制曲线和散点图,添加图例信息,可以进行缩放、移动,鼠标在曲线上时显示当前坐标点 QChart功能类 继承QGraphicsView 重写鼠标事件函数 protected:void resizeEvent(QResizeEvent *event);void mouseMoveEvent(QMouseEvent *event);void mousePressEvent(QMouseEv…

C++共同体

共同体是一种数据格式,他能储存不同的数据类型,但是同一时间只能储存其中的一种类型。 语法: union 共同体名 { 成员一的数据类型 成员名一; 成员二的数据类型 成员名二; 成员n的数据类型 成员名n; }

PHP养老院管理系统-计算机设计毕业源码-00115

摘要 随着社会老龄化进程的加速,养老院管理系统在提高养老服务质量和效率方面发挥着越来越重要的作用。本研究旨在设计和实现一个基于PHP的养老院管理系统,以满足养老院的日常管理需求,提升养老服务水平。 本研究首先对养老院管理系统的需求进…

大模型系列——幻觉

在kimi中输入提示词,得到本文脉络: 我想写大模型幻觉技术文章,请对以下标题进行补全和细化: 1、幻觉原因 2、幻觉消除方案 3、幻觉检测方案 4、幻觉评估数据集 背景 研究人员将大模型的幻觉分为事实性幻觉(Factuali…

【状态机DP】力扣2786. 访问数组中的位置使分数最大

给你一个下标从 0 开始的整数数组 nums 和一个正整数 x 。 你 一开始 在数组的位置 0 处&#xff0c;你可以按照下述规则访问数组中的其他位置&#xff1a; 如果你当前在位置 i &#xff0c;那么你可以移动到满足 i < j 的 任意 位置 j 。 对于你访问的位置 i &#xff0c…

系统架构图设计(轻量级架构)

轻量级架构一般包括&#xff1a;表现层、业务逻辑层、持久层、数据库层 表现层架构 MVC 模型&#xff08;Model&#xff09;&#xff1a;应用程序的主体部分&#xff0c;表示业务数据和业务逻辑视图&#xff08;View&#xff09;&#xff1a;用户看到并与之交流的界面控制器&…

Windows 11优化利器:全方位定制你的操作系统

最近&#xff0c;有用户询问如何禁用Windows Defender&#xff0c;这让我想起了一款功能强大的Windows 11设置工具。这款工具不仅包含了禁用Defender的功能&#xff0c;还提供了许多其他实用的系统定制选项。 工具概览 这款名为“Windows11轻松设置”的软件&#xff0c;最近进…

延迟队列实现及其原理详解

1.绪论 本文主要讲解常见的几种延迟队列的实现方式&#xff0c;以及其原理。 2.延迟队列的使用场景 延迟队列主要用于解决每个被调度的任务开始执行的时间不一致的场景&#xff0c;主要包含如下场景: 1.比如订单超过15分钟后&#xff0c;关闭未关闭的订单。 2.比如用户可以…

保姆级教程来喽!从下载开始的Luatools~小白必看!

对于刚接触Luatools的新手朋友们&#xff0c;这篇保姆级教程将手把手教你如何从下载开始使用这款强大的调试工具。Luatools适用于合宙的多种4G模组&#xff0c;支持固件获取、打包、调试等多项功能&#xff0c;确保你的开发工作事半功倍。 本文就来讲解一下Luatools的下载和使…

Flask集成sqlalchemy (学习笔记)

文章目录 前言一、安装sqlalchemy二、连接mysql1.创建一个配置数据库信息的文件&#xff08;如上图&#xff09;2.创建sqlalchemy配置文件3.app.py中引入注册4.创建模型对象5.在app.py中进行关联6.执行映射语句&#xff08;迁移命令&#xff09; 总结 前言 本文章讲解的是分模…

Html/Vue浏览器下载并重命名文件

Html/Vue浏览器下载并重命名文件 row是上方图片的数据对象 download(row) {const link document.createElement(a);link.style.display none;// 设置下载地址link.setAttribute(href, row.url);// 设置文件名(这里可以重新设置名字&#xff0c;下载之后的文件就是你重新命名…

王源携手匡威,官宣全球代言人身份,引全网热议

近日&#xff0c;匡威隆重宣布&#xff0c;青年偶像王源荣膺其全球品牌代言人。在官宣消息发布前夕&#xff0c;王源与匡威的合作便已在微博热搜上占据头榜&#xff0c;备受广大网友关注。 随着官宣及产品上线的钟声敲响&#xff0c;王源的粉丝们迅速行动起来&#xff0c;积极支…

Linux运维篇-ansible的使用

目录 ansible简介ansible架构1、连接插件2、核心模块3、自定义模块4、插件5、剧本6、主机清单 ansible的执行过程安装Ansibleansible的使用ansible.cfg文件修改添加主机清单方式一方式二方式三 测试主机清单连接 ansible简介 简单来说&#xff0c;ansible就是一个自动化运维工…

数学物理方法第五版梁昆淼课后答案详解PDF电子版

序言 梁昆淼《数学物理方法》第四版面世以来&#xff0c;随着学科的发展&#xff0c; 物理类各专业“数学物理方法”课程的教学要求与学时发生了变化。为了适应物理类人才培养的需要&#xff0c;在第四版的基础上&#xff0c; 根据多年的教学实践&#xff0c; 对本书进行了修订…

K8S部署

二进制搭建Kubernetes v1.20 k8s集群master01&#xff1a;192.168.10.80 kube-apiserver kube-controller-manager kube-scheduler etcd k8s集群master02&#xff1a;192.168.10.20 k8s集群node01&#xff1a;192.168.10.18 kubelet kube-proxy docker k8s集群node02…

数据导入导出

1.数据加载 - LOAD 语法 LOAD DATA [LOCAL] INPATH filepath [OVERWRITE] INTO TABLE tablename; 操作: 建表 CREATE TABLE myhive.test_load( dt string comment 时间&#xff08;时分秒&#xff09; , user_id string comment 用户 ID, word string comment 搜索词 , u…

Android compose 重建流程1

前言 本文是笔者学习Compose是如何自动触发UI刷新的笔记,可能缺乏一定可读性和教导性.(建议阅读参考文献更具启发性) 使用以下BOM作为研究环境. composeBom "2024.04.01" androidx-compose-bom { group "androidx.compose", name "compose-bom…

【linux】物理卷、卷组、逻辑卷

概述 初次了解物理卷、卷组和逻辑卷这些概念&#xff0c;大概理了下这三个概念之间的关系&#xff0c;只是一点皮毛&#xff0c;用于大致理解&#xff1a; 个人感觉很像虚拟化的过程&#xff0c;物理卷就相当于物理设备&#xff1b;卷组相当于把这些物理设备分组了&#xff1…