Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >比 Elasticsearch 更快!RediSearch + RedisJSON = 王炸!

比 Elasticsearch 更快!RediSearch + RedisJSON = 王炸!

作者头像
macrozheng
发布于 2022-04-12 07:10:34
发布于 2022-04-12 07:10:34
1.5K00
代码可运行
举报
文章被收录于专栏:mall学习教程mall学习教程
运行总次数:0
代码可运行

Redis是开发中非常常用的内存数据存储中间件,之前基本上用它来做内存存储使用。最近发现Redis推出了很多增强模块,例如通过RedisJSON可以支持原生JSON对象的存储,使用RediSearch可以作为搜索引擎使用,并且支持中文搜索!今天给大家带来RediSearch+RedisJSON作为搜索引擎的使用实践,希望对大家有所帮助!

RedisMod简介

首先介绍下RedisMod这个东西,它是一系列Redis的增强模块。有了RedisMod的支持,Redis的功能将变得非常强大。目前RedisMod中包含了如下增强模块:

  • RediSearch:一个功能齐全的搜索引擎;
  • RedisJSON:对JSON类型的原生支持;
  • RedisTimeSeries:时序数据库支持;
  • RedisGraph:图数据库支持;
  • RedisBloom:概率性数据的原生支持;
  • RedisGears:可编程的数据处理;
  • RedisAI:机器学习的实时模型管理和部署。

安装

首先我们需要安装带所有RedisMod的Redis,使用Docker来安装非常方便的!

  • 使用如下命令下载RedisMod的镜像;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker pull redislabs/redismod:preview
  • 容器中运行RedisMod服务。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker run -p 6379:6379 --name redismod \
-v /mydata/redismod/data:/data \
-d redislabs/redismod:preview

RedisJSON

有了RedisJSON模块,Redis就可以存储原生JSON类型数据了,通过它你可以很方便地访问JSON中的各个属性,类似在MongoDB中那样,下面我们就来体验下,这里我们将使用RedisInsight 来操作Redis。

  • 首先通过JSON.SET命令向Redis中添加JSON类型键值对,几个商品对象数据,由于JSON是树形结构的,使用$符号代表往JSON的根节点中添加数据;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
JSON.SET product:1 $ '{"id":1,"productSn":"7437788","name":"小米8","subTitle":"全面屏游戏智能手机 6GB+64GB 黑色 全网通4G 双卡双待","brandName":"小米","price":2699,"count":1}'
JSON.SET product:2 $ '{"id":2,"productSn":"7437789","name":"红米5A","subTitle":"全网通版 3GB+32GB 香槟金 移动联通电信4G手机 双卡双待","brandName":"小米","price":649,"count":5}'
JSON.SET product:3 $ '{"id":3,"productSn":"7437799","name":"Apple iPhone 8 Plus","subTitle":"64GB 红色特别版 移动联通电信4G手机","brandName":"苹果","price":5499,"count":10}'
  • 数据插入成功后,在RedisInsight中将看到如下信息,JSON数据支持格式化高亮显示;
  • 接下来可以通过JSON.GET命令获取JSON类型键值对的值;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
JSON.GET product:1
  • 也可以只获取值的指定属性,在RedisJSON中,获取JSON对象中的属性时需要以.开头;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
JSON.GET product:1 .name .subTitle
  • 还可以通过JSON.TYPE命令来获取JSON对象类型。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
JSON.TYPE product:1 .

RediSearch

通过RediSearch模块,Redis可以变成一个功能强大的全文搜索引擎,并且原生支持中文搜索,下面我们就来体验下!

  • 使用RediSearch来搜索数据之前,我们得先创建下索引,建立索引的语法有点复杂,我们先来看下;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
