网易首页 > 网易号 > 正文 申请入驻

换掉ES!Redis官方搜索引擎来了,性能炸裂!

0
分享至

(微信小程序): 5000+ 道面试题和选择题, 真实面经 , 简历模版 ,包含Java基础、并发、JVM、线程、MQ系列、Redis、Spring系列、Elasticsearch、Docker、K8s、Flink、Spark、架构设计、大厂真题等,在线随时刷题!

1. 介绍

RediSearch是一个Redis模块,为Redis提供查询、二次索引和全文搜索。要使用RediSearch,首先要在Redis数据上声明索引。然后可以使用重新搜索查询语言来查询该数据。RedSearch使用压缩的反向索引进行快速索引,占用内存少。RedSearch索引通过提供精确的短语匹配、模糊搜索和数字过滤等功能增强了


2. 实现特性

  • 基于文档的多个字段全文索引

  • 高性能增量索引

  • 文档排序(由用户在索引时手动提供)

  • 在子查询之间使用 AND 或 NOT 操作符的复杂布尔查询

  • 可选的查询子句

  • 基于前缀的搜索

  • 支持字段权重设置

  • 自动完成建议(带有模糊前缀建议)

  • 精确的短语搜索

  • 在许多语言中基于词干分析的查询扩展

  • 支持用于查询扩展和评分的自定义函数

  • 将搜索限制到特定的文档字段

  • 数字过滤器和范围

  • 使用 Redis 自己的地理命令进行地理过滤

  • Unicode 支持(需要 UTF-8 字符集)

  • 检索完整的文档内容或只是 ID 的检索

  • 支持文档删除和更新与索引垃圾收集

  • 支持部分更新和条件文档更新


2.1. 对比 Elasticsearch

如下图所示,RediSearch 构建索引的时间为 221 秒,而 Elasticsearch 为 349 秒,快了 58%。


2.2. 索引构建测试

我们模拟了一个多租户电子商务应用程序,其中每个租户代表一个产品类别并维护自己的索引。对于此基准测试,我们构建了 50K 个索引(或产品),每个索引最多存储 500 个文档(或项目),总共 2500 万个文档。RediSearch 仅用了 201 秒就构建了索引,平均每秒运行 125K 个索引。然而,Elasticsearch 在 921 个索引后崩溃了,显然它不是为应对这种负载而设计的。


2.3. 查询性能测试

一旦数据集被索引,我们就使用在专用负载生成器服务器上运行的 32 个客户端启动两个单词的搜索查询。如下图所示,RediSearch 吞吐量达到了 12.5K 操作/秒,而 Elasticsearch 为 3.1K 操作/秒,速度提高了 4 倍。此外,RediSearch 延迟稍好一些,平均为 8 毫秒,而 Elasticsearch 为 10 毫秒。


3. 安装 3.1. 源码安装git clone https://github.com/RediSearch/RediSearch.git
cd RediSearch # 进入模块目录
make setup
make install

3.2. docker安装

note: RediSearch的安装比较复杂原包无法进行编译操作所以我们使用docker安装

docker run -p 6379:6379 redislabs/redisearch:latest

3.3. 判断是否安装成功127.0.0.1:0>module list
1) 1) "name"
2) "ReJSON"
3) "ver"
4) "20007"

2) 1) "name"
2) "search"
3) "ver"
4) "20209"

返回数组存在“ft”或 “search”(不同版本),表明 RediSearch 模块已经成功加载。

3. 命令行操作 3.1. 创建 3.1.1. 创建索引

创建索引不妨想象成创建表结构,表一般基本属性有表名、字段和字段类别等,所以我们可以考虑将索引名代表表名,字段代表字段,属性即表示属性。
123.232.112.84:0>ft.create "student" schema "name" text weight 5.0 "sex" text "desc" text "class" tag
"OK"

student 表示索引名,name、sex、desc表示字段,text表示类型(这样表示只是为了便于理解)
“weight”为权重,默认值为 1.0

type student
"none"

我们创建的索引redis是不认识的,这证明使用的是插件。

3.1.2 创建文档

创建文档上下文的过程不妨想想成向表中插入数据,这里请注意字段名可以使用双引号但切记一定要用英文,这里之所以着重提出是因为有些编译器中文双引号和英文双引号用肉眼实在难以辨认否则会出现 “Fields must be specified in FIELD VALUE pairs”(其实是将“ 当作内容处理了以至于缺少了字段)
123.232.112.84:0>ft.add student 001 1.0 language "chinese" fields name "张三" sex "男" desc "这是一个学生" class "一班"
"OK"

