RediSearch的简单使用与总结
前言
之前就有考虑过想要研究下RediSearch,号称高性能全文索引的功能,这几天闲来无事调研了一番。
RediSearch 介绍
RediSearch 是 Redis Labs 提供的一款强大且高效的搜索和全文索引引擎。它是一个基于 Redis 的模块,允许用户在 Redis 数据库中进行复杂的搜索和全文检索操作,而无需将数据导出到其他搜索引擎。
推荐使用场景
RediSearch适合简单且高效的分词搜索场景。
针对较为复杂的全文搜索RediSearch肯定是不如ES这种专业的。但假设有一批地址信息,以医院地址举例,省市县地址这些基本字段,想要快速搜索对应地址一般如下解决方案。
- 使用Like进行模糊匹配:太过鸡肋,(比如数据是 【上海市徐汇区宜山路第六人民医院】,搜索关键词是【上海第六】肯定是搜索不到数据的)。
- ES全文索引: 大材小用,杀鸡焉用牛刀
- 自实现分词和倒排索引,最不推荐!吃力不讨好,尽管市面上有很多中文分词器和全文索引的插件。
这时候就很适合使用RediSearch,既可以实现简单的(倒排索引)。又不需要使用ES那么庞大的中间件,集成起来也相对简单。
RediSearch安装
RediSearch 官方推荐的 Docker 方式来安装并启动。
docker run --name redisearch -p 16379:6379 -v redis-data:/data redis/redis-stack-server:latest
--name redisearch对容器进行命名-p 16379:6379宿主机16379映射了容器6379端口-v redis-data:/data数据卷映射redis/redis-stack-server:latest表示采用redis-stack-server的最新版本
然后进入容器中查看是否存在对应模块
docker exec -it redisearch redis-cli
如下图

RedisSearch 创建索引和文档
创建索引
FT.CREATE hospitalIndex ON HASH PREFIX 1 hospital: LANGUAGE "chinese" SCHEMA id NUMERIC province TEXT SORTABLE city TEXT SORTABLE name TEXT SORTABLE
FT.CREATE hospitalIndex 1.0表示创建一个名为hospitalIndex的全文索引ON HASH表示数据结构为HashPREFIX 1 hospital:表示是Key是以hospital:为前缀的数据LANGUAGE "chinese指定数据的语言为中文。这对文本分析和分词很重要,因为针对不同语言有对应的分词器。SCHEMA id NUMERIC province TEXT SORTABLE city TEXT SORTABLE name TEXT SORTABLE表示字段结构是 id,provice city name 其中id为数字类型,其他字段为文本参与索引
添加索引文档
ft.add hospitalIndex hospital:1 1.0 language "chinese" fields id 1 province "上海市" city "上海市" name "上海市第六人民医院"
ft.add hospitalIndex hospital:2 1.0 language "chinese" fields id 2 province "上海市" city "上海市" name "上海交通大学医学院附属瑞金医院"
ft.add hospitalIndex hospital:3 1.0 language "chinese" fields id 3 province "上海市" city "上海市" name "上海交通大学医学院附属新华医院"
ft.add hospitalIndex hospital:4 1.0 language "chinese" fields id 4 province "上海市" city "上海市" name "上海交通大学医学院附属上海儿童医学中心"
ft.add hospitalIndex hospital:5 1.0 language "chinese" fields id 5 province "上海市" city "上海市" name "复旦大学附属中山医院"
FT.ADD hospitalIndex hospital:1 1.0:将一个文档 hospital:1 添加到 hospitalIndex 索引中,评分为 1.0。LANGUAGE "chinese":指定文档的语言为中文。一定要指定对应的语言,这里会采用中文默认的分词器。FIELDS:后面跟着一系列字段和对应的值。
查询
ft.search [index] [keywords] language [lang]
从索引名Index中查找对应keywords,而lang为对应语言,默认会按照语言对应的分词器进行分词。
示例1
ft.search hospitalIndex "上海市医院" language "chinese"

示例2
ft.search hospitalIndex "上海市交通大学新华医院" language "chinese"

示例3
ft.search hospitalIndex "附属医院" language "chinese"

不足之处
示例1
尽快已经基本实现了全文索引,但由于RediSearch中的中文分词器还是有些局限性的。
比如下的几个搜索:

如上图所示,上海市第六 是可以搜索到数据的,但 上海第六 就无法搜索到数据了,这是因为RediSearch中的中文分词器对应拆分不好
示例2
如下图

