RedisSearch 是 Redis 的一个强大模块,提供了全文搜索和二级索引功能,帮助用户在 Redis 中进行复杂的搜索和过滤操作。无论是文本搜索、结构化查询,还是自动补全等功能,RedisSearch 都为需要实时搜索功能的应用提供了理想的解决方案。
RediSearch GitHub:https://github.com/RediSearch/RediSearch
RedisSearch 的关键功能
1. 全文搜索:支持复杂的查询,包括短语搜索、布尔逻辑、同义词扩展等。
2. 结构化查询:可对文档中的字段进行范围查询和数值过滤。
3. 自动补全和搜索建议:为用户提供实时搜索建议。
4. 地理位置查询:支持基于地理位置的查询。
5. 高性能和可扩展性:依托 Redis 的内存存取特性,提供极高的查询效率。
与 ElasticSearch 对比
性能对比
为了提供一个清晰的性能对比,下面是一个RedisSearch与Elasticsearch在几个关键性能指标上的比较表格。请注意,这些数据基于特定测试条件下的结果,实际应用中的表现可能会根据具体配置和使用场景有所不同。
指标 | Redisearch | Elasticsearch | 备注 |
索引速度 | 221秒(5.6百万文档) | 349秒(5.6百万文档) | Redisearch快58% |
查询速度 | 12.5K ops/sec | 3.1K ops/sec | Redisearch快4倍 |
查询延迟 | 8毫秒 | 10毫秒 | Redisearch表现更佳 |
内存使用 | 通常更高,因为数据存储在内存中 | 主要存储在磁盘,内存用于缓存和索引 | |
写入性能 | 高效,适用于实时写入和更新 | 适合高并发写入场景 | |
查询性能 | 单机环境下查询速度快 | 通过分片分布查询负载,支持近实时搜索 | |
扩展性 | 受限于内存大小 | 水平可扩展,轻松增加节点处理更多数据 | |
易用性 | 简单,与Redis一致的API | 功能强大但学习曲线陡峭 |
产品对比
特性/工具 | RedisSearch | Elasticsearch |
数据存储 | 内存中,支持持久化到磁盘 | 磁盘上,基于Lucene索引技术 |
索引类型 | 全文搜索,数值、地理空间等 | 全文搜索,结构化、非结构化数据 |
性能 | 极低延迟,适用于实时查询 | 优秀的分布式搜索性能,适合大规模数据集 |
扩展性 | 支持通过Redis Cluster进行水平扩展 | 强大的集群管理功能,易于水平扩展至PB级数据 |
易用性 | 配置简单,对于熟悉Redis的用户友好 | 功能丰富但设置较为复杂,学习曲线较陡 |
API与语言支持 | REST API, 提供多种客户端库 | RESTful API, 多种编程语言的官方及第三方客户端库 |
查询能力 | 基本的全文检索和过滤 | 复杂的聚合、脚本、过滤器等高级查询 |
社区支持 | 开源社区活跃,作为Redis的一部分得到维护 | 非常活跃的开源社区,有商业版本提供企业级支持 |
典型应用场景 | 实时应用、缓存层、小到中等规模的数据集 | 日志分析、大数据处理、电子商务搜索引擎 |
成本考虑 | 主要是硬件成本(内存),因为它是内存数据库 | 包括硬件(主要是存储)、软件许可费(如果使用X-Pack) |
运维复杂度 | 相对较低,依赖于Redis本身的稳定性和监控工具 | 较高,需要专门的运维团队来管理和优化集群 |
注意
• 在
数据存储
一栏中,RedisSearch主要依赖于Redis的内存存储机制,虽然它也提供了持久化选项,但是默认情况下数据是保存在内存中的。而Elasticsearch则是基于磁盘存储,并利用了Lucene来创建高效的索引。•
性能
方面,RedisSearch由于其内存操作的特点,在响应时间上有优势;Elasticsearch则是在大规模分布式环境下表现出色。•
易用性
方面,RedisSearch对于已经熟悉Redis的人来说更加直观容易上手;而Elasticsearch虽然强大,但是它的配置和使用相对更复杂一些。•
社区支持
反映了两种工具背后的开发者社区活动程度以及是否有商业支持可供选择。•
成本考虑
不仅包含了软件本身的成本,还包括了运行这些系统所需的硬件资源的成本。•
运维复杂度
则指出了日常维护和管理这两种系统的难易程度。
如何使用 Docker 安装 RedisSearch
使用 Docker 安装 RedisSearch 非常简单。以下是步骤:
1. 获取 RedisSearch Docker 镜像
首先,确保系统已安装 Docker,然后运行以下命令来拉取 RedisSearch 镜像:
docker pull redislabs/redisearch
2. 启动 RedisSearch 容器
使用以下命令运行 RedisSearch 容器,并将 Redis 服务映射到本地的 6379 端口:
docker run -it -d -p 6379:6379 --name redis-search redislabs/redisearch:latest
3. 验证安装
通过以下命令检查 Redis 模块是否安装成功。出现 search
模块表示成功:
127.0.0.1:6379> MODULE LIST
1) 1) "name"
2) "ReJSON"
3) "ver"
4) (integer) 999999
2) 1) "name"
2) "search"
3) "ver"
4) (integer) 20613
RedisSearch 使用示例
成功启动 RedisSearch 后,你可以通过 Redis 客户端进行连接并执行操作。以下是一些常见的使用示例:
1. 连接到 RedisSearch
使用 redis-cli
工具连接到 Redis 容器:
docker exec -it redis-search redis-cli
2. 创建索引
在 RedisSearch 中,创建索引是第一步。你需要定义文档结构及其字段类型:
FT.CREATE myIndex ON HASH PREFIX 1 doc: SCHEMA title TEXT WEIGHT 5.0 body TEXT url TEXT
解释:
•
myIndex
:索引的名称。•
ON HASH
:表示文档使用 Redis 哈希存储。•
PREFIX 1 doc:
:表示文档的前缀是doc:
,即所有以doc:
开头的键都是索引的一部分。• SCHEMA:定义索引的字段和类型。
•
title TEXT WEIGHT 5.0
:title
是一个文本字段,权重为 5.0。•
body TEXT
:body
是一个文本字段,使用默认权重。•
url TEXT
:url
是一个文本字段。
3. 添加文档
使用 Redis 哈希结构向 RedisSearch 添加文档:
HSET doc:1 title "Redisearch Introduction" body "Redisearch is a search engine addon for Redis" url "http://example.com/doc1"
HSET doc:2 title "Docker Guide" body "A complete guide to using Docker containers" url "http://example.com/doc2"
HSET doc:3 title "Advanced Redis" body "Learn advanced Redis usage and patterns" url "http://example.com/doc3"
4. 执行搜索
搜索所有包含 "Redisearch" 的文档:
通过 FT.SEARCH 命令进行全文搜索。以下是一些示例:
127.0.0.1:6379> FT.SEARCH myIndex "Redisearch"
1) (integer) 1
2) "doc:1"
3) 1) "title"
2) "Redisearch Introduction"
3) "body"
4) "Redisearch is a search engine addon for Redis"
5) "url"
6) "http://example.com/doc1"
7) "HSET"
8) "doc:3"
搜索标题包含 "Docker" 的文档
127.0.0.1:6379> FT.SEARCH myIndex "@title:Docker"
1) (integer) 1
2) "doc:2"
3) 1) "title"
2) "Docker Guide"
3) "body"
4) "A complete guide to using Docker containers"
5) "url"
6) "http://example.com/doc2"
搜索包含 "Docker" 的文档,只返回 title
和 url
字段
127.0.0.1:6379> FT.SEARCH myIndex "Docker" RETURN 2 title url
1) (integer) 1
2) "doc:2"
3) 1) "title"
2) "Docker Guide"
3) "url"
4) "http://example.com/doc2"
使用排序
可以对搜索结果进行排序。例如,按标题进行升序排列:
127.0.0.1:6379> FT.SEARCH myIndex "guide" SORTBY title ASC
1) (integer) 1
2) "doc:2"
3) 1) "title"
2) "Docker Guide"
3) "body"
4) "A complete guide to using Docker containers"
5) "url"
6) "http://example.com/doc2"
删除文档和索引
删除文档
可以使用 Redis 的 DEL 命令删除文档:
DEL doc:1
删除索引
可以使用 FT.DROPINDEX 命令删除索引:
FT.DROPINDEX myIndex
默认情况下,这不会删除相关的文档。如果你想同时删除文档,需要加上 DD
参数:
FT.DROPINDEX myIndex DD
聚合查询
RedisSearch 支持聚合查询,用于数据分析。这个查询会对所有文档按 title
分组,并计算每组的文档数量。
127.0.0.1:6379> FT.AGGREGATE myIndex "*" GROUPBY 1 @title REDUCE COUNT 0 AS count
1) (integer) 3
2) 1) "title"
2) "Redisearch Introduction"
3) "count"
4) "1"
3) 1) "title"
2) "Docker Guide"
3) "count"
4) "1"
4) 1) "title"
2) "Advanced Redis"
3) "count"
4) "1"
同义词设置
# 创建索引
FT.CREATE myIndex2 ON HASH PREFIX 1 doc: SCHEMA title TEXT WEIGHT 5.0 body TEXT url TEXT
# 添加文档
HSET doc:1 title "Quick brown fox" body "The quick brown fox jumps over the lazy dog." url "http://example.com/doc1"
HSET doc:2 title "Fast car" body "A fast car can reach high speeds quickly." url "http://example.com/doc2"
HSET doc:3 title "Speedy delivery" body "Speedy delivery is our promise." url "http://example.com/doc3"
# 添加同义词组
FT.SYNUPDATE myIndex2 synonym_group_1 "quick" "fast" "speedy"
# 查询同义词组
FT.SYNDUMP myIndex2
# 搜索
FT.SEARCH myIndex2 "quick"
FT.SEARCH myIndex2 "fast"
FT.SEARCH myIndex2 "speedy"
总结
RediSearch 为 Redis 提供了强大的搜索功能,从简单的全文搜索到复杂的聚合查询和同义词扩展,都能轻松实现。通过 Docker 快速安装和使用 RediSearch,可以极大简化开发过程,适用于各种需要实时搜索的应用场景。
欢迎关注我的公众号“编程与架构”,原创技术文章第一时间推送。