【独家】RediSearch - Redis强大的搜索引擎

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介:

640?wx_fmt=png&wxfrom=5&wx_lazy=1

作者/翻译:张冬洪,Redis中国用户组主席


RediSearch简介


RediSearch是一个高性能的全文搜索引擎,可作为一个Redis Module 运行在Redis上,是由RedisLabs团队开发的。


特点是:Faster, in-memory, highly available full text search (英文看着才有感觉)


项目地址:https://github.com/RedisLabsModules/RediSearch

官网:http://redisearch.io


主要特性


RediSearch 是在Redis基础上从0开始开发的一个全文搜索索引,使用新的Redis Modules API来扩展Redis新命令和能力,它的主要特性包括:


  • 简单,快速索引和搜索

  • 数据存储在内存中,使用内存-有效的自定义数据结构

  • 支持多种使用UTF-8编码的语言

  • 文档和字段评分

  • 结果的数值过滤

  • 通过词干扩展查询

  • 精确的短语搜索

  • 按特定属性过滤结果(例如仅在标题中搜索“foo”)

  • 强大的自动提示引擎

  • 增量索引(不需要对索引进行优化和压缩)

  • 支持用作存储在另一数据库中的文档的搜索索引

  • 支持已经在Redis中存在的HASH对象作为文件的索引

  • 扩展到多个Redis实例


RediSearch实战 - 小试牛刀


通过下面的案例让我们一起来了解一下关于RediSearch的一些关键概念,下面的例子是在redis-cli 工具基础上完成的。


1. 定义一个索引


为了搜索的有效性,RediSearch需要知道怎样去索引文档。一个文档可以有若干字段,每一个都有它们自己的权重(例如:标题通常比文本本身更重要)。搜索引擎能够使用数值字段来进行过滤(未来我们将会增加更多的字段)。


因此,第一步是创建索引定义,它告诉RediSearch如何处理我们将会添加的文档。


在这个案例中,我们将创建一个产品目录索引,其中每个产品都有名称,描述和价格(允许我们通过价格过滤产品)。


我们使用 FT.CREATE 命令,它的语法是:

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1

在本例中:

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1

这就意味着产品名称和描述被视为文本字段,其各自的得分是10分和1分,这个价格是用于过滤的数值字段。


2. 添加文档


现在我们可以使用 FT.ADD 命令添加一个新的文档到我们的索引:

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1

添加一个TV作为例子:

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1

该产品被立即添加索引中,现在可以在未来的搜索中被找到。


注:RediSearch支持UTF-8(或纯ASCII)编码的文本,不检查输入的有效性,其主要的限制是使用普通的空格和标点符号标记标志,它对ASCII和UTF-8都起作用。


3. 搜索


现在我们已经有了被添加到索引中的产品,用 FT.SEARCH 命令进行搜索是非常简单的:

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1

或者用价格过滤,如价格在$200到$300之间:

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1

在redis-cli 客户端上输出的结果信息如下:

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1

现在我们已经论证了RediSearch是如何工作的,我们将在短时间内热切的投入到RediSearch的开发和设计中。


性能


为了评估RediSearch相比其他开源搜索引擎的性能,我们创建了一套度量延迟和吞吐量的基准—索引和查询相同的数据集。


我们的基准测试结果表明RediSearch的速度相比ElasticSearch 和 Solr要快120%到500%。


基准设置:

  • 数据集:从维基百科页面提供的有用的英文摘要的转储,其中包括510万短摘要。


  • 基准测试:我们针对不同的搜索引擎运行了几个具有不同配置文件的查询。并行的运行1, 8, 16、32和64个并发客户端执行每个查询。我们也跑了自动完成测试,从具有相同客户端并发配置文件的数据集中测试前1100名最受欢迎的2和3个字母前缀。


  • 物理配置:2个 c4.4x large AWS EC2 Instance,每一个配置16核,32GB内存 和 SSD EBS 存储,一个用作client,另一个运行 servers


  • 搜索引擎测试

    • RediSearch:5个分片运行在5个Redis Masters上,没有负载均衡,冗余或内置的缓存,此设置最多使用了Server机器的5个CPU核心。


    • ElasticSearch:一个实例有5个分片,过滤器缓存已禁用,在基准测试中,ElasticSearch使用了所有的16个CPU核心,因为它是多线程的。


    • Solr:solr-cloud的两个实例,每一个实例上面运行2个分片,缓存是完全禁用的,在基准测试过程中,Solr也是使用了所有的16个CPU核心。



  • 客户端:使用GO编写的应用程序,利用尽可能多的CPU核心,对于Redis, ElasticSearch 和 Solr 都使用流行的GO客户端压测,测试程序地址:https://github.com/RedisLabs/RediSearchBenchmark


