news 2026/8/18 18:24:01

Redis OM Spring 索引注解完全指南:@Indexed/@Searchable/@GeoIndexed 一文掌握

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Redis OM Spring 索引注解完全指南:@Indexed/@Searchable/@GeoIndexed 一文掌握

Redis OM Spring 索引注解完全指南:@Indexed/@Searchable/@GeoIndexed 一文掌握

【免费下载链接】redis-om-springSpring Data Redis extensions for better search, documents models, and more项目地址: https://gitcode.com/gh_mirrors/re/redis-om-spring

你是否在 Spring Boot 项目里用过 Redis,却只能靠手动拼 Key、自己写搜索逻辑?Redis OM Spring正是为解决这个问题而生的开源框架——它是 Spring Data Redis 的扩展,让你像写 JPA 一样,用注解轻松完成全文搜索、文档模型、地理检索、向量相似度搜索。而这一切的起点,就是本文要讲的三大核心索引注解@Indexed@Searchable@GeoIndexed。掌握它们,你就能用几行注解换来 Redis 查询引擎(原 RediSearch)的完整能力。🚀

什么是 Redis OM Spring 索引注解?一文看懂原理

在 Redis OM Spring 中,实体类字段默认是不建立索引的。只有给字段加上索引注解,Redis 查询引擎才会为该字段创建索引结构,之后你的 Repository 方法(如findByName)才能被翻译成高效的查询命令。

框架会根据你选择的注解,自动在应用启动时生成对应的索引,全程零手写命令。索引注解的源码位于 annotations 包,你可以在 Indexed.java、Searchable.java 中查看它们的完整配置项。

@Indexed:自动检测的万能索引注解

@Indexed是使用频率最高的注解,它的杀手锏是类型自动检测(AUTODETECT):你只需要标注字段,框架会根据 Java 类型自动选择索引方式,一个注解通吃绝大多数场景。

@Document public class Company { @Id private String id; @Indexed // String 字段 → TAG 索引 private String email; @Indexed // Integer 字段 → NUMERIC 索引 private Integer yearFounded; @Indexed // Point 字段 → GEO 索引 private Point location; @Indexed // Set<String> → TAG 索引(多值) private Set<String> tags; }

@Indexed 支持的字段类型速查表

Java 类型自动生成的索引类型典型查询场景
StringTAG精确匹配、过滤
Integer/Long/Double等数值NUMERIC范围查询、排序
Date/LocalDate等日期NUMERIC时间范围筛选
PointGEO距离检索
Set/List集合TAG多值标签匹配
float[]/byte[]VECTOR向量相似度搜索

💡 真实案例:官方演示项目 roms-documents 的 Company.java 就同时使用了@Indexed处理地理位置、员工人数、成立年份和标签集合。

@Indexed 高频配置项

配置项作用默认值
sortable是否可排序(额外消耗内存)false
alias查询时使用的字段别名
fieldName自定义索引中的字段名Java 字段名
indexMissing是否索引 null 值(支持IsNull查询)false
indexEmpty是否索引空字符串false
lexicographic开启字符串范围查询能力false

其中lexicographic = true值得一提:开启后框架会额外维护一个有序集合,让你可以用findBySkuGreaterThan("ABC123")findBySkuBetween("A","Z")这样的方法对字符串做字典序范围查询,非常适合 SKU、版本号、ID 区间等场景。

@Searchable:全文搜索的利器

如果说@Indexed解决"找得到",那@Searchable就是解决"搜得好"。它把字段建成TEXT 索引,支持分词、词干提取(Stemming)、加权打分等全文搜索能力。

@Document("games") public class Game { @Id private String asin; @Searchable(sortable = true, weight = 2.0) private String title; // 权重更高,标题命中排序更靠前 @Searchable(nostem = true) private String brand; // 品牌名不做词干处理,避免误匹配 }

@Searchable 核心配置项

