当前位置: 首页 > news >正文

Spring Boot集成Redis Search快速入门Demo

1.什么是Redis Search?

RedisSearch 是一个基于 Redis 的搜索引擎模块,它提供了全文搜索、索引和聚合功能。通过 RedisSearch,可以为 Redis 中的数据创建索引,执行复杂的搜索查询,并实现高级功能,如自动完成、分面搜索和排序。利用 Redis 的高性能特点,RedisSearch 可以实现高效的搜索和实时分析。对于微服务架构来说,RedisSearch 可以作为搜索服务的一部分,提供快速、高效的搜索能力,对于提高用户体验和性能具有重要的意义。

2.环境搭建

Docker Compose

version: '3'
services:redis:image: redis/redis-stackcontainer_name: redisports:- 6379:6379redis-insight:image: redislabs/redisinsightcontainer_name: redis-insightports:- 8001:8001

Run following command:

docker-compose up -d

redis-insights-connection

3.代码工程

实验目的

利用redis search 实现文本搜索功能

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.2.1</version></parent><modelVersion>4.0.0</modelVersion><artifactId>RedisSearch</artifactId><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-autoconfigure</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>com.redis.om</groupId><artifactId>redis-om-spring</artifactId><version>0.8.2</version></dependency><dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-redis</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency></dependencies>
</project>

controller

package com.et.controller;import com.et.redis.document.Student;
import com.et.redis.document.StudentRepository;
import com.et.redis.hash.Person;
import com.et.redis.hash.PersonRepository;
import jakarta.websocket.server.PathParam;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;@RestController
public class WebController {private PersonRepository personRepository;private StudentRepository studentRepository;public WebController(PersonRepository personRepository, StudentRepository studentRepository) {this.personRepository = personRepository;this.studentRepository = studentRepository;}@PostMapping("/person")public Person save(@RequestBody Person person) {return personRepository.save(person);}@GetMapping("/person")public Person get(@PathParam("name") String name, @PathParam("searchLastName") String searchLastName) {if (name != null)return this.personRepository.findByName(name).orElseThrow(() -> new RuntimeException("person not found"));if (searchLastName != null)return this.personRepository.searchByLastName(searchLastName).orElseThrow(() -> new RuntimeException("person not found"));return null;}// ---- Student Endpoints@PostMapping("/student")public Student saveStudent(@RequestBody Student student) {return studentRepository.save(student);}@GetMapping("/student")public Student getStudent(@PathParam("name") String name, @PathParam("searchLastName") String searchLastName) {if (name != null)return this.studentRepository.findByName(name).orElseThrow(() -> new RuntimeException("Student not found"));if (searchLastName != null)return this.studentRepository.searchByLastName(searchLastName).orElseThrow(() -> new RuntimeException("Student not found"));return null;}@ExceptionHandler(value = RuntimeException.class)public ResponseEntity handleError(RuntimeException e) {return ResponseEntity.status(HttpStatus.NOT_FOUND).body(e.getMessage());}}

@RedisHash 方式

package com.et.redis.hash;import com.redis.om.spring.annotations.Indexed;
import com.redis.om.spring.annotations.Searchable;
import org.springframework.data.annotation.Id;
import org.springframework.data.redis.core.RedisHash;@RedisHash
public class Person {@Idprivate String id;@Indexedprivate String name;@Searchableprivate String lastName;public String getId() {return id;}public void setId(String id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getLastName() {return lastName;}public void setLastName(String lastName) {this.lastName = lastName;}
}
package com.et.redis.hash;import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;import java.util.Optional;@Repository
public interface PersonRepository extends CrudRepository<Person, String> {Optional<Person> findByName(String name);Optional<Person> searchByLastName(String name);
}

@Document 方式

package com.et.redis.document;import com.redis.om.spring.annotations.Document;
import com.redis.om.spring.annotations.Indexed;
import com.redis.om.spring.annotations.Searchable;
import org.springframework.data.annotation.Id;@Document
public class Student {@Idprivate String id;@Indexedprivate String name;@Searchableprivate String lastName;public String getId() {return id;}public void setId(String id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getLastName() {return lastName;}public void setLastName(String lastName) {this.lastName = lastName;}
}
package com.et.redis.document;import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;import java.util.Optional;@Repository
public interface StudentRepository extends CrudRepository<Student, String> {Optional<Student> findByName(String name);Optional<Student> searchByLastName(String name);
}

DemoApplication

package com.et;import com.redis.om.spring.annotations.EnableRedisDocumentRepositories;
import com.redis.om.spring.annotations.EnableRedisEnhancedRepositories;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@EnableRedisDocumentRepositories(basePackages = "com.et.redis.document")
@EnableRedisEnhancedRepositories(basePackages = "com.et.redis.hash")
@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
}

application.yaml

server:port: 8088
spring:redis:host: localhostport: 6379

只是一些关键代码,所有代码请参见下面代码仓库

代码仓库

