0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

jf_ro2CN3Fa 来源:waynblog 2024-02-21 10:01 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

RediSearch 简介

RediSearch 是一个 Redis 模块,为 Redis 提供查询、二级索引和全文搜索功能。

要使用 RediSearch 的功能,我们需要要先声明一个 index(类似于 Elasticsearch 的索引)。然后就可以使用 RediSearch 的查询语言来查询该索引下的数据。

RediSearch 内部使用压缩的倒排索引,所以可以用较低的内存占用来实现索引的快速构建。

目前 RediSearch 最新版支持的查询功能也比较丰富了,除了基本的文本分词还支持聚合统计、停用词、同义词、拼写检查、结果排序、标签查询、向量相似度查询以及中文分词等。

对比 Elasticsearch

基本硬件

f591b788-d059-11ee-a297-92fbcf53809c.png

数据源

f597dbd6-d059-11ee-a297-92fbcf53809c.png

RediSearch 配置

f59d903a-d059-11ee-a297-92fbcf53809c.png

Elasticsearch 配置

f5a6d76c-d059-11ee-a297-92fbcf53809c.png

版本

f5af12c4-d059-11ee-a297-92fbcf53809c.png

索引构建测试

在官方提供的索引构建测试中,RediSearch 用 221 秒的速度超过了 Elasticsearch 的 349 秒,领先 58%,

f5b4db00-d059-11ee-a297-92fbcf53809c.png

查询性能测试

通过数据集导入索引数据后,官方使用运行在专用负载生成器服务器上的 32 个客户端启动了两个词的搜索查询。

如下图所示,RediSearch 的吞吐量达到了 12.5K ops/sec,而 Elasticsearch 的吞吐量只有了 3.1K ops/sec,快了 4 倍。此外 RediSearch 的延迟稍好一些,平均为 8 毫秒,而 Elasticsearch 为 10 毫秒。(ops/sec 每秒操作数)

f5c08bc6-d059-11ee-a297-92fbcf53809c.png

由此可见,RediSearch 在性能上对比 RediSearch 有比较大的优势。

目前 RediSearch 已经更新到 2.0+ 版本,根据官方对于 RediSearch 2.0 版本介绍,与 RediSearch 1.6 相比,吞吐量和延迟相关的指标都提高了 2.4 倍。

RediSearch 安装

对于目前最新的 RediSearch 2.0 版本来说,官方推荐直接使用 redis-stack-server 镜像进行进行部署,也比较简单,

dockerrun-d--nameredis-stack-server-p6379:6379redis/redis-stack-server:latest

设置登录密码

//设置登录密码
dockerrun-eREDIS_ARGS="--requirepassredis-stack"redis/redis-stack:latest

通过 redis-cli 连接查看 RediSearch 是否安装了 search 模块,

redis-cli-hlocalhost

>MODULElist
...
3)1)"name"
2)"search"
3)"ver"
4)"20809"
5)"path"
6)"/opt/redis-stack/lib/redisearch.so"
7)"args"
8)1)"MAXSEARCHRESULTS"
2)"10000"
3)"MAXAGGREGATERESULTS"
4)"10000"
...

索引操作

FT.CREATE 创建索引命令

>FT.CREATEidx:goodsonhashprefix1"goods:"languagechineseschemagoodsNametextsortable
"OK"

FT.CREATE:创建索引命令

idx:goods:索引名称

on hash:索引关联的数据类型,这里指定索引基于 hash 类型的源数据构建

prefix 1 "goods:":表示索引关联的 hash 类型源数据前缀是 goods:

language chinese:表示支持中文语言分词

schema goodsName text sortable:表示字段定义,goodsName 表示元数据属性名,text 表示字段类型 sortable 表示该字段可以用于排序

添加索引时,直接使用 hset 命令添加一个 key 前缀是 "goods:" 的源数据。如下,

hsetgoods:1001goodsName小米手机
hsetgoods:1002goodsName华为手机

FT.SEARCH 查询索引

>FT.SEARCHidx:goods1"手机"
1)"2"
2)"goods:1001"
3)1)"goodsName"
2)"xe5xb0x8fxe7xb1xb3xe6x89x8bxe6x9cxba"
4)"goods:1002"
5)1)"goodsName"
2)"xe5x8dx8exe4xb8xbaxe6x89x8bxe6x9cxba"

FT.INFO 查询指定名称索引信息

>FT.INFOidx:goods
1)"index_name"
2)"idx:goods1"
3)"index_options"
4)(emptylistorset)
5)"index_definition"
6)1)"key_type"
2)"HASH"
3)"prefixes"
4)1)"goods:"
5)"default_language"
6)"chinese"
7)"default_score"
8)"1"
7)"attributes"
8)1)1)"identifier"
2)"goodsName"
3)"attribute"
4)"goodsName"
5)"type"
6)"TEXT"
7)"WEIGHT"
8)"1"
9)"SORTABLE"
...

