Docker:安装RediSearch全文搜索

1、简述

在本文中,我们将介绍如何使用Docker快速、简便地安装RediSearch,Redis的全文搜索模块。RediSearch提供了高效的全文搜索功能,通过Docker安装,可以轻松地在任何环境中部署和管理RediSearch。在这里插入图片描述
官网地址:https://github.com/RediSearch/RediSearch.git

2、性能

RediSearch是Redis的一个模块,用于实现全文搜索功能。它建立在Redis之上,利用其高性能和灵活性,为用户提供了快速、实时的搜索能力。RediSearch支持各种搜索功能,包括全文搜索、模糊搜索、排序、过滤等,适用于各种场景,如搜索引擎、内容管理系统、电子商务平台等。

  • 索引构建
    在索引构建测试中,RediSearch 用221秒的速度超过了 Elasticsearch的349秒,领先58%。
    在这里插入图片描述
  • 查询性能
    数据集建立索引后,我们使用运行在专用负载生成器服务器上的 32 个客户端启动了两个词的搜索查询。如下图所示,RediSearch 的吞吐量达到了 12.5K ops/sec,而 Elasticsearch 的吞吐量达到了 3.1K ops/sec,快了 4 倍。此外,RediSearch 的延迟稍好一些,平均为 8 毫秒,而 Elasticsearch 为 10 毫秒。
    在这里插入图片描述
    由此可见,RediSearch 在性能上对比 Elasticsearch 有比较大的优势。

3、安装

首先,确保您已经安装了Docker。然后,我们将通过Docker Hub上的官方RediSearch镜像来安装RediSearch。

打开终端或命令行界面,在其中运行以下命令来拉取RediSearch镜像:

docker pull redislabs/redisearch:latest

运行以下命令启动RediSearch容器:

docker run --name redis-search --restart=always -p 6379:6379 -d redislabs/redisearch:latest 

或者

docker run -d --name redis-stack-server --restart=always -p 6379:6379 redis/redis-stack-server:latest

这条命令会从Docker Hub拉取最新版本的RediSearch镜像并在名为redis-search的容器中运行它。参数-p 6379:6379将容器内的6379端口映射到主机的6379端口上。

通过docker exec指令确认当前RediSearch安装是否成功:

[root@localhost ~]# docker exec -it redis-search /bin/bash
root@fb0aa7b3b11b:/data# redis-cli
127.0.0.1:6379> module list
1) 1) "name"2) "search" # 查看是否包含search模块3) "ver"4) (integer) 20015

4、指令

RediSearch模块提供了一系列用于操作全文搜索索引的指令,以下是这些指令的详细解释及示例:

  • FT.CREATE:创建一个新的全文搜索索引。
FT.CREATE index_name SCHEMA field1 type [field2 type ...]

示例:

FT.CREATE idx:goods on hash prefix 1 "goods:" language chinese schema goodsName text sortableFT.CREATE 创建索引命令
idx:goods 索引名称
on hash 索引数据基于hash类型源数据构建
prefix 1 "goods:" 表示要创建索引的源数据前缀匹配规则
language chinese 表示支持中文语言分词
schema 表示字段定义,goodsName元数据属性名 text字段类型 sortable自持排序
  • FT.ADD:向索引中添加一个新文档。
FT.ADD index_name document_id score [NOSAVE] [REPLACE] [LANGUAGE lang] [PAYLOAD payload]FIELDS field1 value1 [field2 value2 ...]

示例:

FT.ADD idx:goods doc1 1.0 FIELDS title "RedisSearch Introduction" body "RedisSearch is a full-text search engine built on top of Redis"docId: 这里说是id并不代表只能说数字,可以是字符串。作为document的唯一标识。
score: 评分,类似于zset里的score,范围从0~1,如果不知道打多少可以默认打1。
NOSAVE:如果开启该选项我们不会在索引时保存真正的document。
REPLACE:更新或者插入,删除原本的document
PARTIAL (only applicable with REPLACE):在replace的时候指定对应的列
FIELDS: 字段对应create index时的schema
PAYLOAD {payload}: 在查询的时候使用,还不是太理解。。。
IF {condition}: 配合replace使用,对判断语句进行判断后决定是否生效replace e.g. FT.ADD idx doc 1 REPLACE IF "@timestamp < 23323234234".
LANGUAGE language: 指定语言,可以是中文:chinese
  • FT.SEARCH:在索引中执行全文搜索。
FT.SEARCH index_name query [NOCONTENT] [VERBATIM] [NOSTOPWORDS] [WITHSCORES] [WITHSORTKEYS] [FILTER field value [field value ...]][GEOFILTER field lon lat radius m|km|mi|ft] [INKEYS num_keys key [key ...]] [INFIELDS num_fields field [field ...]][RETURN num_docs [ASC|DESC]] [SUMMARIZE [FIELDS num_fields field [field ...]] LEN len FRAGS frags][HIGHLIGHT [FIELDS num_fields field [field ...]] [TAGS open close] [FRAGS frags] [LEN len] [SEPARATOR sep] [MAXLEN len] [ELIPSIS ellipsis]][SLOP slop] [INORDER] [LANGUAGE lang] [EXPANDER expander] [SCORER scorer] [PAYLOAD]

示例:

FT.SEARCH idx:goods "RedisSearch"
  • FT.AGGREGATE:在索引中执行聚合操作。