其中001为文档ID,"1.0"为评分缺少此值会报"Could not parse document score"异常
language 指明使用的语言默认是英文编码 如果没有此标记存储是没有问题的但不可以通过中文字符查询

推荐程序员摸鱼地址: https://www.yoodb.com/slack-off/home.html
3.1.3 查询 3.1.3.1 基本查询 3.1.3.1.1 全量查询123.232.112.84:0>FT.SEARCH student * SORTBY sex desc RETURN 3 name sex desc
1) "2"
2) "001"
3) 1) "name"
2) "张三"
3) "sex"
4) "男"
5) "desc"
6) "这是一个学生"

4) "002"
5) 1) "name"
2) "张三"
3) "sex"
4) "男"
5) "desc"
6) "这是一个学生"

3.1.3.1.2 匹配查询123.232.112.84:0>ft.search student "张三" limit 0 10 RETURN 3 name sex desc
1) "2"
2) "001"
3) 1) "name"
2) "张三"
3) "sex"
4) "男"
5) "desc"
6) "这是一个学生"

4) "002"
5) 1) "name"
2) "张三"
3) "sex"
4) "男"
5) "desc"
6) "这是一个学生"

limit 与mysql相识主要用于分页,此处是全量匹配,如果没有设置language “chinese” 此处查询为0,

3.1.3.2 模糊匹配 3.1.3.2.1 后置匹配ft.search student "李*" SORTBY sex desc RETURN 3 name sex desc
1) "1"
2) "003"
3) 1) "name"
2) "李四"
3) "sex"
4) "男"
5) "desc"
6) "这是一个学生"

3.1.3.2.2 模糊搜索123.232.112.84:0>FT.SEARCH beers "%%张店%%"
1) "1"
2) "beer:1"
3) 1) "name"
2) "集团本部已发布【文明就餐公约】,2号楼办公人员午餐的就餐时间是11:45~13:00,现经行政服务部进行抽查,发现我们部门有员工违规就餐现象。请大家务必遵守,相互转告,对于外地回到集团办公的同事,亦请遵守,谢谢!"
3) "org"
4) "山东省淄博市张店区"
5) "school"
6) "山东理工大学"

别高兴太早全量模糊匹配是由很大限制的,他基于Levenshtein距离(LD)进行模糊匹配。术语的模糊匹配是通过在术语周围加“%”来实现的,模糊匹配的最大LD为3,
确切的说这只是一种相识度查询,并非一般意义上的模糊搜索,
但是:如果仔细观察会发现通过精确匹配时不仅能够将完整value值查询出来而且还查询出其他处于文档某个位置的key请看官方提供的一个例子:

FT.CREATE idx SCHEMA txt TEXT
FT.ADD idx docCn 1.0 LANGUAGE chinese FIELDS txt "Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。从盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。[8]"
FT.SEARCH idx "数据" LANGUAGE chinese HIGHLIGHT SUMMARIZE
# Outputs:
数据数据进行写操作。由于完全实现了发布...数据冗余很有帮助。[8...

之所以会出现这样的效果是因为redisearch对文本进行了分词,其使用的工具是friso相比es的ik还是弱一些前者主要是对中文分词,体积小可移植性强。
从而我们可以结合后后置匹配算法

123.232.112.84:0>FT.SEARCH idx "数*" LANGUAGE chinese HIGHLIGHT
1) "1"
2) "docCn"
3) 1) "txt"
2) "Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。从盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。[8]"

或者结合Levenshtein算法这样基本上能够满足业务查询需求

123.232.112.84:0>FT.SEARCH idx "%%单的树%%" LANGUAGE chinese HIGHLIGHT
1) "1"
2) "docCn"
3) 1) "txt"
2) "Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层复制。从盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。[8]"

3.1.3.2.3 字段查询

通过字段查询也可以实现模糊搜索,直接给例子,后面跟着官网上给的sql 和 redisearch的对照表

ft.search student *
1) "2"
2) "doudou"
3) 1) "name"
2) "豆豆"
3) "jtzz"
4) "“检索”是很多产品中"
5) "phone"
6) "18563717107"

4) "ttao"
5) 1) "name"
2) "姚元涛"
3) "jtzz"
4) "一个生病的人只"
5) "phone"
6) "18563717107"
ft.search student '@phone:185* @name:豆豆'
1) "1"
2) "doudou"
3) 1) "name"
2) "豆豆"
3) "jtzz"
4) "“检索”是很多产品中"
5) "phone"
6) "18563717107"

