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

news2024/11/18 20:19:58

文章目录

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


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


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

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

image-852132808978

RedisSearch 的关键功能

  1. 全文搜索:支持复杂的查询,包括短语搜索、布尔逻辑、同义词扩展等。
  2. 结构化查询:可对文档中的字段进行范围查询和数值过滤。
  3. 自动补全和搜索建议:为用户提供实时搜索建议。
  4. 地理位置查询:支持基于地理位置的查询。
  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” 的文档,只返回 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,可以极大简化开发过程,适用于各种需要实时搜索的应用场景。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2169321.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Geoserver使用】2.26.0版本发布主要内容

文章目录 前言一、GeoServer 2.26.0 版本二、主要内容1.Java17支持2.Docker更新3.搜索改进4.广泛的 MapML 改进4.重写演示请求页面5.栅格属性表扩展6.GeoCSS 改进7.地球静止卫星 AUTO 代码8.labelPoint 功能改进9.改进的矢量图块生成10.GeoPackage QGIS 兼容性改进11.新的图像马…

深度学习—神经网络基本概念

一,神经元 1.生物神经元与人工神经元 1.1神经元是人脑的基本结构和功能单位之一。人脑中有数1000亿个神经元,其功能是接受(树突),整合(细胞体),传导(轴突)和…

MySQL --用户管理

文章目录 1.用户1.1用户信息1.2创建用户1.3删除用户1.4修改用户密码 2.数据库的权限2.1给用户授权2.2回收权限 如果我们只能使用root用户,这样存在安全隐患。这时,就需要使用MySQL的用户管理。 1.用户 1.1用户信息 MySQL中的用户,都存储在系…

Spring Cloud 教程(二) | 搭建SpringCloudAlibaba

Spring Cloud 教程(二) | 搭建SpringCloudAlibaba 前言一、SpringBoot 与 SpringCloud 版本对应关系:二、SpringCloud 与 SpringCloudAlibaba版本对应关系:三、SpringCloudAlibaba版本 与 组件版本 对应关系:四、搭建S…

Django项目配置日志

需求 在Django项目中实现控制台输出到日志文件,并且设置固定的大小以及当超过指定大小后覆盖最早的信息。 系统日志 使用Django自带的配置,可以自动记录Django的系统日志。 可以使用logging模块来配置。下面是一个完整的示例代码,展示了如…

Java | Leetcode Java题解之第438题找到字符串中所有字母异位词

题目&#xff1a; 题解&#xff1a; class Solution {public List<Integer> findAnagrams(String s, String p) {int sLen s.length(), pLen p.length();if (sLen < pLen) {return new ArrayList<Integer>();}List<Integer> ans new ArrayList<Int…

163页制造业变革转型:营销/服务/研发/供应链/制造/质量/财务

制造业企业要实现变革转型&#xff0c;可以从营销、服务、研发、供应链、制造、质量、劳务以及人力资源等多个方面着手&#xff1a; 一、营销 市场调研与定位 深入了解目标市场的需求、趋势和竞争态势。通过大数据分析、消费者调研等手段&#xff0c;精准把握市场动态&#…

管家婆分销费用分摊功能使用说明!

在入库和销售业务中&#xff0c;往往会产生一些费用需要和入库单和销售单关联&#xff0c;这时候就可以使用费用分摊的功能。下面我们一起来学习在分销A\V系列软件中费用分摊的操作步骤 一、入库费用分摊 1、只有移动加权平均成本算法才有入库费用分摊单&#xff1b;入库费用分…

centos7系统安装宝塔面板

1、开始安装 适用系统 Centos/OpenCloud/Alibaba 稳定版9.0.0 urlhttps://download.bt.cn/install/install_lts.sh;if [ -f /usr/bin/curl ];then curl -sSO $url;else wget -O install_lts.sh $url;fi;bash install_lts.sh ed8484bec等待命令执行&#xff0c;安装完成&#…

【理解 Java 中的 for 循环】

理解 Java 中的 for 循环 for 循环是 Java 中用于迭代的常用控制结构&#xff0c;它可以帮助我们重复执行某段代码&#xff0c;直到满足特定条件。本文将介绍 for 循环的基本语法、执行流程、注意事项及一些练习。 基本语法 for 循环的基本语法如下&#xff1a; for (循环变…

