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

文章目录

    • [RedisSearch 的关键功能](#RedisSearch 的关键功能)
    • [与 ElasticSearch 对比](#与 ElasticSearch 对比)
    • [如何使用 Docker 安装 RedisSearch](#如何使用 Docker 安装 RedisSearch)
      • [1. 获取 RedisSearch Docker 镜像](#1. 获取 RedisSearch Docker 镜像)
      • [2. 启动 RedisSearch 容器](#2. 启动 RedisSearch 容器)
      • [3. 验证安装](#3. 验证安装)
    • [RedisSearch 使用示例](#RedisSearch 使用示例)
      • [1. 连接到 RedisSearch](#1. 连接到 RedisSearch)
      • [2. 创建索引](#2. 创建索引)
      • [3. 添加文档](#3. 添加文档)
      • [4. 执行搜索](#4. 执行搜索)
        • [搜索所有包含 "Redisearch" 的文档:](#搜索所有包含 "Redisearch" 的文档:)
        • [搜索标题包含 "Docker" 的文档](#搜索标题包含 "Docker" 的文档)
        • [搜索包含 "Docker" 的文档,只返回 `title` 和 `url` 字段](#搜索包含 "Docker" 的文档,只返回 titleurl 字段)
      • 使用排序
      • 删除文档和索引
      • 聚合查询
      • 同义词设置
    • 总结

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


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 镜像:

shell 复制代码
docker pull redislabs/redisearch

2. 启动 RedisSearch 容器

使用以下命令运行 RedisSearch 容器,并将 Redis 服务映射到本地的 6379 端口:

shell 复制代码
docker run -it -d -p 6379:6379 --name redis-search redislabs/redisearch:latest 

3. 验证安装

通过以下命令检查 Redis 模块是否安装成功。出现 search 模块表示成功:

shell 复制代码
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 容器:

shell 复制代码
docker exec -it redis-search redis-cli

2. 创建索引

在 RedisSearch 中,创建索引是第一步。你需要定义文档结构及其字段类型:

shell 复制代码
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 命令进行全文搜索。以下是一些示例:

shell 复制代码
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 字段
shell 复制代码
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"

使用排序

可以对搜索结果进行排序。例如,按标题进行升序排列:

shell 复制代码
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 分组,并计算每组的文档数量。

shell 复制代码
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"

同义词设置

shell 复制代码
# 创建索引
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,可以极大简化开发过程,适用于各种需要实时搜索的应用场景。

相关推荐
lucky_syq10 分钟前
Saprk和Flink的区别
大数据·flink
lucky_syq11 分钟前
流式处理,为什么Flink比Spark Streaming好?
大数据·flink·spark
袋鼠云数栈12 分钟前
深入浅出Flink CEP丨如何通过Flink SQL作业动态更新Flink CEP作业
大数据
小白学大数据1 小时前
如何使用Selenium处理JavaScript动态加载的内容?
大数据·javascript·爬虫·selenium·测试工具
15年网络推广青哥2 小时前
国际抖音TikTok矩阵运营的关键要素有哪些?
大数据·人工智能·矩阵
节点。csn2 小时前
Hadoop yarn安装
大数据·hadoop·分布式
arnold663 小时前
探索 ElasticSearch:性能优化之道
大数据·elasticsearch·性能优化
NiNg_1_2344 小时前
基于Hadoop的数据清洗
大数据·hadoop·分布式
成长的小牛2335 小时前
es使用knn向量检索中numCandidates和k应该如何配比更合适
大数据·elasticsearch·搜索引擎
goTsHgo5 小时前
在 Spark 上实现 Graph Embedding
大数据·spark·embedding