sql redisearch WHERE x=‘foo’ AND y=‘bar’ @x:foo @y:bar WHERE x=‘foo’ AND y!=‘bar’ @x:foo -@y:bar WHERE x=‘foo’ OR y=‘bar’ (@x:foo) WHERE x IN (‘foo’, ‘bar’,‘hello world’) @x:(foo WHERE y=‘foo’ AND x NOT IN (‘foo’,‘bar’) @y:foo (-@x:foo) (-@x:bar) WHERE x NOT IN (‘foo’,‘bar’) -@x:(foo WHERE num BETWEEN 10 AND 20 @num:[10 20] WHERE num >= 10 @num:[10 +inf] WHERE num > 10 @num:[(10 +inf] WHERE num < 10 @num:[-inf (10] WHERE num <= 10 @num:[-inf 10] WHERE num < 10 OR num > 20 @num:[-inf (10] WHERE name LIKE ‘john%’ @name:john* 3.1.4 删除 3.1.3.1 删除文档123.232.112.84:0>ft.del student 002
"1"

3.1.3.3 删除索引123.232.112.84:0>ft.drop student
"OK"

3.1.5 查看 3.1.5.1 查看所有索引123.232.112.84:0>FT._LIST
1) "student1"
2) "ttao"
3) "idx"
4) "student"
5) "myidx"
6) "123"
7) "myIndex"
8) "testung"
9) "student2"

3.1.5.2 查看索引文档中的数据 3.1.5.2.1 获取单条数据123.232.112.84:0>ft.get student 001
1) "name"
2) "张三"
3) "sex"
4) "男"
5) "desc"
6) "这是一个学生"
7) "class"
8) "一班"

3.1.5.2.2 获取多条数据123.232.112.84:0>ft.mget student 001 002
1) 1) "name"
2) "张三"
3) "sex"
4) "男"
5) "desc"
6) "这是一个学生"
7) "class"
8) "一班"

2) 1) "name"
2) "张三"
3) "sex"
4) "男"
5) "desc"
6) "这是一个学生"
7) "class"
8) "一班"

3.1.6 索引别名操作 3.1.6.1 添加别名123.232.112.84:0>FT.ALIASADD xs student
"OK"

给索引student起个xs的别名,一个索引可以起多个别名

3.1.6.2 修改别名 3.1.6.3 删除别名123.232.112.84:0>FT.ALIASDEL xs
"OK"

来源 | 网络