FT.CREATE {index}
  [ON {data_type}]
     [PREFIX {count} {prefix} [{prefix} ..]
     [LANGUAGE {default_lang}]
  SCHEMA {identifier} [AS {attribute}]
      [TEXT | NUMERIC | GEO | TAG ] [CASESENSITIVE]
      [SORTABLE] [NOINDEX]] ...
  • 使用FT.CREATE命令可以建立索引,语法中的参数意义如下;
    • index:索引名称;
    • data_type:建立索引的数据类型,目前支持JSON或者HASH两种;
    • PREFIX:通过它可以选择需要建立索引的数据前缀,比如PREFIX 1 "product:"表示为键中以product:为前缀的数据建立索引;
    • LANGUAGE:指定TEXT类型属性的默认语言,使用chinese可以设置为中文;
    • identifier:指定属性名称;
    • attribute:指定属性别名;
    • TEXT | NUMERIC | GEO | TAG:这些都是属性可选的类型;
    • SORTABLE:指定属性可以进行排序。
  • 看了语法可能不太好理解,直接对之前的商品数据建立索引试试就懂了;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
FT.CREATE productIdx ON JSON PREFIX 1 "product:" LANGUAGE chinese SCHEMA $.id AS id NUMERIC $.name AS name TEXT $.subTitle AS subTitle TEXT $.price AS price NUMERIC SORTABLE $.brandName AS brandName TAG
  • 建立完索引后,我们就可以使用FT.SEARCH对数据进行查看了,比如使用*可以查询全部;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
FT.SEARCH productIdx *
  • 由于我们设置了price字段为SORTABLE,我们可以以price降序返回商品信息;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
FT.SEARCH productIdx * SORTBY price DESC
  • 还可以指定返回的字段;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
FT.SEARCH productIdx * RETURN 3 name subTitle price
  • 我们把brandName设置为了TAG类型,我们可以使用如下语句查询品牌为小米苹果的商品;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
FT.SEARCH productIdx '@brandName:{小米 | 苹果}'
  • 由于priceNUMERIC类型,我们可以使用如下语句查询价格在500~1000的商品;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
FT.SEARCH productIdx '@price:[500 1000]'
  • 还可以通过前缀进行模糊查询,类似于SQL中的LIKE,使用*表示;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
FT.SEARCH productIdx '@name:小米*'
  • FT.SEARCH中直接指定搜索关键词,可以对所有TEXT类型的属性进行全局搜索,支持中文搜索,比如我们搜索下包含黑色字段的商品;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
FT.SEARCH productIdx '黑色'
  • 当然我们也可以指定搜索的字段,比如搜索副标题中带有红色字段的商品;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
FT.SEARCH productIdx '@subTitle:红色'
  • 通过FT.DROPINDEX命令可以删除索引,如果加入DD选项的话,会连数据一起删除;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
FT.DROPINDEX productIdx
  • 通过FT.INFO命令可以查看索引状态;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
FT.INFO productIdx
  • RediSearch的搜索语法比较复杂,不过我们可以对比SQL来使用它,具体可以参考下表。

对比Elasticsearch

Redis官方曾公布了RediSearch与Elasticsearch的性能对比测试,大家可以看下。

索引能力

对Wikipedia的560万(5.3GB)文档进行索引,RediSearch耗时221s,Elasticsearch耗时349s,RediSearch快了58%

查询能力

数据建立索引后,使用32个客户端对两个单词进行检索,RediSearch的吞吐量达到12.5K ops/sec,Elasticsearch的吞吐量为3.1K ops/sec,RediSearch比Elasticsearch要快4倍。同时RediSearch的延迟为8ms,而Elasticsearch为10ms,RediSearch延迟稍微低些!

总结

经过这么多年的发展,Redis的功能也越来越强大了,它已经不仅仅是个缓存工具了,更像是一个数据库了。RediSearch给了我们实现搜索功能的另一个选择,性能也非常不错,大家如果做搜索相关功能的话可以考虑下它!