FT.INFO 查询指定名称的索引信息

FT.DROPINDEX 删除索引名称

>FT.DROPINDEXidx:goods1
"OK"

FT.DROPINDEX 删除指定名称索引,不会删除 hash 类型的源数据

如果需要删除索引数据,直接使用 del 命令删除索引关联的源数据即可。

Java 使用 RediSearch

对于 Java 项目直接选用 Jedis4.0 以上版本就可以使用 RediSearch 提供的搜索功能,Jedis 在 4.0 以上版本自动支持 RediSearch,编写 Jedis 连接 RedisSearch 测试用例,用 RedisSearch 命令创建如下,

Jedis 创建 RediSearch 客户端

@Bean
publicUnifiedJedisunifiedJedis(GenericObjectPoolConfigjedisPoolConfig){
UnifiedJedisclient;
if(StringUtils.isNotEmpty(password)){
client=newJedisPooled(jedisPoolConfig,host,port,timeout,password,database);
}else{
client=newJedisPooled(jedisPoolConfig,host,port,timeout,null,database);
}
returnclient;
}

Jedis 创建索引

Schemaschema=newSchema()
.addSortableTextField("goodsName",1.0)
.addSortableTagField("tag","|");
IndexDefinitionrule=newIndexDefinition(IndexDefinition.Type.HASH)
.setPrefixes("idx:goods")
.setLanguage("chinese");#设置支持中文分词
client.ftCreate(idxName,
IndexOptions.defaultOptions().setDefinition(rule),
schema);

Jedis 添加索引源数据

publicbooleanaddGoodsIndex(StringkeyPrefix,Goodsgoods){
Maphash=MyBeanUtil.toMap(goods);
hash.put("_language","chinese");
client.hset("idx:goods"+goods.getGoodsId(),MyBeanUtil.toMap(goods));
returntrue;
}

Jedis 中文查询

publicSearchResultsearch(StringgoodsIdxName,SearchObjVOsearchObjVO,Pagepage){
//查询关键字
Stringkeyword=searchObjVO.getKeyword();
StringqueryKey=String.format("@goodsName:(%s)",keyword);
Queryq=newQuery(queryKey);
Stringsort=searchObjVO.getSidx();
Stringorder=searchObjVO.getOrder();
//查询是否排序
if(StringUtils.isNotBlank(sort)){
q.setSortBy(sort,Constants.SORT_ASC.equals(order));

}
//设置中文分词查询
q.setLanguage("chinese");
//设置分页
q.limit((int)page.offset(),(int)page.getSize());
//返回查询结果
returnclient.ftSearch(goodsIdxName,q);
}

最后聊两句

RediSearch 是这几年新出的一个全文搜索引擎,借助于 Redis 的成功,RediSearch 一出场就获得了较高的关注度。

目前来看,我个人使用 RediSearch 作为项目的全文搜索引擎已经够用了,它有易于安装、索引占用内存低、查询速度快等许多优点。不过在对 Redis 集群的支持上,RediSearch 目前只针对 Redis 企业版有解决方案,开源版还没有,这一点需要告诉大家。

如果想要在生产环境大规模使用,我还是不太建议的。





审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 生成器
    +关注

    关注

    7

    文章

    322

    浏览量

    22505
  • Hash
    +关注

    关注

    0

    文章

    33

    浏览量

    13625
  • Redis
    +关注

    关注

    0

    文章

    390

    浏览量

    12061

原文标题:换掉ES!Redis官方搜索引擎来了,性能炸裂!