FT.AGGREGATE index_name query [LOAD [NUM num] [TERMS term [..]] [PROPERTIES prop [..]] [GROUPBY field [..]] [REDUCE reduce_function | REDUCER reduce_function]] [APPLY function [..]] [FILTER filter [..]] [SORTBY field [asc|desc] | MAX num [BY field [asc|desc]] [MAXTERMS num] [WITHCURSOR] [WITHFILTER] [WITHSORTKEYS]

示例:

FT.AGGREGATE idx:goods "*" GROUPBY 1 @title REDUCE COUNT 0 AS num_docs
  • FT.INFO:获取索引的信息。
FT.INFO index_name

示例:

FT.INFO idx:goods 
  • FT.DROPINDEX:删除指定的索引。
FT.DROPINDEX index_name [DD]

示例:

FT.DROPINDEX idx:goods 

以上是RediSearch模块中常用的指令及其详细解释和示例。通过这些指令,您可以在Redis中轻松构建和管理全文搜索索引,并执行各种搜索和聚合操作。

5、应用

接下来,我们将展示如何使用Java来连接到RediSearch并进行查询。我们将使用Jedis作为Redis的Java客户端库,确保您已经将其添加到项目依赖中:

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.2.5</version><relativePath/> <!-- lookup parent from repository -->
</parent>
//jedis 4.0以上版本就默认支持RediSearch
<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>5.1.0</version>
</dependency>

以下是一个简单的Java类,演示了如何连接到RediSearch并执行一个简单的全文搜索查询:

package com.example.lkfy.example;import org.apache.commons.lang.StringUtils;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.springframework.beans.factory.annotation.Autowired;
import redis.clients.jedis.*;
import redis.clients.jedis.search.*;import java.time.Duration;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;public class RedisSearchExample {public static final String GOODS_IDX_PREFIX = "idx:goods:";@Autowiredprivate UnifiedJedis client;public RedisSearchExample() {GenericObjectPoolConfig jedisPoolConfig = new JedisPoolConfig();jedisPoolConfig.setMaxIdle(10);jedisPoolConfig.setMaxWaitMillis(3000);jedisPoolConfig.setJmxEnabled(false);client = new JedisPooled(jedisPoolConfig, "192.168.157.128", 6379, 1000, "123456",0);}/*** 新增索引数据*/private void hset(String keyPrefix, Map<String, String> hash) {// 支持中文hash.put("_language", "chinese");client.hset(keyPrefix, hash);}/*** 查询索引列表*/public Set<String> listIndex() {return client.ftList();}/*** 创建索引** @param idxName 索引名称* @param prefix  要索引的数据前缀* @param schema  索引字段配置*/public void createIndex(String idxName, String prefix, Schema schema) {IndexDefinition rule = new IndexDefinition(IndexDefinition.Type.HASH).setPrefixes(prefix).setLanguage("chinese");client.ftCreate(idxName,IndexOptions.defaultOptions().setDefinition(rule),schema);}/*** 查询** @param idxName 索引名称* @param search  查询key* @param sort    排序字段* @return searchResult*/public SearchResult query(String idxName, String search, String sort) {Query q = new Query(search);if (StringUtils.isNotBlank(sort)) {q.setSortBy(sort, false);}q.setLanguage("chinese");q.limit(0, 10);return client.ftSearch(idxName, q);}public static void main(String[] args) {RedisSearchExample example = new RedisSearchExample();String id ="1";Map<String, String> hash = new HashMap<>();hash.put("id",id);hash.put("goodsName","你好hello");example.hset("idx:goods" , hash );SearchResult searchResult = example.query("idx:goods","*", null);System.out.println(searchResult.toString());}}

6、优点和场景

RediSearch是Redis的全文搜索模块,具有以下优点和适用场景:

6.1 优点
  • 快速高效: RediSearch基于倒排索引实现,具有高效的全文搜索能力,能够快速地处理大量文本数据。
  • 与Redis集成: RediSearch是作为Redis模块而不是单独的软件包提供的,因此可以与现有的Redis部署集成,无需额外的基础设施或管理开销。
  • 分布式支持: RediSearch支持分布式部署,可以水平扩展以处理大量的搜索请求。
  • 丰富的搜索功能: 提供了丰富的搜索功能,包括全文搜索、模糊搜索、排序、过滤等,能够满足各种搜索需求。
  • 实时索引更新: 支持实时索引更新,可以在数据变更时立即更新索引,保持搜索结果的实时性。
  • 轻量级: RediSearch是一个轻量级的模块,易于安装、部署和管理。
6.2 应用场景:
  • 实时搜索引擎: 适用于构建实时搜索引擎,能够快速地处理用户的搜索请求,并返回相关的搜索结果。
  • 内容管理系统: 可以用于构建内容管理系统,支持对大量文本数据进行全文搜索、过滤和排序。
  • 电子商务平台: 用于构建电子商务平台的搜索功能,支持商品搜索、过滤和排序,提供更好的用户搜索体验。
  • 社交网络: 适用于构建社交网络平台,支持用户搜索、内容搜索等功能。
  • 日志分析: 可以用于实时分析和搜索日志数据,支持日志检索、过滤和分析。
  • 实时推荐系统: 用于构建实时推荐系统,支持对用户喜好进行实时搜索和推荐。

总的来说,RediSearch具有高效、快速、易于集成和扩展的特点,适用于各种需要全文搜索功能的应用场景。

7、总结

通过本文,您学习了如何使用Docker快速、简便地安装RediSearch。RediSearch是Redis的全文搜索模块,提供了高效、实时的全文搜索功能,适用于各种场景。使用Docker安装RediSearch可以轻松地在任何环境中部署和管理RediSearch,为您的应用程序提供强大的全文搜索能力。希望本文对您有所帮助!

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

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

相关文章

【GUI】LVGL无操作系统移植以及移植过程错误处理

目录 介绍 1. 删除源码 2. 导入lvgl到项目screen_mcu中 3. keil添加分组和头文件 4. 移植显示 5. 移植触摸 6. 添加测试案例 6.1. 测试按钮 6.2. 测试音乐界面 7. 提供时钟 错误处理 L6218E错误 出现花屏 屏幕颜色不对 内存分配 介绍 本文 主要介绍GD32移植…

BlockingQueue详解(含动画演示)

目录 BlockingQueue详解0、BlockingQueue简介BlockingQueue接口中方法注释BlockingQueue的实现&#xff0c;总结计划 1、ArrayBlockingQueue简介2、ArrayBlockingQueue的继承体系3、ArrayBlockingQueue的构造方法①、 ArrayBlockingQueue(int capacity)②、ArrayBlockingQueue(…

计算机组成原理 —— 存储系统(概述)

计算机组成原理 —— 存储系统&#xff08;概述&#xff09; 存储系统按层次划分按照存储介质分类按照存储方式分类按照信息可更改性分类根据信息的可保存性分类存储器性能指标 我们今天来学习计算机组成原理中的存储系统&#xff1a; 存储系统 存储系统是计算机系统中用于存…

vue实现的商品列表网页

一、商品列表效果如下 二、代码&#xff1b; vue实现的商品列表网页 &#xff0c; 图片在vue项目的Public文件夹里的 imgs中 <template><div class"common-layout"><!-- el-container:外层容器。 当子元素中包含 <el-header> 或 <el-foo…

mysql:简单理解mysql mvcc的可重复读

# 原理 假设有这样的sql begin select&#xff08;或update、insert、delete&#xff09; ... commit当执行【begin】的时候&#xff0c;标记有一个新事务要开始&#xff0c;但是事务还没有真正开始&#xff0c;事务id还没有产生当执行事务里面的第一个sql语句时&#xff08;…

java之url任意跳转漏洞

1 漏洞介绍 URLRedirect url重定向漏洞也称url任意跳转漏洞&#xff0c;网站信任了用户的输入导致恶意攻击&#xff0c;url重定向主要用来钓鱼&#xff0c;比如url跳转中最常见的跳转在登陆口&#xff0c;支付口&#xff0c;也就是一旦登陆将会跳转任意自己构造的网站&#xf…

Xshell7免费版下载安装使用

​一、下载安装​ 1.打开官网下载 https://www.xshell.com/zh/free-for-home-school/ 2.选择合适的下载路径&#xff0c;点击下载按钮&#xff0c;然后按照提示完成安装。 二、Xshell7的使用&#xff0c;Xhell连接Linux 1.连接之前&#xff0c;确保在Linux中开启SSH。参考&a…

YOLOv8中的C2f模块

文章目录 一、结构概述二、模块功能 一、结构概述 C2f块:首先由一个卷积块(Conv)组成&#xff0c;该卷积块接收输入特征图并生成中间特征图特征图拆分:生成的中间特征图被拆分成两部分&#xff0c;一部分直接传递到最终的Concat块&#xff0c;另一部分传递到多个Botleneck块进…

QT基础 - 文本文件读写

目录 零. 前言 一.读取文件 二. 写入文件 三. 和二进制读写的区别 零. 前言 在 Qt 中&#xff0c;对文本文件进行读写操作是常见的任务之一。这对于保存和加载配置信息、处理数据文件等非常有用。 Qt 提供了多种方式来读写文本文件&#xff0c;使得文件操作变得相对简单和…

SwiftUI 6.0(iOS 18)ScrollView 全新的滚动位置(ScrollPosition)揭秘

概览 在只有方寸之间大小的手持设备上要想体面的向用户展示海量信息&#xff0c;滚动视图&#xff08;ScrollView&#xff09;无疑是绝佳的“东牀之选”。 在 SwiftUI 历史的长河中&#xff0c;总觉得苹果对于 ScrollView 视图功能的升级是在“挤牙膏”。这不&#xff0c;在本…

spire.Pdf 将pdf转成image

一、nuget安装 <ItemGroup><PackageReference Include"Spire.PDF" Version"10.6.7" /></ItemGroup> 二、直接上代码 using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using System; using System.IO;namespace …

乱弹篇(35)掩耳盗铃与两三十年

成语“ 掩耳盗铃 ”&#xff0c;比喻自己欺骗自己&#xff0c;明明是掩盖不住的事情偏要想法子掩盖。它多用来讽刺那些做事不想让别人知道&#xff0c;却偏偏又引起他人注意的人。 现在网络上以新浪微博和邪恶的“800727”为典型的自媒体平台和其掌控者&#xff0c;就是现代版…

提升研发效率:三品PLM解决方案在汽车汽配行业的实践

随着全球汽车市场的快速发展&#xff0c;中国汽车汽配行业迎来了前所未有的发展机遇。然而&#xff0c;在这一过程中&#xff0c;企业也面临着诸多挑战&#xff0c;如研发能力的提升、技术资料管理的复杂性、以及跨部门协作的困难等。为了应对这些挑战&#xff0c;三品产品生命…

模式分解算法-满足3NF的无损且保持函数依赖的分解算法、满足BCNF的无损连接分解算法

一、引言 1、对指定的关系模式&#xff0c;若范式级别较低&#xff0c;为第一范式或第二范式&#xff0c;由于存在数据冗余或更新异常问题&#xff0c;在实际中一般是不可用的&#xff0c;关系模式的规范化就是将满足低一级的关系模式分解为若干满足高一级范式的关系模式的集合…

Python轻松设置Excel单元格数字显示格式

Excel作为强大的数据处理与分析工具&#xff0c;不仅能够存储大量数据&#xff0c;还支持复杂的数据处理与可视化功能。而如何恰当地展示Excel表格中的数据是Excel文件制作的关键之一。这便涉及到Excel单元格数字格式的设置。数字格式不仅关乎数据的美学呈现&#xff0c;如货币…

聊聊 C# dynamic 类型,并分享一个将 dynamic 类型变量转为其它类型的技巧和实例

前言 dynamic 是一种有别于传统变量类型的动态类型声明&#xff0c;刚开始接触可能在理解上会有些困难&#xff0c;可以简单地把它理解为一个盲盒&#xff0c;你可以任意猜测盒子有什么东西&#xff0c;并认为这些东西真正存在而进行处理&#xff0c;等到真正打开时&#xff0…

网上的流量卡真的可以免费领取吗?

网上的流量卡真的可以免费领取吗&#xff1f;当然可以&#xff0c;目前运营商推出的流量卡都是可以免费领取的。 有很多朋友私信给小编&#xff0c;听说流量卡是免费领取的就觉得不太靠谱&#xff0c;其实这种想法是不对的&#xff0c;首先大家要换位思考一下&#xff0c;如果我…

Ubuntu配置ssh+vnc(完整版)

Ubuntu配置sshvnc&#xff08;完整版&#xff09; 1 配置ssh 1. 安装openssh-server&#xff0c;配置开机自启 # 更新包 sudo apt-get update # 安装openssh-server sudo apt-get install -y openssh-server # 启动服务 sudo service ssh start # 配置开机自启 sudo systemc…

细说MCU定时器模块的输入捕捉功能的实现方法

目录 一、工程背景 二、建立工程 1、配置GPIO 2、选择时钟源和Debug 3、 配置定时器TIM1 4、 配置定时器TIM13 5、配置串口 6、配置中断 7、配置系统时钟 三、代码修改 1、使能TIM1输入捕捉功能和TIM3的PWM输出功能 2、自定义变量 3、重定义回调函数 4、输出到…

【国际化I18n使用方法】vue2使用i18简单实现多语种切换,刷新保持,动态数据处理

效果图 使用流程 总结就是&#xff0c;安装好插件后&#xff0c;配置几个语言的js文件&#xff0c;每个词都要在每个js内写一遍对应的语言&#xff0c;然后通过切换js文件拿到对应的语言&#xff0c;实现翻译的效果。然后当前使用什么语言保存到本地&#xff0c;这样刷新就可以…