上面的几个搜索例子其实不够恰当
不过我想强调的主要的目的还是 针对如果分词中的部分词性出现了【专业词】(比如:阿莫西林) 或者类似【第六人】这种现象,RediSearch没办法正确分词的。 是需要专业的分词器和自定义字典的
示例3
还有个问题是RediSearch中分词对应拆词颗粒度过于细,针对短语的搜索是不够的,聚合搜索效果很差,因为我这次的演示数据是地址数据所以不好展示处出来。
具体可以参考地址
RediSearch 中默认的中文分词器可能会根据版本的不一致有差异,一般都是 Friso
当然 RediSearch是支持自定义中文分词器和自定义字典的,不过那就是另外的话题了,这里就不提了。
具体可以参考官网:https://redis.io/docs/latest/commands/ft.dictadd/
删除索引
ft.drop hospitalIndex
RediSearch 总结
| 角度 | 优势 | 缺点 |
|---|---|---|
| 场景 | 适合简单的数据类型和文本 | 不适合复杂的数据类型,比如富文本,长文本 |
| 集成难度 | 简单指令, 方便集成 | Redis知识储备,(这个不算什么成本吧) |
| 执行效率 | 基于内存,搜索速度很快 | 分词效果不够理想,数据量大会影响性能 |
| 社区生态 | - | 社区目前过于小众 |
| 部署 | 简单搭建,方便集成,支持集群与横向扩展 | 有一定的不稳定性,毕竟很少见到用于产线环境下。 |
参考地址
- RediSearch/RediSearch
- Redis Real-Time Search, Querying, & Indexing
- RediSearch 高性能的全文搜索引擎
- 关于RediSearch无法正常执行模糊匹配的解决方案
RediSearch的简单使用与总结的更多相关文章
- Redis模块学习笔记(一)RediSearch简单使用
说明:安装的Redis服务器必须为 4.0 以上版本,通过info命令查看 > INFO redis_version: 一.安装 RediSearch git clone https://git ...
- Python3和高性能全文检索引擎Redisearch进行交互
安装 pip install redisearch 使用 from redisearch import Client, TextField # 创建一个客户端与给定索引名称 client = Clie ...
- 使用Python3.7结合Redisearch代替ElasticSearch实现的全文检索功能服务
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_105 "检索"是很多产品中无法绕开的一个功能模块,当数据量小的时候可以使用模糊查询等操作凑合一下,但是当面临海 ...
- 【造轮子】打造一个简单的万能Excel读写工具
大家工作或者平时是不是经常遇到要读写一些简单格式的Excel? shit!~很蛋疼,因为之前吹牛,就搞了个这东西,还算是挺实用,和大家分享下. 厌烦了每次搞简单类型的Excel读写?不怕~来,喜欢流式 ...
- Fabio 安装和简单使用
Fabio(Go 语言):https://github.com/eBay/fabio Fabio 是一个快速.现代.zero-conf 负载均衡 HTTP(S) 路由器,用于部署 Consul 管理的 ...
- node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理
一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...
- 哪种缓存效果高?开源一个简单的缓存组件j2cache
背景 现在的web系统已经越来越多的应用缓存技术,而且缓存技术确实是能实足的增强系统性能的.我在项目中也开始接触一些缓存的需求. 开始简单的就用jvm(java托管内存)来做缓存,这样对于单个应用服务 ...
- 在Openfire上弄一个简单的推送系统
推送系统 说是推送系统有点大,其实就是一个消息广播功能吧.作用其实也就是由服务端接收到消息然后推送到订阅的客户端. 思路 对于推送最关键的是服务端向客户端发送数据,客户端向服务端订阅自己想要的消息.这 ...
- 我的MYSQL学习心得(一) 简单语法
我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...
- 使用 Nodejs 搭建简单的Web服务器
使用Nodejs搭建Web服务器是学习Node.js比较全面的入门教程,因为要完成一个简单的Web服务器,你需要学习Nodejs中几个比较重要的模块,比如:http协议模块.文件系统.url解析模块. ...
随机推荐
- #最大公约数,容斥#洛谷 3166 [CQOI2014]数三角形
题目 分析 总方案就是\(C(n*m,3)\),考虑减掉不合法的方案, 横向\(n*C(m,3)\),纵向\(m*C(n,3)\)再减去斜着的, 对于\((x_1,y_1)(x_2,y_2),x_1& ...
- #floyd,斜率#洛谷 1354 房间最短路问题
题目 在一个长宽均为10,入口出口分别为(0,5),(10,5)的房间里有几堵墙, 每堵墙上有两个缺口,求入口到出口的最短路径. 分析 暴力建图,判断两个点是否有墙堵住, 可以求斜率然后判断所交点不能 ...
- #线性基,点分治#洛谷 3292 [SCOI2016]幸运数字
题目 分析 题目就是将\(x\)到\(y\)路径上的线性基合并求解, 这里用的是点分治,每次换根到重心的时候维护前缀线性基, 查询的时候如果属于不同的子树就能询问答案,记得\(x=y\)要特判 代码 ...
- Python 潮流周刊第 45 期(摘要)+ 赠书 5 本《Python语言及其应用(第2版)》
本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...
- 在Centos 8 服务器用tmux多开窗口
在 CentOS 服务器上使用 tmux 来多开窗口是一个高效的方式.tmux 是一个终端复用器,它允许你在一个终端窗口中打开多个终端会话,还可以在会话之间轻松切换,非常适合长时间运行程序或多任务操作 ...
- Health Kit接入资质要求详解,开发不迷路!
开发运动/健康应用过程中,需要使用Health Kit提供的数据能力,作为独立的个人开发者或是企业开发者,接入时分别需要满足什么样的条件呢? 个人开发者接入资质审核要求 •个人开发者应用需上架至华为应 ...
- HarmonyOS音视频开发概述
在音视频开发指导中,将介绍各种涉及音频.视频播放或录制功能场景的开发方式,指导开发者如何使用系统提供的音视频API实现对应功能.比如使用TonePlayer实现简单的提示音,当设备接收到新消息时, ...
- 重学c#系列——DiagnosticListener [三十五]
前言 简单介绍一下DiagnosticListener,一个比较常见的事件通知模型,可以说是事件发布订阅模型,常用于监控. 正文 直接编写代码: using System.Diagnostics; p ...
- c# assembly.GetManifestResourceStream找不到路径
前言 最近发现一个问题,用assembly.GetManifestResourceStream去找资源路径xml的时候,发现找不到,然后有些xml资源又可以找到,这时候有两种思维来思考. 正文 第一种 ...
- 重新整理数据结构与算法(c#)—— 二叉树排序树补删除节点[二十二]
前言 续前一章. 正文 删除节点规则: 1.假如删除的是叶子节点,让他的父节点,断开和它的联系. 2.如果删除节点右左子树或者右子树的话,那么应该这样. 如果删除节点是它的父节点的左节点,而删除节点有 ...