1.什么是Redis Search?
RedisSearch 是一个基于 Redis 的搜索引擎模块,它提供了全文搜索、索引和聚合功能。通过 RedisSearch,可以为 Redis 中的数据创建索引,执行复杂的搜索查询,并实现高级功能,如自动完成、分面搜索和排序。利用 Redis 的高性能特点,RedisSearch 可以实现高效的搜索和实时分析。对于微服务架构来说,RedisSearch 可以作为搜索服务的一部分,提供快速、高效的搜索能力,对于提高用户体验和性能具有重要的意义。
2.环境搭建
Docker Compose
version: '3' services: redis: image: redis/redis-stack container_name: redis ports: - 6379:6379 redis-insight: image: redislabs/redisinsight container_name: redis-insight ports: - 8001:8001
Run following command:
docker-compose up -d
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 {
@Id
private String id;
@Indexed
private String name;
@Searchable
private 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 {
@Id
private String id;
@Indexed
private String name;
@Searchable
private 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: localhost
port: 6379
只是一些关键代码,所有代码请参见下面代码仓库
代码仓库
- https://github.com/Harries/springboot-demo(redis search)
4.测试
启动Spring boot应用
测试hash方式
插入一个实体
查询
模糊查询redis数据(*rab*)
查看redis数据库数据
redis数据库模糊查询
测试json document方式
同样的方式插入json文档,然后在你redis数据库里面查看
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™