You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Ktor结合Redis实现JSON类型数据的文本搜索?

Ktor 与 Redis 协同处理 JSON 文本搜索配置方案

1. 依赖选择(无需 Kotlin 专属库)

Java 的 Redis 客户端库完全可以在 Kotlin 中直接使用,推荐用 Redis OM Spring 或者 Jedis + RediSearch,前者封装更友好,适合快速开发。

在 build.gradle.kts 中添加依赖:

dependencies {
    // Redis OM Spring 包含 JSON 和搜索支持
    implementation("com.redis.om:redis-om-spring:0.8.1")
    // Ktor 核心依赖
    implementation("io.ktor:ktor-server-core-jvm:2.3.3")
    implementation("io.ktor:ktor-server-netty-jvm:2.3.3")
}

2. 配置 Redis 连接

在 Ktor 的 application.conf 中添加 Redis 配置:

redis {
    host = "localhost"
    port = 6379
    // 有密码的话添加
    // password = "your-redis-password"
}

然后在 Ktor 模块中初始化 Redis 客户端:

import com.redis.om.spring.RedisOmAutoConfiguration
import io.ktor.server.application.*
import org.springframework.context.annotation.AnnotationConfigApplicationContext

fun Application.configureRedis() {
    val context = AnnotationConfigApplicationContext(RedisOmAutoConfiguration::class.java)
    // 从 Spring 上下文获取 Redis 搜索客户端
    val redisSearchClient = context.getBean(RedisSearchOperations::class.java)
    // 将客户端存入 Ktor 的 Attributes 方便全局调用
    attributes.put("redisSearchClient", redisSearchClient)
}

3. 定义 JSON 实体类

用 Redis OM 的注解标记需要搜索的字段:

import com.redis.om.spring.annotations.Document
import com.redis.om.spring.annotations.Indexed

@Document
data class User(
    @Indexed var id: String,
    @Indexed var username: String,
    @Indexed(fullText = true) var bio: String // 开启全文搜索
)

4. 执行 JSON 文本搜索

在 Ktor 的路由中实现类似 redis.ftSearch 的搜索逻辑:

import io.ktor.server.routing.*
import io.ktor.server.response.*

fun Application.configureRouting() {
    routing {
        get("/search/users") {
            val query = call.request.queryParameters["q"] ?: ""
            val redisSearchClient = attributes.get<RedisSearchOperations>("redisSearchClient")
            
            // 执行全文搜索
            val searchResults = redisSearchClient.search(
                "(@bio:($query))", // 搜索 bio 字段包含指定内容的用户
                RedisSearchOptions.builder().build()
            )
            
            call.respond(searchResults.content)
        }
    }
}

5. 手动创建索引(可选)

如果不用 Redis OM 的自动索引,也可以用 Jedis 手动创建 JSON 索引:

import redis.clients.jedis.Jedis
import redis.clients.jedis.search.IndexDefinition
import redis.clients.jedis.search.Schema

fun createJsonIndex() {
    val jedis = Jedis("localhost", 6379)
    val schema = Schema()
        .addTextField("$.username", 1.0)
        .addTextField("$.bio", 1.0)
    
    val indexDef = IndexDefinition(IndexDefinition.Type.JSON)
        .setPrefixes("user:")
    
    jedis.ftCreate("user-index", IndexDefinition.defaultOptions().setDefinition(indexDef), schema)
}

内容的提问来源于stack exchange,提问作者RealityExpander

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 11:52:20