首页 > 数据库 >RediSearch的简单使用与总结

RediSearch的简单使用与总结

时间:2024-05-14 22:54:36浏览次数:23  
标签:总结 ft name chinese hospital hospitalIndex 简单 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

如下图

RediSearch 创建索引和文档

创建索引


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表示数据结构为Hash
  • PREFIX 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无法正常执行模糊匹配的解决方案

RediSearch 中默认的中文分词器可能会根据版本的不一致有差异,一般都是 Friso

当然 RediSearch是支持自定义中文分词器和自定义字典的,不过那就是另外的话题了,这里就不提了。
具体可以参考官网:https://redis.io/docs/latest/commands/ft.dictadd/

删除索引

ft.drop hospitalIndex

RediSearch 总结

角度 优势 缺点
场景 适合简单的数据类型和文本 不适合复杂的数据类型,比如富文本,长文本
集成难度 简单指令, 方便集成 Redis知识储备,(这个不算什么成本吧)
执行效率 基于内存,搜索速度很快 分词效果不够理想,数据量大会影响性能
社区生态 - 社区目前过于小众
部署 简单搭建,方便集成,支持集群与横向扩展 有一定的不稳定性,毕竟很少见到用于产线环境下。

参考地址

  1. RediSearch/RediSearch
  2. Redis Real-Time Search, Querying, & Indexing
  3. RediSearch 高性能的全文搜索引擎
  4. 关于RediSearch无法正常执行模糊匹配的解决方案

标签:总结,ft,name,chinese,hospital,hospitalIndex,简单,RediSearch
From: https://www.cnblogs.com/dyhuang/p/18191659

相关文章

  • 反思与总结
    贡献值低的反思与总结贡献值低我觉得首要原因是我的拖延症,在冲刺阶段并没有全身心的投入到开发app的过程中,总想着能拖一天拖一天,逃避问题而不去面对它——而不去面对就永远没有解决问题的机会,不是吗?道理都懂,却缺乏行动,只有每到快要逾期时才能使我开始仓皇行动起来——拖延,......
  • mysql+node.js前后端交互(简单实现注册登录功能)
    目录 sql文件 user.js注册部分  登录部分 对应的表操作usersql.js result.js用户提交的信息会进行格式化 ......
  • 第一阶段自我总结
    在第一阶段冲刺过程中,我对自己在团队中的表现进行了深入的反思和总结。我发现了一些导致我贡献值较低的原因,并确定了下次冲刺中需要改进的目标和计划。首先,我意识到自己在新学期学习新内容的速度较慢。这导致了我在实际项目中的应用能力不足,影响了我在团队中的贡献。我发现自己在......
  • 设计模式学习(二)工厂模式——简单工厂模式
    目录前言简单工厂模式简介示例优点缺点使用场景前言工厂模式是一种常用的设计模式,属于创建型模式之一。它的主要目的是为了解耦组件之间的依赖关系。通过使用工厂模式,系统中的具体类的实例化过程可以被抽象出来,从而使得系统更加模块化,增强了系统的可维护性和可扩展性。工厂模式......
  • CTF中RSA相关题型总结(持续更新)
    e很小时:importgmpy2fromfunctoolsimportreducefromCrypto.Util.numberimportlong_to_bytesdefCRT(items):N=reduce(lambdax,y:x*y,(i[1]foriinitems))result=0fora,ninitems:m=N//nd,r,s=gmpy2.gcdext(......
  • 五大常用算法总结
    原文链接:https://blog.csdn.net/changyuanchn/article/details/51476281引言据说有人归纳了计算机的五大常用算法,它们是贪婪算法,动态规划算法,分治算法,回溯算法以及分支限界算法。虽然不知道为何要将这五个算法归为最常用的算法,但是毫无疑问,这五个算法是有很多应用场景的,最优化问......
  • 【区块链】区块链技术学习总结
     一、区块链技术简介1.1区块链概念区块链是一种按时间顺序将数据区块以顺序相连的方式组合而成的一种链式数据结构,并以密码学方式保证的不可篡改和不可伪造的分布式账本。简而言之,区块链是一条链,链上链接了许多个不能修改的数据块。1.2区块链应用1.2.1区块链1.0技术:比......
  • 简单有效的数据加密方法你知道几个?
    1.文件和邮件加密利用华企盾DSC数据防泄密系统,企业可以实现文件和邮件的加密。系统提供了一键式的文件加密解决方案,确保敏感信息在电子邮件中传输时得到安全保护,即使邮件被截获,内容也无法被未授权人员阅读。2.端到端数据加密华企盾DSC数据防泄密系统支持端到端的数据加密,......
  • 前后端分离,提供蜘蛛爬行最简单方案,创建sitemap xml
    2024年5月13日11:36:01现在很多项目是vuereactangular开发的,但是百度爬虫对这样的项目支持不好,很多时候回去采用一些服务器端渲染(SSR)和静态站点生成(SSG),当然有些框架支持ssr和ssg效果不好,还有些想不不破坏项目自身的提前下的方案呢?很多年前接手一个angularjs的项目,但是......
  • 计算机网络常见面试题总结(上)
    计算机网络常见面试题总结(上)OSI七层模型应用层,表示层,会话层,传输层,网络层,数据链路层,物理层。每一层都为上一层提供服务TCP/IP四层模型应用层,传输层,网络层,网络接口层,各层相互独立,为上层提供服务常见的网络协议应用层:HTTP,超文本传输协议,浏览器网页使用的就是HTTP请求加载的。SM......