文章目录
- 1.什么是Redis Search
- 2.为什么要使用Redis Search
- 3.RedisSearch 的核心特性
- 4.RedisSearch 的原理
- 4.1 倒排索引
- 4.2 索引创建与数据存储
- 4.3 数据模型
- 4.4 搜索查询处理
- 4.5 高性能与可扩展性:
- 5.有了ES为什么还需要RedisSearch
- 5.RedisSearch的安装
- 6.RedisSearch的基本用法
- 6.1 创建索引
- 6.2 添加数据
- 6.3 搜索数据
- 6.4 更新数据
- 6.5 删除数据
- 6.6 高级搜索功能
- 6.7 处理搜索结果
- 6.8 索引的优化和维护
- 7.RedisSearch 的性能优化
- 8.SpringBoot集成Redis Search

1.什么是Redis Search
Redis Search 是 Redis 官方提供的全文搜索引擎,只是Redis 的一个模块,它可以在 Redis 中存储和查询文本数据。
它为Redis 提供全文搜索、索引和复杂查询功能。它基于内存存储,结合了 Redis 的高性能和倒排索引技术,支持实时搜索、聚合分析、模糊匹配等场景。RedisSearch 适用于需要快速检索结构化或非结构化数据的应用,如电商搜索、日志分析、实时推荐等。
2.为什么要使用Redis Search
Redis Search 的主要优点包括:
- 高性能:Redis Search 基于内存存储,查询速度非常快,适合处理大量的搜索请求。
- 支持多种数据类型:Redis Search 可以存储和查询多种数据类型,包括字符串、哈希、列表、集合等。
- 支持全文搜索:Redis Search 支持全文搜索,可以根据关键词或短语进行搜索。
- 支持复杂查询:Redis Search 支持复杂查询,可以使用 AND、OR、NOT 等逻辑运算符进行组合查询。
- 支持聚合分析:Redis Search 支持聚合分析,可以对搜索结果进行统计和分析。
- 支持模糊匹配:Redis Search 支持模糊匹配,可以根据关键词的相似度进行搜索。
- 支持排序:Redis Search 支持根据字段进行排序,可以按照相关性、时间戳等进行排序。
- 支持索引:Redis Search 支持索引,可以对搜索字段进行索引,提高查询效率。
- 支持事务:Redis Search 支持事务,可以保证搜索操作的原子性。
- 支持插件:Redis Search 支持插件,可以扩展功能。
3.RedisSearch 的核心特性
1.全文搜索:内置中文分词支持(需加载Friso分词器),支持复杂查询语法,包括短语匹配、通配符、布尔逻辑等,支持对存储在 Redis 中的数据进行全文搜索,无论是简单的字符串还是复杂的文档结构。
2.实时索引:数据插入后立即可搜索,适合实时场景(微秒级延迟)。
3.多维度查询:支持文本、数字、地理位置等多种数据类型,可进行范围过滤和排序。
4.高级功能:丰富的聚合分析功能,自动补全、高亮显示、分面搜索、拼写纠错、自定义评分。
5.高性能与扩展性:基于内存的倒排索引,支持分布式集群,可处理大规模数据和高并发请求
4.RedisSearch 的原理
4.1 倒排索引
倒排索引是一种用于文本搜索的索引结构,提到倒排索引大家基本都会想到ES,它将文档中的每个单词作为关键词,将包含该单词的文档列表作为值,存储在一个索引表中,其核心就是通过词项(Term)到文档的映射实现快速检索,类似传统搜索引擎
倒排索引的主要优点包括:
- 快速搜索:通过关键词快速找到包含该关键词的文档列表,适用于搜索引擎。
- 支持模糊匹配:可以通过关键词的模糊匹配来找到相关的文档。
- 支持聚合分析:可以对关键词进行统计和分析,例如计算关键词的频率、相关性等。
- 支持排序:可以根据关键词的频率、相关性等进行排序。
- 支持高亮显示:可以将搜索结果中的关键词进行高亮显示,方便用户阅读。
4.2 索引创建与数据存储
RedisSearch 允许用户为存储在 Redis 中的数据创建索引,这些索引保存在内存中,确保了快速搜索和查询响应。
创建索引时,需要指定索引的名称、字段、权重等信息。这些信息定义了搜索的范围和优先级。
数据以文档的形式存储在索引中,每个文档由一个唯一的 ID 和多个字段组成。
4.3 数据模型
数据以JSON 文档 形式存储,每个文档包含唯一 ID 和多个字段,字段类型需预先定义(如 TEXT、NUMERIC)
4.4 搜索查询处理
解析查询语句生成执行计划,结合正排表(文档 ID 列表)和倒排表(词项索引)计算相关性得分
- 当用户执行搜索查询时,RedisSearch 会解析查询语句,并根据索引中的信息进行搜索。
- 查询可以包括关键字、短语、范围、布尔运算等,以满足复杂的搜索需求。
- RedisSearch 支持多种查询语法,使得搜索更加灵活和强大。
搜索结果会根据相关性进行排序,相关性最高的文档会首先显示。评分机制通常基于TF-IDF (词频-逆文档频率)等算法,同时考虑字段的权重和其他因素。用户还可以自定义评分函数,以满足特定的业务需求。
4.5 高性能与可扩展性:
由于 RedisSearch 是基于 Redis 的,因此它继承了 Redis 的高性能特性。
RedisSearch 的设计考虑了并发访问和大规模数据处理的需求,因此具有良好的可扩展性。通过合理的配置和优化,RedisSearch 可以轻松应对高并发的搜索请求。
RedisSearch 的原理主要基于内存中的倒排索引技术,通过高效的搜索算法和灵活的查询语法,为用户提供快速、准确的搜索体验。同时,其高性能和可扩展性使得 RedisSearch 能够应对大规模数据和并发访问的挑战。
5.有了ES为什么还需要RedisSearch
ElasticSearch 在倒排索引领域已经取得优异的成绩,更适合PB级的数据。但是尺有所短、寸有所长,并不是所有场景都可以使用其解决问题。
当然ES作为目前最主流的检索引擎,优势还是很多的,如:
- 分布式架构:原生支持PB级数据水平扩展
- 分词能力:内置ICU、IK等专业分词器,支持同义词、拼音等高级功能
- 数据持久化:基于Lucene的段存储机制保障数据可靠性
- 生态体系:完善的ELK技术栈(Kibana/Logstash/Beats)
- 大数据之神:PB级数据分布式处理无压力
但其局限性也很明显:
- 资源消耗:内存需求高(建议配置堆内存30GB+),32GB 机器实际可用不到 10GB
- 运维复杂度:需要专业集群管理(分片分配、版本升级等)
- 实时性:默认近实时(1秒延迟)
- 学习成本:DSL查询语法较复杂
- 冷启动索引加载时间:10 亿数据初始化索引要 8 小时(Redis Search 只要 40 分钟)
- 性能瓶颈:索引构建、查询性能受限于硬件资源
这些痛点在一些具体的应用场景下是绝对无法容忍的:
- 高频更新场景:某游戏排行榜每分钟更新 10 万次,ES 集群直接崩盘
- 极致延迟要求:金融订单系统要求 <1ms 响应,ES 跪地求饶
- 小型数据集合:10GB 数据硬上 ES,维护成本比开发成本还高
而redis Search的优势较ES相比就十分明显
- 极致速度:内存计算带来碾压级性能,微秒级响应
- 吞吐量:百万级写入12万/秒(单线程)左右
- 实时王者:写入即查无延迟,适合金融/社交等场景
- 成本杀手:节省50%+服务器资源
- 高频更新:基于内存高频更新,CPU的占用率更低
- 资源消耗低:轻量级,1亿数据仅需数GB内存,单节点可运行
Redis Search VS ElasticSearch
选型建议
在我们具体实施时也可全部进行兼容,如:用Redis Search作缓存层,ElasticSearch作持久层
5.RedisSearch的安装
本文针对docker安装进行介绍,其他安装方式可自行百度。
详情可参见:《docker安装redisSearch》
6.RedisSearch的基本用法
6.1 创建索引
在RedisSearch中,你需要先创建一个索引来定义哪些字段可以被搜索,以及这些字段的权重等。
FT.CREATE idx:myindex SCHEMA title TEXT WEIGHT 5.0 content TEXT
这条命令创建了一个名为idx:myindex的索引,其中title字段的权重是5.0,content字段的权重是默认的1.0。
6.2 添加数据
向索引中添加数据,你可以使用Redis的HSET命令或者RedisSearch的FT.ADD命令。以下是使用HSET添加数据的示例:
HSET doc:1 title "Redis Search" content "Redis Search is a powerful search engine built on top of Redis."
当然你也可以使用FT.ADD命令
FT.ADD idx:myindex doc:1 1.0 FIELDS title "Redis Search" content "Redis Search is a powerful search engine built on top of Redis."
这条命令将一个名为doc:1的文档添加到索引中,其中包含title和content两个字段。
6.3 搜索数据
使用RedisSearch进行搜索,你可以使用FT.SEARCH命令。以下是一个简单的搜索示例:
FT.SEARCH idx:myindex "search engine" LIMIT 0 10
这条命令将在索引中搜索包含"search engine"的文档,并返回匹配的结果。
6.4 更新数据
你可以使用HSET命令来更新已存在的数据:
HSET doc:1 title "Updated Redis Search"
这条命令将更新doc:1文档的title字段。
或者使用FT.ADD命令以相同的ID添加文档,这将覆盖原有的文档内容:
FT.ADD idx:myindex doc:1 1.0 FIELDS title "Updated Redis Search" content "Redis Search is a powerful search engine built on top of Redis."
这条命令将更新doc:1文档的title和content字段。
6.5 删除数据
使用Redis的DEL命令可以删除数据:
DEL doc:1
这条命令将删除doc:1文档。
或者,如果你想从索引中删除特定的文档,可以使用FT.DEL命令:
FT.DEL idx:myindex doc:1
6.6 高级搜索功能
RedisSearch支持多种高级搜索功能,包括:
- 短语搜索
- 如果你想搜索一个确切的短语,可以使用双引号将短语括起来:
这条命令将搜索包含"Redis Search"的文档。FT.SEARCH idx:myindex "Redis Search"
- 使用通配符搜索
- 你可以使用通配符*来匹配任意字符:
这条命令将搜索以"Redis"开头的文档。FT.SEARCH idx:myindex "Redis*"
或
这条命令将搜索以"Redis"开头的文档,后面跟着任意字符,并以 Search 结尾的短语。FT.SEARCH idx:myindex "Redis*Search"
- 布尔逻辑搜索
- 你可以使用AND、OR和NOT等布尔逻辑运算符来组合多个搜索条件:
# 这条命令将搜索同时包含"Redis"和"Search"的文档。 FT.SEARCH idx:myindex "Redis AND Search" # 这条命令将搜索同时包含"Redis"或"Search"的文档。 FT.SEARCH idx:myindex "Redis OR Search" # 这条命令将搜索同时包含"Redis"但不含"Search"的文档。 FT.SEARCH idx:myindex "Redis NOT Search"
- 使用字段限定符
- 你可以使用@符号来限定搜索字段:
这条命令将搜索title字段中包含"Redis"的文档。FT.SEARCH idx:myindex "@title:Redis"
- 使用范围搜索
- 你可以使用[]符号来指定范围:
假设你有一个包含价格字段price的索引,你可以这样搜索价格在 10 到 20 之间的商品:
FT.SEARCH idx:myindex "@price:[10 20]"
- 你可以使用[]符号来指定范围:
- 排序
- 你可以使用SORTBY子句来指定排序字段和排序方式:
FT.SEARCH idx:myindex "@price:[10 20]" SORTBY price ASC LIMIT 0 10
- 地理空间搜索
- 你可以使用GEOSEARCH命令来进行地理空间搜索:
这条命令将搜索距离给定经纬度10000米范围内的文档。GEOSEARCH idx:myindex FROM 37.7749 -122.4194 BYRADIUS 10000 m WITHDIST
- 聚合分析
- 你可以使用AGGREGATE命令来进行聚合分析:
这条命令将按照title字段进行聚合分析,并统计每个title的文档数量。FT.AGGREGATE idx:myindex "*" GROUPBY 1 @title REDUCE COUNT 0 AS count
或
这条命令将按照title字段进行聚合分析,并统计每个title的文档数量,然后按照文档数量降序排序,并返回前10个结果。FT.AGGREGATE idx:myindex "*" GROUPBY 1 @title REDUCE COUNT 0 AS count SORTBY count DESC LIMIT 0 10
- 自定义评分
- 你可以使用SCORE命令来自定义评分:
这条命令将搜索包含"Redis"的文档,并将评分设置为10。FT.SEARCH idx:myindex "Redis" SCORE 10
- 分页
- 你可以使用LIMIT子句来指定分页参数:
这条命令将搜索包含"Redis"的文档,并返回前10个结果。FT.SEARCH idx:myindex "Redis" LIMIT 0 10
- 高亮显示
- 你可以使用HIGHLIGHT子句来高亮显示搜索结果中的关键词:
这条命令将搜索包含"Redis"的文档,并高亮显示搜索结果中的关键词。FT.SEARCH idx:myindex "Redis" HIGHLIGHT 1
或
这条命令将搜索包含"Redis"的文档,并高亮显示搜索结果中的关键词,并使用<em>标签将关键词包围起来。FT.SEARCH idx:myindex "Redis" HIGHLIGHT 1 TAGSFRONT "<em>" TAGSBACK "</em>"
- 自定义查询语法
- 你可以使用自定义查询语法来扩展搜索功能:
这条命令将搜索title字段中包含"Redis"的文档,并按照price字段升序排序,并返回前10个结果。FT.SEARCH idx:myindex "@title:Redis" SORTBY price ASC LIMIT 0 10
或
这条命令将搜索title字段中包含"Redis"的文档,并将评分设置为10。FT.SEARCH idx:myindex "@title:Redis" SCORE 10
或
这条命令将搜索title字段中包含"Redis"的文档,并高亮显示搜索结果中的关键词。FT.SEARCH idx:myindex "@title:Redis" HIGHLIGHT 1
或
这条命令将搜索title字段中包含"Redis"的文档,并按照price字段升序排序,并返回前10个结果,同时将评分设置为10。FT.SEARCH idx:myindex "@title:Redis" SORTBY price ASC LIMIT 0 10 SCORE 10
或
这条命令将搜索title字段中包含"Redis"的文档,并将评分设置为10,同时高亮显示搜索结果中的关键词。FT.SEARCH idx:myindex "@title:Redis" SCORE 10 HIGHLIGHT 1
6.7 处理搜索结果
当你执行搜索查询时,RedisSearch会返回一个包含搜索结果的列表。每个结果包含文档的ID和相关信息。你可以根据需要处理这些结果,例如提取文档的内容、计算相关性分数等。
如:在电商平台中搜索包含关键词"蓝牙耳机"的商品。
FT.SEARCH idx:products "@name:蓝牙耳机" SORTBY price ASC LIMIT 0 10
这条命令将搜索name字段中包含"蓝牙耳机"的商品,并按照price字段升序排序,并返回前10个结果。
返回结果:
说明:
- 第1行为总匹配数(3条)。
- 后续每两行为一个文档的详细信息:ID + 键值对字段
6.8 索引的优化和维护
在使用RedisSearch时,你可能需要对索引进行优化和维护,以提高搜索性能和减少资源消耗。以下是一些常见的索引优化和维护任务:
- 定期重建索引
- 当你的数据发生变化时,你可能需要定期重建索引以确保索引的准确性和一致性。你可以使用FT.DROP命令删除旧索引,并使用FT.CREATE命令创建新索引。
- 优化索引配置
- 你可以根据你的数据特点和查询需求,优化索引配置。例如,你可以调整字段的权重、使用不同的分词器等。
- 监控和调优
- 你可以使用FT.INFO命令来监控索引的状态和性能。根据监控结果,你可以进行调优,例如调整索引配置、优化查询语句等。
- 定期清理过期数据
- 如果你有一个过期数据的策略,你可以定期清理过期数据,以减少索引的大小和查询的复杂度。
- 定期进行索引优化
- 你可以使用FT.OPTIMIZE命令来对索引进行优化,以减少索引的大小和查询的复杂度。
FT.OPTIMIZE idx:myindex
- 获取索引信息
- 使用 FT.INFO 命令可以获取有关索引的详细信息,如文档数量、索引大小等。
FT.INFO idx:myindex
这些是使用RedisSearch的基本操作。当然,RedisSearch还提供了许多高级功能,你可以查阅RedisSearch的官方文档来了解更多详细信息和高级用法。
7.RedisSearch 的性能优化
在使用 RedisSearch 时,为了提高性能,你可以采取以下几种优化策略:
- 索引优化:合理设计索引结构,避免不必要的字段被索引,以提高搜索效率。
- 查询优化:根据查询的复杂性和数据量调整查询策略,如使用分页、排序和过滤等选项来减少搜索范围。
- 硬件和配置:确保 Redis 服务器具有足够的硬件资源(如 CPU、内存和网络带宽),并根据实际情况调整 Redis 和 RedisSearch 的配置参数。
8.SpringBoot集成Redis Search
由于该小节篇幅较长,可移步至:《SpringBoot集成RedisSearch》