  • weight:字段权重(默认 1.0),调高可让该字段的命中在结果排序中更靠前
  • sortable:开启后可按该字段排序
  • nostem:关闭词干提取,适合专有名词、品牌、代码
  • phonetic:开启语音匹配(如 Double Metaphone),可模糊匹配发音相似的词
  • indexMissing/indexEmpty:支持对 null 和空字符串的查询

全文搜索与普通字段过滤配合使用,就是经典的**混合搜索(Hybrid Search)**方案。参考演示项目 roms-hybrid 的 Product.java,它用@Searchable做描述全文检索,同时用@Indexed做分类过滤和价格区间,还叠加了向量字段做语义搜索。

@GeoIndexed:地理位置的精确检索

做外卖、出行、门店导航类应用?@GeoIndexed就是为你准备的。它专门针对地理位置字段(org.springframework.data.geo.Point)建立GEO 索引,让"找附近"变成一条查询。

import org.springframework.data.geo.Point; @Document public class Company { @Id private String id; @GeoIndexed private Point location; // 经度、纬度 }

之后在 Repository 中就能直接写findByLocationNear(Point, Distance)这样的方法,实现"方圆 5 公里内的公司"之类的需求。需要注意:@GeoIndexed只提供fieldNamealiasnoindex三个简单配置项,更复杂的 GEO 场景(如距离排序)由查询层配合完成。实际上,用@Indexed标注Point字段效果完全等价,@GeoIndexed胜在语义清晰、代码自解释。

其他索引注解速查:一张表掌握全家桶

除了三大主角,Redis OM Spring 还提供了一批专用注解,帮你更精确地表达意图:

注解用途一句话总结
@TagIndexed分类、状态等枚举型字段精确匹配 + 多值分隔,separator可自定义分隔符
@NumericIndexed价格、库存等数值字段显式数值索引,支持范围与排序
@TextIndexed@Searchable等价全文搜索的另一种写法
@VectorIndexed向量字段(embeddings)语义搜索、相似推荐,需配置维度与算法
@IndexingOptions类级别索引配置停用词、语言、索引前缀等全局设置

官方对这些注解的完整说明,参见文档 index-annotations.adoc。

进阶技巧:索引注解的 3 个实战经验

1. 用 indexMissing 精确处理 null 值

默认情况下 null 值不会被索引,导致findByTitleIsNull()查询不到记录。在字段上加上indexMissing = true(需 Redis Stack 2.10+),即可让 null 值参与索引,从而精确区分"字段缺失"和"字段为 null"。

2. 控制索引创建时机

索引默认在应用启动时自动创建(CREATE_IF_NOT_EXIST)。你可以在@Document上通过indexCreationMode切换模式:RECREATE_INDEXES(每次启动重建)或NO_CREATE_NO_DROP(完全手动管理)。详见文档 index-creation.adoc。

3. 只索引需要查询的字段

每个索引都要消耗内存和写入开销。请克制地使用sortable = true(会显著增加内存),只给真正参与查询、排序的字段加索引——这是性能优化的第一原则。

最佳实践:如何选择索引注解?

一句话总结选型策略:

  • 通用场景@Indexed(自动检测,够用且简单)
  • 全文搜索@Searchable(分词、加权、语音匹配)
  • 分类精确过滤@TagIndexed
  • 价格等数值范围@NumericIndexed
  • 地理位置@GeoIndexed
  • AI 语义检索@VectorIndexed@Indexed的 VECTOR 配置

索引注解只是第一步,配上框架自动生成的 Repository 与元模型(Metamodel),你就能以类型安全的方式写出所有查询——这就是 Redis OM Spring 让 Java 开发者告别"手写 Redis 命令"的底气。建议你克隆官方仓库git clone https://gitcode.com/gh_mirrors/re/redis-om-spring,在demos/目录下对照本文跑一遍 roms-documents、roms-hybrid 等示例,亲手感受注解带来的开发效率提升!✨

【免费下载链接】redis-om-springSpring Data Redis extensions for better search, documents models, and more项目地址: https://gitcode.com/gh_mirrors/re/redis-om-spring

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/18 18:22:21

服务排障,日志要能还原一次请求

服务排障&#xff0c;日志要能还原一次请求1. 链路中断与全链路 Trace 缺失的排障瓶颈 在 Go 语言构建的微服务架构中&#xff0c;当接口返回 HTTP 500 或 RPC Error: code Internal 等通用错误信息时&#xff0c;若缺乏全链路可观测性机制&#xff0c;排查根因将面临极大挑战…

作者头像 李华
网站建设 2026/8/18 18:22:02

MES系统核心功能解析:生产车间数字化转型的关键支撑

一、什么是MES系统MES&#xff08;Manufacturing Execution System&#xff0c;制造执行系统&#xff09;是位于企业上层计划系统&#xff08;如ERP&#xff09;与底层工业控制系统&#xff08;如PLC、DCS&#xff09;之间的一套面向车间层的生产管理信息系统。它的核心任务是承…

作者头像 李华
网站建设 2026/8/18 18:20:53

【初学者必看】Java的8种基础数据类型(附运算符优先级表)

Java基础数据类型与运算符引言第一部分&#xff1a;8种基础数据类型第二部分&#xff1a;类型转换第三部分&#xff1a;运算符第四部分&#xff1a;运算符优先级&#xff08;建议背下来&#xff09;第五部分&#xff1a;易犯的3个错误第六部分&#xff1a;总结引言 大家好&…

作者头像 李华
网站建设 2026/8/18 18:19:32

Sigrity仿真全流程实战(SOC + 4G + MCU)

&#x1f697; Sigrity仿真全流程实战&#xff08;SOC 4G MCU&#xff09; &#x1f449; 别再“拍脑袋放电容”&#xff0c;用仿真把PDN一次搞稳&#xff01;&#x1f3af; 一、先讲清楚&#xff1a;你为什么要做Sigrity&#xff1f; 很多人做PDN是这样的&#xff1a; &…

作者头像 李华
网站建设 2026/8/18 18:18:20

scrcpy 零基础投屏指南:10 分钟把安卓手机搬上电脑大屏

scrcpy 零基础投屏指南&#xff1a;10 分钟把安卓手机搬上电脑大屏 【免费下载链接】scrcpy Display and control your Android device 项目地址: https://gitcode.com/GitHub_Trending/sc/scrcpy 写给谁&#xff1a; 还没用过 scrcpy、对"投屏"的理解还停留在…

作者头像 李华