文章出处:【微信号:芋道源码,微信公众号:芋道源码】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    5分钟了解SEO优化服务器对网站加载速度的影响

    一个为SEO优化过的服务器,能显著提升网站性能,从而在搜索引擎排名中占据有利位置。
    的头像 发表于 12-02 10:27 109次阅读

    根据标题获取商品链接评论接口的技术实现

    ; B(搜索引擎API调用) B -- > C{链接匹配度验证} C -- >|匹配成功| D[获取商品ID] C -- >|匹配失败| E[人工干预校准] D -- > F
    的头像 发表于 10-20 16:03 458次阅读
    根据标题获取商品链接评论接口的技术实现

    Redis集群部署与性能优化实战

    Redis作为高性能的内存数据库,在现代互联网架构中扮演着关键角色。作为运维工程师,掌握Redis的部署、配置和优化技能至关重要。本文将从实战角度出发,详细介绍Redis集群的搭建、
    的头像 发表于 07-08 17:56 625次阅读

    地平线余凯谈AI时代产品方法论

    互联网时代,商业逻辑始终围绕“连接”与“理解人”展开。从搜索引擎、社交平台再到短视频应用,都在通过用户行为数据揣摩人类偏好,优化服务体验。
    的头像 发表于 06-03 11:44 726次阅读

    【幸狐Omni3576边缘计算套件试用体验】Redis最新8.0.2版本源码安装及性能测试

    本文首先介绍Redis是什么,然后介绍如何在Omni3576上编译Redis-8.0.2源码,以及从源码编译、安装Redis,最后介绍如何在Omni3576上运行Redis
    发表于 06-03 01:28

    Redis 8 向量搜索实测:轻松扩展至 10 亿向量

    艾体宝Redis 8 向量搜索实测轻松支持 10 亿向量,仍保持低延迟与高吞吐。中位延迟仅200毫秒,90%精确度;处理50并发搜索请求中位延迟仅1.3秒,95%精确度。
    的头像 发表于 05-13 14:00 563次阅读
    <b class='flag-5'>Redis</b> 8 向量<b class='flag-5'>搜索</b>实测:轻松扩展至 10 亿向量

    国产之光!中达瑞和获DEEPSEEK认证:国产光谱相机领导品牌

    2025年,AI行业极度火爆,Deepseek几乎成为全球的焦点,它是一款基于人工智能技术的新一代搜索引擎,专注于为用户提供更精准、更智能的搜索体验。与传统的搜索引擎不同,DeepSeek不仅
    的头像 发表于 02-17 11:01 664次阅读

    微软面临法国反垄断机构调查

    据媒体报道,微软目前正在接受法国反垄断机构的深入调查。此次调查的核心关注点在于,微软是否在搜索引擎联盟市场中滥用其市场支配地位。 知情人士透露,法国监管机构正在仔细评估微软的行为,特别是其是否向那些
    的头像 发表于 02-11 10:57 884次阅读

    OpenAI免费开放ChatGPT搜索功能

    近日,OpenAI宣布了一项重大决策:向所有用户免费开放ChatGPT搜索功能。这一举措无疑将为用户带来更加高效、智能的搜索体验。 与谷歌等传统搜索引擎的收录模式相比,ChatGPT搜索
    的头像 发表于 02-06 14:35 811次阅读

    LZO Data Compression,高性能LZO无损数据压缩加速器介绍,FPGA&amp;ASIC

    的AXI-Stream数据总线(128-bit数据宽度) 经典性能指标:1.1Gbps压缩速率@1个搜索引擎@200MHz内核时钟2.16Gbps压缩速率@16个搜索引擎@200MHz内核时钟3.32Gbps压缩
    发表于 01-24 23:53

    javascript:void(0) 是否影响SEO优化

    使用 javascript:void(0) 确实可能对SEO优化产生负面影响 。以下是关于 javascript:void(0) 对SEO影响的具体分析: 搜索引擎爬虫的理解问题 搜索引擎爬虫(如
    的头像 发表于 12-31 16:08 981次阅读

    HTTP 协议对于SEO优化的影响

    搜索引擎优化(SEO)是提高网站在搜索引擎中的可见性和排名的过程。HTTP协议作为互联网通信的基础,对SEO有着深远的影响。 1. HTTP状态码 HTTP状态码是服务器响应客户端请求的结果。这些
    的头像 发表于 12-30 09:29 983次阅读

    华为云Flexus X实例,Redis性能加速评测及对比

    随着云计算技术的飞速发展,Redis 作为一种高性能的内存数据库,在各种应用场景中发挥着越来越重要的作用。为了满足不同用户对 Redis 性能的高要求,华为云推出了 Flexus X
    的头像 发表于 12-29 15:47 830次阅读
    华为云Flexus X实例,<b class='flag-5'>Redis</b><b class='flag-5'>性能</b>加速评测及对比

    苹果为谷歌支付数十亿美元辩护,参与搜索案反垄断审判

    近日,苹果公司已正式要求参与谷歌即将在美国举行的在线搜索反垄断审判,此举旨在为其与谷歌之间的收入分成协议进行辩护。该协议使得谷歌成为Safari浏览器的默认搜索引擎,而谷歌每年因此向苹果支付数十
    的头像 发表于 12-26 10:41 716次阅读

    Redis缓存与Memcached的比较

    Redis和Memcached都是广泛使用的内存数据存储系统,它们主要用于提高应用程序的性能,通过减少对数据库的直接访问来加速数据检索。以下是对Redis和Memcached的比较,涵盖了它们的一些
    的头像 发表于 12-18 09:33 918次阅读