SpringBoot集成Redis Search快速入门演示

53 阅读2分钟

SpringBoot集成Redis Search快速入门演示

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

后运行命令:

docker-compose up -d

3.代码工程

目的

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

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>

控制器

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());
    }

}

@ Redis Hash方法

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);
}

演示应用

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);
   }
}

应用程序.yaml

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

只是一些关键代码,请参阅以下代码库中的所有代码

代码存储库

4.测试

启动SpringBoot应用程序

测试散列法

插入实体

查询

模糊查询redis数据(rab

查看redis数据库数据

Redis数据库模糊查询

测试json文档方法

以同样的方式插入JSON文档,然后在Redis数据库中查看它

5.引用