参考资料

  • 官方文档:https://developer.redis.com/howtos/redisjson/
  • 参考手册:https://oss.redis.com/redisearch/
  • 性能测试:https://redis.com/blog/search-benchmarking-redisearch-vs-elasticsearch/
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-03-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 macrozheng 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
可能是全网第一个使用RediSearch实战的项目
RediSearch 是基于 Redis 开发的支持二级索引、查询引擎和全文搜索的应用程序。在2.0的版本中,简单看下官网测试报告:
wayn
2022/03/29
2.8K0
elasticsearch实现类似京东的商品搜索效果(elasticsearch动态聚合)
用到京东的对其搜索应该不会陌生,其搜索也是使用elasticsearch完成的,下图为一个搜索效果图:
johnhuster的分享
2022/03/29
1.2K0
elasticsearch实现类似京东的商品搜索效果(elasticsearch动态聚合)
使用 RediSearch 在 Redis 中进行全文检索
Redis 大家肯定都不陌生了,作为一种快速、高性能的键值存储数据库,广泛应用于缓存、队列、会话存储等方面。
AlwaysBeta
2023/08/04
8140
使用 RediSearch 在 Redis 中进行全文检索
Redis 也支持全文搜索 了?这也太强了
在 2021 年我就了解到 RediSearch 这个项目,并已经把它用于我的开源项目 newbee-mall-pro 中。
wayn
2023/12/11
1.4K1
Redis 也支持全文搜索 了?这也太强了
Redis Stack 技术栈之JSON数据模型 RedisJSON
RedisJSON是RedisLabs公司开发的一款用于扩展Redis的JSON处理模块,能够让Redis像处理其他类型键一样处理JSON格式的数据,相当于扩展了Redis的数据类型。
Tinywan
2023/12/19
7650
Redis Stack 技术栈之JSON数据模型 RedisJSON
Redis Stack 技术栈之搜索引擎 RedisSearch
RedisSearch 是一个基于 Redis 的搜索引擎模块,它提供了全文搜索、索引和聚合功能。通过 RedisSearch,可以为 Redis 中的数据创建索引,执行复杂的搜索查询,并实现高级功能,如自动完成、分面搜索和排序。利用 Redis 的高性能特点,RedisSearch 可以实现高效的搜索和实时分析。对于微服务架构来说,RedisSearch 可以作为搜索服务的一部分,提供快速、高效的搜索能力,对于提高用户体验和性能具有重要的意义。
Tinywan
2023/12/26
1.3K0
Redis Stack 技术栈之搜索引擎 RedisSearch
深入解析RedisSearch:全文搜索的新维度
RedisSearch 是 Redis 的一个模块,它提供了全文搜索的功能,允许开发者在 Redis 数据库中执行复杂的搜索查询。RedisSearch 不仅支持简单的文本搜索,还提供了多种查询方式,如模糊查询、范围查询和聚合操作等。
公众号:码到三十五
2024/05/16
1.6K0
深入解析RedisSearch:全文搜索的新维度
Elasticsearch项目实战,商品搜索功能设计与实现!
在SpringBoot中使用Elasticsearch本文不再赘述,直接参考《mall整合Elasticsearch实现商品搜索》即可。这里需要提一下,对于需要进行中文分词的字段,我们直接使用@Field注解将analyzer属性设置为ik_max_word即可。
macrozheng
2020/04/24
3.9K0
01_ElasticSearch学习笔记
如何能正确的显示出用户想要的商品,并进行合理的过滤,尽快促成交易,是搜索系统要研究的核心。面对这样复杂的搜索业务和数据量,使用传统数据库搜索就显得力不从心,一般我们都会使用全文检索技术。 常见的全文检索技术有 Lucene、solr 、elasticsearch 等。
全栈程序员站长
2022/06/30
1.4K0
01_ElasticSearch学习笔记
使用Redisearch实现的全文检索功能服务
    “检索”是很多产品中无法绕开的一个功能模块,当数据量小的时候可以使用模糊查询等操作凑合一下,但是当面临海量数据和高并发的时候,业界常用 elasticsearch 和 lucene 等方案,但是elasticsearch对运行时内存有着最低限额,其运行时大小推荐 2G 以上的内存空间,并且需要额外的磁盘空间做持久化存储。
