当前位置: 首页 > 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;搭配金属外壳。相对于电缆来说母线槽的载流能力强、电能损耗低、…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

简易版抽奖活动的设计技术方案

1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

苍穹外卖--缓存菜品

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

uniapp中使用aixos 报错

问题&#xff1a; 在uniapp中使用aixos&#xff0c;运行后报如下错误&#xff1a; AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难&#xff0c;相信大家会学的很愉快&#xff0c;当然对于有后端基础的朋友来说&#xff0c;本期内容更加容易了解&#xff0c;当然没有基础的也别担心&#xff0c;本期内容会详细解释有关内容 本期用到的软件&#xff1a;yakit&#xff08;因为经过之前好多期…...

rnn判断string中第一次出现a的下标

# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...

重启Eureka集群中的节点,对已经注册的服务有什么影响

先看答案&#xff0c;如果正确地操作&#xff0c;重启Eureka集群中的节点&#xff0c;对已经注册的服务影响非常小&#xff0c;甚至可以做到无感知。 但如果操作不当&#xff0c;可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...