RediSearch-Redis的高性能全文搜索

2024-08-21 15:20

本文主要是介绍RediSearch-Redis的高性能全文搜索,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  • 什么是RediSearch
  • 能解决什么问题
  • 加入RediSearch模块有什么好处
  • 如何部署
  • 命令行如何使用
  • Redisson如何使用

什么是RediSearch

RediSearch是Redis Labs开发的一个模块,它为Redis添加了高性能的全文搜索功能。

能解决什么问题

RediSearch 的出现给 Redis 带来比较大热度。我们通常使用文档查询最为常见的就是 Elasticsearch,它的搜索开始的很早,风很大,企业实践也是如雨后春笋。

Redis 作为缓存介的霸主,已经开始不满足于局限的业务范畴,RediSearch的出现极大地扩展了Redis的功能边界,使其不仅仅是一个简单的键值存储系统,而是成为了一个可以用于多种应用场景的强大平台。

加入RediSearch模块有什么好处

1、增强搜索能力:
RediSearch使Redis具备了全文搜索的能力,这对于需要在大量文本数据中进行高效搜索的应用非常有用。它支持复杂的查询语法,例如布尔查询、短语匹配、模糊匹配等,这使得Redis成为一个更加强大的数据处理工具。

2、简化架构:
对于需要搜索功能的应用程序,使用RediSearch可以减少对额外搜索服务(如Elasticsearch或Solr)的依赖,从而简化整体架构并降低运维成本。

3、灵活性和扩展性:
RediSearch支持在Redis集群环境中使用,这意味着它可以随着数据量的增长而水平扩展。它还可以与其他Redis模块结合使用,比如RedisJSON,以提供更复杂的数据处理和搜索功能。

如何部署

部署的方式有很多,就是源代码编译、预编译文件、docker方式

非常快速的试用方式就是docker部署一个包含search功能的redis,生产环境就编译模块后加入。

  • Redis Stack 大礼包
$ docker run -p 6379:6379 redis/redis-stack-server:latest

redislabs/redisearch 的镜像已经过期,老版本和老demo中还有使用这个镜像,但是新更新不会再继续,需要下载 redis-stack 的docker镜像。

  • 连接客户端
ProjectLanguage
jedis⁠Java
redis-py⁠ Python
node-redis⁠ Node.js
nredisstack⁠ .NET
redis-om⁠ Python
lettusearch⁠ Java
spring-redisearch⁠ Java
redis-om-spring⁠ Java
redisearch-go⁠ Go
rueidis⁠ Go
Redis-om⁠JavaScript
Redis.OM⁠ .NET
redisearch-php⁠ PHP
php-redisearch⁠ PHP
redisearch-api-rs⁠Rust
redi_search_rails⁠ Ruby
redisearch-rb⁠ Ruby
redi_search⁠ Ruby

命令行如何使用

  • 创建索引
> FT.CREATE idx:movie ON hash PREFIX 1 "movie:" SCHEMA title TEXT SORTABLE release_year NUMERIC SORTABLE rating NUMERIC SORTABLE genre TAG SORTABLEOK
  • 查看索引
> FT.INFO idx:movie1) index_name2) idx:movie
... 
46) 1) global_idle2) (integer) 0
...
  • 修改索引
> HSET "movie:11005" title "Star Wars: Episode VI - Return of the Jedi"  plot "The Rebels destroy the Empire's Death Star." release_year 1983 genre "Action" rating 8.3 votes 906260 (integer) 6
  • 删除索引
> EXPIRE "movie:11002" 15(integer) 1
  • 查询索引(多种迷糊搜索的方式)
> FT.SEARCH idx:movie "war" RETURN 3 title release_year rating1) (integer) 1
2) "movie:11002"
3) 1) "title"1) "Star Wars: Episode V - The Empire Strikes Back"2) "release_year"3) "1980"4) "rating"5) "8.7"> FT.SEARCH idx:movie "@title:war" RETURN 3 title release_year rating> FT.SEARCH idx:movie "emp*" RETURN 3 title release_year rating> FT.SEARCH idx:movie "%gdfather%" RETURN 3 title release_year rating> FT.SEARCH idx:movie "war |  %gdfather% " RETURN 3 title release_year rating> FT.SEARCH idx:movie "@genre:{Drama}" RETURN 3 title release_year rating1) (integer) 1
2) "movie:11003"
3) 1) "title"2) "The Godfather"3) "release_year"4) "1972"5) "rating"6) "9.2"

所有的指令参考官方文档

Redisson 中如何使用

构建client

Config config = new Config();
config.useSingleServer().setAddress("redis://" + address);
RedissonClient client = Redisson.create(config);

构建查询内容,并根据文本内容搜索,并获取结果

