最近开始公众号文章也开始同步更新了,对Java、大数据、人工智能、开发运维相关技术分享,文章对您有用的话,辛苦您也关注下公众号,感谢!


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

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

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

RedisSearch 的关键功能

  1. 全文搜索:支持复杂的查询,包括短语搜索、布尔逻辑、同义词扩展等。
  2. 结构化查询:可对文档中的字段进行范围查询和数值过滤。
  3. 自动补全和搜索建议:为用户提供实时搜索建议。
  4. 地理位置查询:支持基于地理位置的查询。
  5. 高性能和可扩展性:依托 Redis 的内存存取特性,提供极高的查询效率。

与 ElasticSearch 对比

性能对比

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

产品对比

注意

  • 数据存储一栏中,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” 的文档,只返回 titleurl 字段
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"

总结

RedisSearch 为 Redis 提供了强大的搜索功能,从简单的全文搜索到复杂的聚合查询和同义词扩展,都能轻松实现。通过 Docker 快速安装和使用 RedisSearch,可以极大简化开发过程,适用于各种需要实时搜索的应用场景。

10-01 13:48