从Elasticsearch到RedisSearch:探索更快的搜索引擎解决方案

文摘   2024-09-25 08:16   辽宁  
关注下方公众号,获取更多热点资讯

RedisSearch 是 Redis 的一个强大模块,提供了全文搜索二级索引功能,帮助用户在 Redis 中进行复杂的搜索和过滤操作。无论是文本搜索、结构化查询,还是自动补全等功能,RedisSearch 都为需要实时搜索功能的应用提供了理想的解决方案。

RediSearch GitHub:https://github.com/RediSearch/RediSearch

RedisSearch 的关键功能

  1. 1. 全文搜索:支持复杂的查询,包括短语搜索、布尔逻辑、同义词扩展等。

  2. 2. 结构化查询:可对文档中的字段进行范围查询和数值过滤。

  3. 3. 自动补全和搜索建议:为用户提供实时搜索建议。

  4. 4. 地理位置查询:支持基于地理位置的查询。

  5. 5. 高性能和可扩展性:依托 Redis 的内存存取特性,提供极高的查询效率。

与 ElasticSearch 对比

性能对比

为了提供一个清晰的性能对比,下面是一个RedisSearch与Elasticsearch在几个关键性能指标上的比较表格。请注意,这些数据基于特定测试条件下的结果,实际应用中的表现可能会根据具体配置和使用场景有所不同。

指标RedisearchElasticsearch备注
索引速度221秒(5.6百万文档)349秒(5.6百万文档)Redisearch快58%
查询速度12.5K ops/sec3.1K ops/secRedisearch快4倍
查询延迟8毫秒10毫秒Redisearch表现更佳
内存使用通常更高,因为数据存储在内存中主要存储在磁盘,内存用于缓存和索引
写入性能高效,适用于实时写入和更新适合高并发写入场景
查询性能单机环境下查询速度快通过分片分布查询负载,支持近实时搜索
扩展性受限于内存大小水平可扩展,轻松增加节点处理更多数据
易用性简单,与Redis一致的API功能强大但学习曲线陡峭

产品对比

特性/工具RedisSearchElasticsearch
数据存储内存中,支持持久化到磁盘磁盘上,基于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.0title 是一个文本字段,权重为 5.0。

    • • body TEXTbody 是一个文本字段,使用默认权重。

    • • url TEXTurl 是一个文本字段。

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,可以极大简化开发过程,适用于各种需要实时搜索的应用场景。


欢迎关注我的公众号“编程与架构”,原创技术文章第一时间推送。



编程与架构
专注于Java、大数据、AI以及开发运维技术的深入探索与分享。作为一名开源爱好者,致力于分享实战经验和前沿技术动态,帮助更多技术人提升技能。
 最新文章