Docker:安装RediSearch全文搜索

news2024/11/26 4:31:58

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 sortable

FT.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:";


    @Autowired
    private 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.coloradmin.cn/o/1849213.html

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

相关文章

18.cobra框架了解

目录 概述举例安装实践实践 概述 github cobra cobra 快速的实现一个命令行客户端&#xff0c;命令行解析工具。 cobra 中的主要概念 -Commands 表示执行运作-Args 执行参数-Flags 这些运作的标识符 举例 git clone 命令 git clone https://github.com/spf13/cobra.git -…

白嫖游戏指南,Epic喜加二:《Freshly Frosted》《Rumble Club》

前言 Epic喜加二&#xff1a;《Freshly Frosted》《Rumble Club》《Freshly Frosted》简介&#xff1a; 《Rumble Club》简介&#xff1a; 前言 接下来有时间会分享一些游戏相关可以白嫖的资源&#xff0c;包括游戏本体、游戏素材资源等等。 有需要的小伙伴可以关注这个专栏&…

文件批量改名利器:一键实现文件名中字母统一转为大写,让文件管理更高效有序!

在日常工作和生活中&#xff0c;我们经常会遇到需要批量重命名文件的情况。尤其是当文件名中包含字母时&#xff0c;如果希望将所有字母统一更改为大写&#xff0c;传统的逐个修改方式无疑会耗费大量时间。不过&#xff0c;有了高效的文件批量改名工具&#xff0c;这一难题将迎…

【C++】平衡二叉树(AVL树)的实现

目录 一、AVL树的概念二、AVL树的实现1、AVL树的定义2. 平衡二叉树的插入2.1 按照二叉排序树的方式插入并更新平衡因子2.2 AVL树的旋转2.2.1 新节点插入较高左子树的左侧&#xff08;LL平衡旋转&#xff09;2.2.2 新节点插入较高右子树的右侧&#xff08;RR平衡旋转&#xff09…

【计算机毕业设计】204基于微信小程序疫情期间学生请假与销假系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

windows使用curl命令出现乱码的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

第3章 小功能大用处-发布订阅

Redis提供了基于“发布/订阅”模式的消息机制&#xff0c;此种模式下&#xff0c;消息发布者和订阅者不进行直接通信&#xff0c;发布者客户端向指定的频道&#xff08;channel&#xff09;发布消息&#xff0c;订阅该频道的每个客户端都可以收到该消息。 命令&#xff1a;Red…

【CPP】插入排序、希尔排序

目录 1.插入排序1.1直接插入排序简介代码分析 1.2直接插入对比冒泡排序简介代码对比分析(直接插入排序与冒泡的复杂度效率区别) 1.3希尔排序简介代码分析 1.插入排序 基本思想&#xff1a;把一个待排数字按照关键码值插入到一个有序序列中&#xff0c;得到一个新的有序序列。 …

高校新闻头条系统

摘 要 随着互联网技术的快速发展&#xff0c;网络几乎成为了人们搜集信息和交流沟通最方便、快捷的通道&#xff0c;科技创新一直在影响着人们的生活&#xff0c;人们的衣食住行也在不断变化&#xff0c;与此同时&#xff0c;也大大改变了人们获取信息的方式&#xff0c;人们获…

甘肃旅游服务平台的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;公告信息管理&#xff0c;景点管理&#xff0c;酒店管理&#xff0c;基础数据管理&#xff0c;美食管理 前台账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0…

kafka第二篇——主题创建,主题分区副本分配策略

目录 主题创建 引入 回顾主题&#xff0c;分区&#xff0c;副本关系 代码 主题分区副本分配策略 底层逻辑分析 主题创建 引入 为啥才开始在idea上跑代码&#xff0c;topic都没创建出来&#xff0c;就直接跑出来了? 这是因为AutoTopicCreationManger参数可以自动创建主题…

首个AI高考全卷评测结果出分,大模型“考生”表现如何?

内容提要 大部分大模型“考生”语文、英语科目表现良好&#xff0c;但在数学方面还有待加强。阅卷老师点评&#xff0c;在语文科目上&#xff0c;对于语言中的一些“潜台词”&#xff0c;大模型尚无法完全理解。在数学科目上&#xff0c;大模型的主观题回答相对凌乱&#xff0…

关于运用人工智能帮助自己实现英语能力的有效提升?

# 实验报告 ## 实验目的 - 描述实验的目标&#xff1a;自己可以知道&#xff0c;自己的ai学习方法是否可以有效帮助自己实现自己的学习提升。 预期结果&#xff1a;在自己利用科技对于自己进行学习的过程中&#xff0c;自己的成长速度应该是一个幂指数的增长 ## 文献回顾 根据…

LabVIEW开发电机故障监测系统

开发了一套基于LabVIEW的智能电机故障监测系统&#xff0c;通过实时监测和分析电机运行参数&#xff0c;实现故障预测和诊断。系统集成了振动传感器、温度传感器、数据采集模块和分析模块&#xff0c;利用RS-485通信总线和Modbus协议确保数据的高精度实时传输&#xff0c;故障预…

Bootloader -- U-Boot 介绍

Bootloader -- U-Boot 介绍 1 介绍1.1 概述1.2 知名 BootloaderLILO (Linux Loader)GRUB (GNU GRand Unified Bootloader)LoadlinROLO (Rockbox Loader)EtherbootLinuxBIOS (现在叫 coreboot)BLOBU-BootRedBoot 1.3 BootLoader 和 Monitor 区别1.4 U-Boot 的源码结构1.5 U-Boot…

Keil MDK生成LIB库以及使用LIB库

一.keil下lib静态库的使用具有以下优点&#xff1a; 1.封装源代码&#xff0c;对外不开放&#xff0c;提高保密性。 2.将标准功能函数封装成库&#xff0c;提高代码的复用性。 3.使用库开发&#xff0c;简化开发流程&#xff0c;提高开发效率。 4.系统调用库函数&#xff0…

无人直播不封号美女舞团3.0 多重防非操作(教程+素材+工具)

在这个数字化的时代&#xff0c;直播已经成为了一种新的商业模式。然而&#xff0c;如何打造一个24小时自动循环播放的直播间&#xff0c;并通过此获得收益&#xff0c;却是许多人面临的挑战。本文将介绍如何通过使用OBS和咩播软件&#xff0c;创建一个能够吸引人们进入直播间并…

VMware vSphere Bitfusion 4.5.4 - 面向 AI 和 ML 应用提供弹性基础架构

VMware vSphere Bitfusion 4.5.4 - 面向 AI 和 ML 应用提供弹性基础架构 请访问原文链接&#xff1a;VMware vSphere Bitfusion 4.5.4 - 面向 AI 和 ML 应用提供弹性基础架构&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org VM…

VBA学习(18):VBA制作任意工作表均可使用的聚光灯

在需要制作聚光的工作簿&#xff0c;按<ALTF11>组合键&#xff0c;打开VBE编辑器。在右侧[工程资源管理器窗格]选中ThisWorkbook模块&#xff0c;将以下代码复制粘贴到该模块的代码窗口。 Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target …

软件缺陷及JIRA工具

一、软件缺陷及跟踪流程 1&#xff0c;软件缺陷信息 案例 &#xff08;1&#xff09;缺陷报告的基本内容 缺陷的标题 预置条件 重现步骤 期望结果 实际结果 &#xff08;2&#xff09;软件缺陷的状态 新建 打开 修复 关闭 &#xff08;3&#xff09;软件缺陷的严重程度 …