RMap<String, SimpleObject> m = client.getMap("doc:1", new CompositeCodec(StringCodec.INSTANCE, client.getConfig().getCodec()));
m.put("v1", new SimpleObject("name1"));
m.put("v2", new SimpleObject("name2"));
RMap<String, SimpleObject> m2 = client.getMap("doc:2", new CompositeCodec(StringCodec.INSTANCE, client.getConfig().getCodec()));
m2.put("v1", new SimpleObject("name3"));m2.put("v2", new SimpleObject("name4"));RSearch s = client.getSearch();
s.createIndex("idx", IndexOptions.defaults().on(IndexType.HASH).prefix(Arrays.asList("doc:")),FieldIndex.text("v1"),FieldIndex.text("v2"));SearchResult r1 = s.search("idx", "*", QueryOptions.defaults().returnAttributes(new ReturnAttribute("v1"), new ReturnAttribute("v2")));SearchResult r2 = s.search("idx", "*", QueryOptions.defaults().filters(QueryFilter.geo("field").from(1, 1).radius(10, GeoUnit.FEET)));

删除索引

s.dropIndex("idx");

修改配置

Map<String, String> cfg = s.getConfig("TIMEOUT");
s.setConfig("TIMEOUT", "42");

Redisson官方也给到一些样例: 包括普通查询、对象查询、索引查询和语法校验

  • 完整官方说明文档

The end

虽然这个组件目前迭代更新是很快,但是在国内实践并不算多,毕竟Elasticsearch的选型,多年已经在人们的内心根深蒂固,如果不是RediSearch足够好或者外部动力催生,还是比较难铺开市场的。

此外,企业对于选型Elasticsearch 也不是单纯只做一个搜索,还结合日志、技术栈、数据库等多方面的考虑。

希望这个组件能够继续持续迸发活力,我们也有一天能选型用上这样的功能。

这篇关于RediSearch-Redis的高性能全文搜索的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1093540

相关文章

redis群集简单部署过程

《redis群集简单部署过程》文章介绍了Redis,一个高性能的键值存储系统,其支持多种数据结构和命令,它还讨论了Redis的服务器端架构、数据存储和获取、协议和命令、高可用性方案、缓存机制以及监控和... 目录Redis介绍1. 基本概念2. 服务器端3. 存储和获取数据4. 协议和命令5. 高可用性6.

Redis的数据过期策略和数据淘汰策略

《Redis的数据过期策略和数据淘汰策略》本文主要介绍了Redis的数据过期策略和数据淘汰策略,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录一、数据过期策略1、惰性删除2、定期删除二、数据淘汰策略1、数据淘汰策略概念2、8种数据淘汰策略

Redis存储的列表分页和检索的实现方法

《Redis存储的列表分页和检索的实现方法》在Redis中,列表(List)是一种有序的数据结构,通常用于存储一系列元素,由于列表是有序的,可以通过索引来访问元素,因此可以很方便地实现分页和检索功能,... 目录一、Redis 列表的基本操作二、分页实现三、检索实现3.1 方法 1:客户端过滤3.2 方法

Python中操作Redis的常用方法小结

《Python中操作Redis的常用方法小结》这篇文章主要为大家详细介绍了Python中操作Redis的常用方法,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以了解一下... 目录安装Redis开启、关闭Redisredis数据结构redis-cli操作安装redis-py数据库连接和释放增

redis防止短信恶意调用的实现

《redis防止短信恶意调用的实现》本文主要介绍了在场景登录或注册接口中使用短信验证码时遇到的恶意调用问题,并通过使用Redis分布式锁来解决,具有一定的参考价值,感兴趣的可以了解一下... 目录1.场景2.排查3.解决方案3.1 Redis锁实现3.2 方法调用1.场景登录或注册接口中,使用短信验证码场

Redis 多规则限流和防重复提交方案实现小结

《Redis多规则限流和防重复提交方案实现小结》本文主要介绍了Redis多规则限流和防重复提交方案实现小结,包括使用String结构和Zset结构来记录用户IP的访问次数,具有一定的参考价值,感兴趣... 目录一:使用 String 结构记录固定时间段内某用户 IP 访问某接口的次数二:使用 Zset 进行

解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)

《解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)》该文章介绍了使用Redis的阻塞队列和Stream流的消息队列来优化秒杀系统的方案,通过将秒杀流程拆分为两条流水线,使用Redi... 目录Redis秒杀优化方案(阻塞队列+Stream流的消息队列)什么是消息队列?消费者组的工作方式每

Redis如何使用zset处理排行榜和计数问题

《Redis如何使用zset处理排行榜和计数问题》Redis的ZSET数据结构非常适合处理排行榜和计数问题,它可以在高并发的点赞业务中高效地管理点赞的排名,并且由于ZSET的排序特性,可以轻松实现根据... 目录Redis使用zset处理排行榜和计数业务逻辑ZSET 数据结构优化高并发的点赞操作ZSET 结

Redis的Zset类型及相关命令详细讲解

《Redis的Zset类型及相关命令详细讲解》:本文主要介绍Redis的Zset类型及相关命令的相关资料,有序集合Zset是一种Redis数据结构,它类似于集合Set,但每个元素都有一个关联的分数... 目录Zset简介ZADDZCARDZCOUNTZRANGEZREVRANGEZRANGEBYSCOREZ

Redis多种内存淘汰策略及配置技巧分享

《Redis多种内存淘汰策略及配置技巧分享》本文介绍了Redis内存满时的淘汰机制,包括内存淘汰机制的概念,Redis提供的8种淘汰策略(如noeviction、volatile-lru等)及其适用场... 目录前言一、什么是 Redis 的内存淘汰机制?二、Redis 内存淘汰策略1. pythonnoe