Linux下的基本指令/命令(一)

目录 基本命令 1. Is命令/指令: 罗列当前目录下指定的文件或者目录. 2. pwd命令&#xff1a; 查看当前工作的路径 3. cd命令&#xff1a; 切换到指定路径下。 只能切换到目录中 4. tree命令: 树状显式目录 使用前要输入命令 yum install -y tree &#xff0c;用来安装一个…

数组模拟邻接表存图

图的定义 图&#xff08;graph&#xff09;是一种非线性数据结构&#xff0c;由顶点和边组成。我们可以将图 抽象地表示为一组顶点和一组边的集合。G(V,E) 图分为有向图和无向图&#xff0c;下图带箭头为有向图&#xff0c;无箭头为无向图 我们可以用两种方式来表示图&#x…

有点快要跟不上时代的感觉

团队的群里面有一个同事突然问了下&#xff0c;下面的这个 JavaScript 如何进行优化 var startIndex (start undefined || start null) ? null : start[0].Value;看上面的代码就是典型的判断和返回的问题。 如果是要调试的话也不是做不出来&#xff0c;但可能要花点时间&a…

【Java】—— 多线程:线程的创建方式3、4___实现Callable与线程池

目录 8.1 新增方式一&#xff1a;实现Callable接口 8.2 新增方式二&#xff1a;使用线程池 8.1 新增方式一&#xff1a;实现Callable接口 与使用Runnable相比&#xff0c; Callable功能更强大些 相比run()方法&#xff0c;可以有返回值 方法可以抛出异常 支持泛型的返回值&…

音视频整体解码流程和同步流程

目录 1. 整体解码流程1. 初始化 FFmpeg2. 打开媒体文件3. 查找解码器4. 打开解码器5. 读取和解码数据6. 处理解码后的帧7. 释放资源 2. 音视频同步整体流程1. 解复用媒体流2. 解码3. 以音频为时钟源进行音视频同步的策略4. 缓冲区设计 现在先说大体流程&#xff0c;不分析代码 …

网络原理 - TCP/IP

文章目录 传输层UDP协议TCP协议TCP协议的核心机制确认应答机制超时重传机制连接管理三次握手四次挥手 滑动窗口流量控制拥塞控制延迟应答捎带应答面向字节流粘包问题 异常情况 小结 网络层IP协议IP地址不够用的问题一、动态分配IP地址二、 NAT机制(网络地址映射)三、使用IPv6 地…

【HarmonyOS】自定义圆点进度条

【HarmonyOS】实现一个自定义带圆点的进度条效果。 方案就是做一个圆角组件&#xff0c;然后利用rotate旋转&#xff0c;至于动画效果&#xff0c;我查了一下文档&#xff0c;只要设置enableSmoothEffect:false&#xff0c;就可以关闭动画&#xff0c;然后自己开个定时器&#…

如何使用代理IP解决反爬虫问题

在网络爬虫的世界里&#xff0c;反爬虫机制就像是守卫城池的士兵&#xff0c;时刻准备着抵御外来的“入侵者”。为了突破这些守卫&#xff0c;代理IP就像是你的隐形斗篷&#xff0c;帮助你在网络世界中自由穿梭。今天&#xff0c;我们就来聊聊如何使用代理IP解决反爬虫问题。 …

【CMake】一、CMake 介绍

CMake 基础介绍 1. CMake 介绍2. CMake 安装3. 入门样例 - Hello-world 工程 1. CMake 介绍 CMake 是一个开源、跨平台的构建系统&#xff0c;主要用于软件的构建、测试和打包。 CMake 使用平台无关的配置文件 CMakeLists.txt 来控制软件的编译过程&#xff0c;并生成适用于不…

叉车司机信息权限采集系统,保障与优化叉车运输网络的安全

叉车司机信息权限采集系统可以通过监控司机的行车行为和车辆状况&#xff0c;实时掌握车辆位置和行驶路线&#xff0c;从而提高运输安全性&#xff0c;优化运输网络&#xff0c;降低事故风险。同时&#xff0c;该系统还可以通过对叉车司机信息和行车数据的分析&#xff0c;优化…