  • https://github.com/Harries/springboot-demo(redis search)

4.测试

启动Spring boot应用

测试hash方式

插入一个实体

person-create

查询

person-index

    模糊查询redis数据(*rab*)

redis-search

查看redis数据库数据

redis-browser

redis数据库模糊查询

redis-insight-search-index

测试json document方式

同样的方式插入json文档,然后在你redis数据库里面查看

redis-insight-redis-json

5.引用

  • https://blog.devgenius.io/redis-search-with-spring-boot-and-redis-om-searchable-indexed-ttl-ccf2fb027d96
  • How to Search & Query Redis with A Spring Boot Application | RefactorFirst
  • Spring Boot集成Redis Search快速入门Demo | Harries Blog™

 

相关文章:

Spring Boot集成Redis Search快速入门Demo

1.什么是Redis Search&#xff1f; RedisSearch 是一个基于 Redis 的搜索引擎模块&#xff0c;它提供了全文搜索、索引和聚合功能。通过 RedisSearch&#xff0c;可以为 Redis 中的数据创建索引&#xff0c;执行复杂的搜索查询&#xff0c;并实现高级功能&#xff0c;如自动完…...

提升工作效率神器

这五款软件让你事半功倍 在当今快节奏的社会中&#xff0c;提高工作效率成为了每个人追求的目标。而在这个数字化时代&#xff0c;选择对的软件工具无疑是提高效率的关键。今天&#xff0c;我为大家推荐五款优秀的工作效率软件&#xff0c;帮助你在工作中事半功倍。 1、亿可达…...

统信服务器操作系统【targetcli部署】

targetcli部署方案 文章目录 功能概述功能介绍1.安装targetcli2.targetcli语法及参数说明3.示例1. 配置2.访问功能概述 SCSI 即小型计算机系统接口(Small Computer System Interface;简写:SCSI) iSCSI,internet SCSI 网络磁盘 ,提供一对一的网络存储, 主机A 提供xx存储设…...

I2C中继器TCA9517A(TI)

一、芯片介绍 本芯片是一款具有电平转换功能的双向缓冲器&#xff0c;适用于I2C和SMBus系统&#xff0c;同时支持各种拓扑结构的扩展使用。芯片支持SCL和SDA缓冲&#xff0c;因此允许两条总线的负载电容达到400pF。 TCA9517A的A和B侧驱动器是不同的&#xff0c;但是均可耐受5…...

基于单片机的智能电话控制系统设计

摘要: 为了能够使用电话实现电器设备的控制,文中通过单片机及双音多频解码集成电路,使用用 户通过电话输入相应的指令就能够实现远程设备的智能化控制。文章主要对系统的构成、软件及 硬件设计进行了简单的介绍,并且对其中的电路进行了简单的说明,比如语音提示、双音频解…...

Go 综合题面试题

1. Golang 中 make 和 new 的区别&#xff1f; #make 和 new 都用于内存分配1&#xff1a;接收参数个数不一样&#xff1a; new() 只接收一个参数&#xff0c;而 make() 可以接收3个参数2&#xff1a;返回类型不一样&#xff1a; new() 返回一个指针&#xff0c;而 make() 返回…...

【Python报错已解决】AttributeError: ‘Tensor‘ object has no attribute ‘kernel_size‘

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 专栏介绍 在软件开发和日常使用中&#xff0c;BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…...

Spring MVC 参数校验 总结

1. 简介 Sping MVC提供了参数校验的方便注解。 2.代码 在pom.xml中添加依赖&#xff1a; <dependency><groupId>org.hibernate.validator</groupId><artifactId>hibernate-validator</artifactId><version>8.0.0.Final</version&g…...

【图像压缩与重构】基于BP神经网络

课题名称&#xff1a;基于BP神经网络的图像压缩与重构&#xff08;带GUI) 相关资料&#xff1a; 1. 代码注释 2.BP神经网络原理文档资料 3.图像压缩原理文档资料 程序实例截图&#xff1a;...

数据结构--单链表创建、增删改查功能以及与结构体合用

一、作业要求 单链表操作&#xff0c;要求节点是结构体类型&#xff0c;实现以下功能&#xff1a; 1.尾插学生 2.任意位置插入学生 3.任意位置删除学生 4.逆置单链表 5.学生按学号排序 6.销毁单链表 二、实现过程 1.代码如下&#xff1a; &#xff08;1&#xff09;头…...

开源ids snort (windows版)

Snort-IPS-on-Windows-main资源-CSDN文库 GitHub - eldoktor1/Snort-IPS-on-Windows: A comprehensive guide to installing and configuring Snort IPS on Windows, ensuring robust network security 手动打造Snortbarnyard2BASE可视化告警平台 - FreeBuf网络安全行业门户 …...

关于 vue3 axios的封装,并发请求相关

简介 Axios 是一个基于 promise 网络请求库&#xff0c;作用于node.js 和浏览器中。 它是 isomorphic 的(即同一套代码可以运行在浏览器和node.js中)。在服务端它使用原生 node.js http 模块, 而在客户端 (浏览端) 则使用 XMLHttpRequests。 请求方法别名 为了方便起见&#x…...

cpp中的namespace详解

namespace的作用主要是为了避免名字冲突和组织代码。 命名空间在C中是一个非常重要的特性&#xff0c;它帮助开发者更好地管理代码和避免潜在的冲突。 具体来说&#xff0c;它有以下几个主要用途 避免名字冲突 在大型项目中可能会有很多个类、函数或变量使用相同的名称。使用…...

request库的使用 | get请求

requests 库的 get 方法用于发送 HTTP GET 请求。GET 请求通常用于请求服务器发送数据。 1、导入 requests 库&#xff1a; import requests 2、发送 GET 请求&#xff1a; 使用 requests.get() 方法发送请求。 response requests.get(urlhttp://www.jd.com) 3、查看响应…...

理想低通信道和理想带通信道的区别

一、定义与特性 理想低通信道&#xff08;可通过<MAX&#xff09;&#xff1a; 定义&#xff1a;理想低通信道允许信号的所有低频分量&#xff0c;只要其频率不超过某个上限值&#xff0c;都能够不失真地通过此信道。而频率超过该上限值的所有高频分量都不能通过该信道。特…...

LAMP架构搭建

目录 LAMP架构搭建 编译安装Apache httpd服务 1、需要的安装包 2、关闭防火墙和核心防护 3、安装环境依赖包 4、配置软件模块 5、编译及安装 6、优化配置文件路径&#xff08;可不做&#xff09; 7、添加httpd系统服务 8、修改httpd 服务配置文件 9、浏览器访问验证…...

RT-DETR

SSE represents the single-scale Transformer encoder&#xff0c;CSF represents cross-scale fusion. AIFI and CCFF are the two modules designed into 作者的 hybrid encoder 截止到发文时间的issue数&#xff0c;多吓人呐&#xff0c;不建议复现...

【算法——KMP】

1理解next数组定义&#xff1a;最长相等前后缀&#xff08;不含当前字符并且不能是整体&#xff09; 算法讲解100【扩展】 KMP算法原理和代码详解_哔哩哔哩_bilibili next数组的值&#xff1a;假设这个i出现了不匹配就从next[i]的位置开始在再匹配 2next数组生成 看一下是怎…...

视频监控相关笔记

一、QT 之 QTreeWidget 树形控件 Qt编程指南&#xff0c;Qt新手教程&#xff0c;Qt Programming Guide 一个树形结构的节点中的图表文本 、附带数据的添加&#xff1a; QTreeWidgetItem* TourTreeWnd::InsertNode(NetNodeInfo node, QTreeWidgetItem* parent_item) { // …...

React 中,构建组件的方式

1. 函数组件&#xff08;Function Components&#xff09; 函数组件是最简单的组件形式&#xff0c;通常用于展示性的组件&#xff0c;不涉及复杂的生命周期方法。 import React from react;function Welcome(props) {return <h1>Hello, {props.name}</h1>; }exp…...

s2-pro语音合成新玩法:用标签控制语气,轻松制作带情绪的语音内容

s2-pro语音合成新玩法&#xff1a;用标签控制语气&#xff0c;轻松制作带情绪的语音内容 1. 语音合成技术的新突破 在数字内容创作领域&#xff0c;语音合成技术正变得越来越重要。传统的语音合成系统往往只能生成单调、机械的语音&#xff0c;缺乏情感表达和自然韵律。而s2-…...

从零到一:LRFormer (TPAMI 2025) 实战部署与避坑指南

1. 为什么选择LRFormer&#xff1f; 最近在复现TPAMI 2025上的LRFormer模型时&#xff0c;我发现这个基于局部-全局关系建模的视觉Transformer确实有不少亮点。相比传统CNN模型&#xff0c;它在处理长距离依赖关系时表现更出色&#xff0c;特别是在细粒度图像分类任务上&#x…...

Cortex-M为何不能运行Linux?解析ARM架构与操作系统的兼容性

1. Cortex-M与Linux的兼容性解析作为一名在嵌入式领域摸爬滚打多年的工程师&#xff0c;我经常被问到这个问题&#xff1a;"为什么我的STM32&#xff08;基于Cortex-M内核&#xff09;不能跑Linux&#xff1f;"要回答这个问题&#xff0c;我们需要从处理器架构和操作…...

VBA循环到底用For、Do While还是Do Until?看完这篇别再傻傻分不清

VBA循环结构深度解析&#xff1a;如何精准选择For、Do While与Do Until&#xff1f; 刚接触VBA时&#xff0c;看到各种循环结构总让人眼花缭乱——For循环、For Each、Do While、Do Until...它们看起来都能完成相似的任务&#xff0c;但实际编码中选错循环类型&#xff0c;轻则…...

高并发分布式存储系统的设计与实践

高并发分布式存储系统的设计与实践 背景 最近团队需要设计一个支持高并发写入的分布式存储系统&#xff0c;用于处理每天数万亿条数据的写入和查询需求。作为一个在分布式存储领域深耕多年的技术人&#xff0c;我决定分享一下高并发分布式存储系统的设计思路和实践经验。 核心挑…...

Jenkins vs GitLab CI/CD:2026 企业级 CI/CD 工具深度选型评测

Jenkins vs GitLab CI/CD&#xff1a;2026 企业级 CI/CD 工具深度选型评测 作为在 CI/CD 领域摸爬滚打十余年的全栈老兵&#xff0c;我见证了从手工部署到云原生 DevOps 的完整演进。今天&#xff0c;我们将抛开宗教战争式的争论&#xff0c;用真实数据和生产环境案例&#xff…...

Transformer 从0到1:长时依赖问题的本质——梯度消失与爆炸

# Transformer 从0到1&#xff1a;长时依赖问题的本质——梯度消失与爆炸## 引言&#xff1a;序列模型的困境在自然语言处理、语音识别、时间序列分析等领域&#xff0c;处理序列数据是核心任务。一个理想的序列模型&#xff0c;不仅需要捕捉局部的语法结构&#xff08;如主语和…...

弹幕盒子:5分钟掌握专业弹幕制作,零基础也能轻松上手

弹幕盒子&#xff1a;5分钟掌握专业弹幕制作&#xff0c;零基础也能轻松上手 【免费下载链接】danmubox.github.io 弹幕盒子 项目地址: https://gitcode.com/gh_mirrors/da/danmubox.github.io 你是否曾为视频制作寻找合适的弹幕工具而烦恼&#xff1f;想要给视频添加互…...

智能驱动,精准雾化:探秘微孔雾化片专用IC的自适应频率与无水保护

1. 微孔雾化技术的前世今生 第一次拆解家用加湿器时&#xff0c;我被那片直径不到3cm的金属薄片震惊了——它竟能凭空"变"出细腻的水雾。这就是微孔雾化片&#xff0c;通过每秒10万次以上的高频振动将液态水"打碎"成微米级颗粒。但要让这片金属薄片稳定工作…...

2026 企业AI 超级员工选型建议:告别伪智能,选对企业级智能体

2026 年&#xff0c;AI Agent 智能体技术全面落地商用&#xff0c;AI 超级员工已然成为企业数字化转型、降本增效的核心抓手&#xff0c;更是营销、运营等业务场景的刚需配置。但当下市场产品鱼龙混杂&#xff0c;定价从数千元到数十万元跨度极大&#xff0c;功能宣传动辄标榜 …...