用户9127725
2022/08/08
1.7K0
使用Redisearch实现的全文检索功能服务
ElasticSearch高级操作
term查询,查询text类型字段时,只有其中的单词相匹配都会查到,text字段会对数据进行分词
小炜同学
2022/09/23
7900
还在用 RedisTemplate?试试 Redis 官方 ORM 框架吧,用起来够优雅!
RedisOM是Redis官方推出的ORM框架,是对Spring Data Redis的扩展。由于Redis目前已经支持原生JSON对象的存储,之前使用RedisTemplate直接用字符串来存储JOSN对象的方式明显不够优雅。通过RedisOM我们不仅能够以对象的形式来操作Redis中的数据,而且可以实现搜索功能!
macrozheng
2022/04/12
5880
还在用 RedisTemplate?试试 Redis 官方 ORM 框架吧,用起来够优雅!
千万级数据查询:CK、ES、RediSearch怎么选?
点击上方“芋道源码”,选择“设为星标” 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java 2021 超神之路,很肝~ 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网络应用框架 Netty 源码解析 消息中间件 RocketMQ 源码解析 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析 作业调度中间件 Elastic-Job 源码解析 分布式事务中间件 TCC-Transaction
芋道源码
2022/06/09
1.1K0
千万级数据查询:CK、ES、RediSearch怎么选?
CK、ES、RediSearch 对比,谁的性能更胜一筹
点击上方蓝色字体,选择“设为星标” 回复”学习资料“获取学习宝典 文章来源:https://c1n.cn/EmgJv 目录 前言 初版设计方案 CK 分页查询 使用ES Scroll Scan 优化深翻页 ES+Hbase 组合查询方案 RediSearch+RedisJSON 优化方案 总结 前言 在开发中遇到一个业务诉求,需要在千万量级的底池数据中筛选出不超过 10W 的数据,并根据配置的权重规则进行排序、打散(如同一个类目下的商品数据不能连续出现 3 次)。下面对该业务诉求的实现,设计思路和方案优
猿天地
2022/06/09
2.2K0
CK、ES、RediSearch 对比,谁的性能更胜一筹
Redis全文搜索教程之创建索引并关联源数据
Redis 全文搜索是依赖于 Redis 官方提供的 RediSearch 来实现的。RediSearch 提供了一种简单快速的方法对 hash 或者 json 类型数据的任何字段建立二级索引,然后就可以对被索引的 hash 或者 json 类型数据字段进行搜索和聚合操作。
wayn
2023/12/20
5720
Redis全文搜索教程之创建索引并关联源数据
千万级数据查询:CK和ES选哪个?
在开发中遇到一个业务诉求,需要在千万量级的底池数据中筛选出不超过 10W 的数据,并根据配置的权重规则进行排序、打散(如同一个类目下的商品数据不能连续出现 3 次)。下面对该业务诉求的实现,设计思路和方案优化进行介绍。
二哥聊运营工具
2022/07/11
1.6K0
千万级数据查询:CK和ES选哪个?
学好Elasticsearch系列-脚本查询
Elasticsearch的 Scripting 是一种允许你使用脚本来评估自定义表达式的功能。通过它,你可以实现更复杂的查询、数据处理以及柔性调整索引结构等。
BookSea
2023/08/15
6190
学好Elasticsearch系列-脚本查询
全文检索工具:第一章:Spring-data-elasticSearch搜索
@Document(indexName = "search11", type = "article",shards = 1,replicas = 0)
Java廖志伟
2022/09/28
4230
全文检索工具:第一章:Spring-data-elasticSearch搜索
mall整合Elasticsearch实现商品搜索
1.下载Elasticsearch6.2.2的zip包,并解压到指定目录,下载地址:https://www.elastic.co/cn/downloads/past-releases/elasticsearch-6-2-2
macrozheng
2019/07/22
6570
mall整合Elasticsearch实现商品搜索
RedisJson 横空出世,比 ES 快7 倍,惊爆了!
点击上方“芋道源码”,选择“设为星标” 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java 2021 超神之路,很肝~ 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网络应用框架 Netty 源码解析 消息中间件 RocketMQ 源码解析 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析 作业调度中间件 Elastic-Job 源码解析 分布式事务中间件 TCC-Transaction
芋道源码
2022/08/29
5670
RedisJson 横空出世,比 ES 快7 倍,惊爆了!
相关推荐
可能是全网第一个使用RediSearch实战的项目
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验