压测结果展示:

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1


总结:


我们已经证明,利用Redis Module API,我们可以在Redis的上面创建一个功能丰富和高性能的搜索引擎。

从基准测试来看,使用RediSearch 要优于其他搜索引擎,在某些情况下还有很大的盈余 - 保持较低的延迟。

然而相比于ElasticSearch和Solr,RediSearch仍然需要获得更多的特性,其性能优势使得它可以成为许多用例的可行替代品,并且随着时间的推移,我们打算在开源社区的帮助下对它进行加强。


来源:中生代技术 原文链接

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
8月前
|
存储 NoSQL 搜索推荐
Redis地理位置和搜索:实现位置服务和简单搜索引擎
本篇深入研究了Redis的地理位置数据类型及其应用,以及如何基于Redis构建一个简单的搜索引擎。我们首先介绍了地理位置数据类型(Geo),展示了如何使用它来存储位置信息,并进行位置查询、距离计算以及附近位置搜索。通过代码示例,读者可以了解如何利用地理位置数据类型实现位置服务。
317 0
|
9月前
java初中级面试题(SSM+Mysql+微服务(SpringCloud+Dubbo)+消息队列(RocketMQ)+缓存(Redis+MongoDB)+设计模式+搜索引擎(ES)+JVM
java初中级面试题(SSM+Mysql+微服务(SpringCloud+Dubbo)+消息队列(RocketMQ)+缓存(Redis+MongoDB)+设计模式+搜索引擎(ES)+JVM
449 0
|
9月前
java初中级面试题(SSM+Mysql+微服务(SpringCloud+Dubbo)+消息队列(RocketMQ)+缓存(Redis+MongoDB)+设计模式+搜索引擎(ES)+JVM
java初中级面试题(SSM+Mysql+微服务(SpringCloud+Dubbo)+消息队列(RocketMQ)+缓存(Redis+MongoDB)+设计模式+搜索引擎(ES)+JVM
590 0
|
9月前
java初中级面试题(SSM+Mysql+微服务(SpringCloud+Dubbo)+消息队列(RocketMQ)+缓存(Redis+MongoDB)+设计模式+搜索引擎(ES)+JVM
java初中级面试题(SSM+Mysql+微服务(SpringCloud+Dubbo)+消息队列(RocketMQ)+缓存(Redis+MongoDB)+设计模式+搜索引擎(ES)+JVM
632 0
|
SQL 存储 缓存
使用Redis实现一个轻量级的搜索引擎
场景 大家如果是做后端开发的,想必都实现过列表查询的接口,当然有的查询条件很简单,一条 SQL 就搞定了,但有的查询条件极其复杂,再加上库表中设计的各种不合理,导致查询接口特别难写,然后加班什么的就不用说了(不知各位有没有这种感受呢~)。 下面以一个例子开始,这是某购物网站的搜索条件,如果让你实现这样的一个搜索接口,你会如何实现?(当然你说借助搜索引擎,像 Elasticsearch 之类的,你完全可以实现。但我这里想说的是,如果要你自己实现呢?)
177 0
使用Redis实现一个轻量级的搜索引擎
|
SQL 存储 缓存
使用 Redis 实现一个轻量级的搜索引擎,牛逼!
大家如果是做后端开发的,想必都实现过列表查询的接口,当然有的查询条件很简单,一条 SQL 就搞定了,但有的查询条件极其复杂,再加上库表中设计的各种不合理,导致查询接口特别难写,然后加班什么的就不用说了(不知各位有没有这种感受呢~)。
使用 Redis 实现一个轻量级的搜索引擎,牛逼!
|
9天前
|
NoSQL Linux Redis
06- 你们使用Redis是单点还是集群 ? 哪种集群 ?
**Redis配置:** 使用哨兵集群,结构为1主2从,加上3个哨兵节点,总计分布在3台Linux服务器上,提供高可用性。
18 0
|
17天前
|
负载均衡 监控 NoSQL
Redis的集群方案有哪些?
Redis集群包括主从复制(基础,手动故障恢复)、哨兵模式(自动高可用)和Redis Cluster(官方分布式解决方案,自动分片和容错)。此外,还有如Codis、Redisson和Twemproxy等第三方工具用于代理和负载均衡。选择方案需考虑应用场景、数据规模和并发需求。
17 2
|
23天前
|
NoSQL Redis
Redis集群(六):集群常用命令及说明
Redis集群(六):集群常用命令及说明
15 0

热门文章

最新文章