公众号“Java精选”所发表内容注明来源的,版权归原出处所有(无法查证版权的或者未注明出处的均来自网络,系转载,转载的目的在于传递更多信息,版权属于原作者。如有侵权,请联系,笔者会第一时间删除处理!

最近有很多人问,有没有读者交流群!加入方式很简单,公众号Java精选,回复“加群”,即可入群!

(微信小程序):3000+道面试题,包含Java基础、并发、JVM、线程、MQ系列、Redis、Spring系列、Elasticsearch、Docker、K8s、Flink、Spark、架构设计等,在线随时刷题!

特别推荐:专注分享最前沿的技术与资讯,为弯道超车做好准备及各种开源项目与高效率软件的公众号,「大咖笔记」,专注挖掘好东西,非常值得大家关注。点击下方公众号卡片关注

文章有帮助的话,点在看,转发吧!

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
6月11日,陈奕迅真实病情曝光!网友:天哪,没想到这么严重!

6月11日,陈奕迅真实病情曝光!网友:天哪,没想到这么严重!

花花lo先森
2024-06-13 10:48:14
17岁中专女生数学竞赛全球12名!我试着做了这套题,给跪了...

17岁中专女生数学竞赛全球12名!我试着做了这套题,给跪了...

毕导
2024-06-14 17:15:49
中俄签订重要武器订单, 这次我国不再退让, 俄需答应一个特殊条件

中俄签订重要武器订单, 这次我国不再退让, 俄需答应一个特殊条件

星辰故事屋
2024-06-14 19:01:58
4位厅干履新

4位厅干履新

鲁中晨报
2024-06-15 11:11:05
变味了?桑尼再次发声:请中国球迷停止转账!胡锡进:滑稽的现象

变味了?桑尼再次发声:请中国球迷停止转账!胡锡进:滑稽的现象

吃鱼思故渊
2024-06-14 21:39:32
2024入伏时间表来了,今夏会比往年更热吗?答案来了

2024入伏时间表来了,今夏会比往年更热吗?答案来了

农夫也疯狂
2024-06-14 11:35:25
冯提莫健身直播走光!直播间当场被封禁,网友嘲讽:“垫大欺客”

冯提莫健身直播走光!直播间当场被封禁,网友嘲讽:“垫大欺客”

青芳草
2024-06-13 08:50:35
“中国已成为科学超级大国,欧美旧秩序正走向终结”

“中国已成为科学超级大国,欧美旧秩序正走向终结”

观察者网
2024-06-13 13:57:37
中国普通民众天文常识匮乏到什么地步?

中国普通民众天文常识匮乏到什么地步?

三农老历
2024-06-14 21:22:33
今天是6月15日下午,突然得知一个重要消息,下周要来大动作吗

今天是6月15日下午,突然得知一个重要消息,下周要来大动作吗

股市皆大事
2024-06-15 13:02:54
气愤!金曲奖取消王力宏致敬李玟表演,只因他过去了宣扬中国文化

气愤!金曲奖取消王力宏致敬李玟表演,只因他过去了宣扬中国文化

毒舌说历史1
2024-06-15 10:05:17
新冠疫后,罕见癌症大增

新冠疫后,罕见癌症大增

霹雳炮
2024-06-13 23:40:49
周鸿祎:嫌360广告弹窗多,可以用极速版,想免费,就要接受广告

周鸿祎:嫌360广告弹窗多,可以用极速版,想免费,就要接受广告

科技Nice
2024-06-15 17:14:28
真无语!中吉乌铁路刚宣布开建,韩国就宣布向中亚出口高速列车

真无语!中吉乌铁路刚宣布开建,韩国就宣布向中亚出口高速列车

金哥说新能源车
2024-06-14 20:09:03
从国产手机618战绩可以看出,手机行业凛冬已至,手机卖不动了

从国产手机618战绩可以看出,手机行业凛冬已至,手机卖不动了

柏铭锐谈
2024-06-13 12:21:39
随着许家印的没落,其女儿的生活也被曝光,奢侈程度令人咋舌

随着许家印的没落,其女儿的生活也被曝光,奢侈程度令人咋舌

天闻地知
2024-06-14 14:07:23
1979年,一张44年前不起眼的报纸被发现,竟牵出瞿秋白的被杀真相

1979年,一张44年前不起眼的报纸被发现,竟牵出瞿秋白的被杀真相

小金鱼的眼泪
2024-06-15 16:53:20
外交部:中方欢迎和支持一切有利于实现和平的努力,在瑞士和会问题上立场公平公正公开

外交部:中方欢迎和支持一切有利于实现和平的努力,在瑞士和会问题上立场公平公正公开

环球网资讯
2024-06-14 15:40:11
郎平见证蔡斌香港站2连胜!赛后一席话使中国女排泪目,球迷破防

郎平见证蔡斌香港站2连胜!赛后一席话使中国女排泪目,球迷破防

拳击时空
2024-06-15 06:12:03
滁州最新任前公示,张文杰拟提名为副县(市、区)长人选

滁州最新任前公示,张文杰拟提名为副县(市、区)长人选

鲁中晨报
2024-06-15 11:11:05
2024-06-15 18:02:44
Java精选
Java精选
一场永远也演不完的戏
1551文章数 3855关注度
往期回顾 全部

科技要闻

TikTok开始找退路了?

头条要闻

英媒劝美:少把精力放在压制中国科学上 不如自己进步

头条要闻

英媒劝美:少把精力放在压制中国科学上 不如自己进步

体育要闻

残暴的德国战车,和苏格兰的祖传倒霉蛋

娱乐要闻

江宏杰秀儿女刺青,不怕刺激福原爱?

财经要闻

新情况!高层对人民币的态度180°转弯

汽车要闻

东风奕派eπ008售21.66万元 冰箱彩电都配齐

态度原创

本地
旅游
房产
亲子
公开课

本地新闻

粽情一夏|海河龙舟赛,竟然成了外国人的大party!

旅游要闻

如何文艺消夏?乌镇10大活动开启古镇消夏节

房产要闻

万华对面!海口今年首宗超百亩宅地,重磅挂出!

亲子要闻

母亲的第六感能可怕到什么程度?网友的分享真的是细思极恐了!

公开课

近视只是视力差?小心并发症

无障碍浏览 进入关怀版