Spring Boot 原生 JDBC/JPA 不支持 Oracle 23ai 的向量搜索,因其不识别 VECTOR 类型、不解析 SEMANTIC_SEARCH 语法,也无法自动处理文本嵌入与向量相似度检索。
oracle database 23ai 的向量搜索、原生 json 搜索和 ai 向量函数(如 vector_distance)不是“开箱即用”的 spring boot 功能,必须通过 spring ai 的抽象层显式接入。直接用 jdbc 或 jpa 调用这些能力会丢失语义、无法复用提示工程和 rag 流程,也绕过了 spring ai 的拦截器与可观测性支持。
为什么不能只靠 Oracle JDBC 驱动?
Spring Boot 原生的 spring-boot-starter-data-jdbc 或 spring-boot-starter-data-jpa 不理解 VECTOR 类型、不支持 SEMANTIC_SEARCH 语法、也无法自动将文本嵌入转换为向量再执行相似度检索。你写 SELECT * FROM docs WHERE VECTOR_DISTANCE(embedding, TO_VECTOR(?)) ,JDBC 会报 <code>ORA-40593: invalid vector expression —— 因为驱动没注册 VECTOR 类型映射,也没加载 Oracle 23ai 新增的 SQL 函数。
OracleVectorStore 是唯一合规接入点
Spring AI 提供了 OracleVectorStore(位于 spring-ai-oracle-vector-store 模块),它封装了以下关键行为:
- 自动注册
oracle.sql.VECTOR类型处理器 - 将 Java
List<Float>或float[]映射为 OracleVECTOR(1024)列 - 把
add/similaritySearch调用转译为带SEMANTIC_SEARCHhint 的 SQL - 兼容 Spring AI 的
Document和EmbeddingClient抽象,可与OllamaEmbeddingClient或OpenAiEmbeddingClient互换
必须用 Maven 引入对应 starter:
<dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-oracle-vector-store</artifactId> <version>1.0.3</version> </dependency>
注意:spring-ai-oracle-vector-store 依赖 Oracle JDBC Driver 23.7+(ojdbc11),旧版驱动会抛出 java.lang.NoClassDefFoundError: oracle/sql/VECTOR。
application.yml 必须配这三项
Oracle 23ai 向量功能不是默认启用的,Spring AI 需要明确知道你用的是 23ai 实例,并指定向量列名与维度:
-
spring.ai.oracle.vector-store.table-name:必须是已启用SEMANTIC SEARCH的表(建表时需加ENABLE SEMANTIC SEARCH ON (embedding)) -
spring.ai.oracle.vector-store.embedding-column-name:列类型必须是VECTOR(1024) DENSE FLOAT32(维度要和你用的 embedding 模型一致) -
spring.ai.oracle.vector-store.metadata-column-name:建议设为metadata(JSON 类型),否则无法存Document.getMetadata()
漏配任意一项,OracleVectorStore.similaritySearch() 会静默返回空列表,不会报错 —— 这是最容易踩的坑。
流式 RAG 场景下别跳过 EmbeddingClient
Oracle 23ai 本身不生成 embedding,它只做向量检索。你仍需一个 EmbeddingClient(比如 OllamaEmbeddingClient)把用户 query 转成向量。典型调用链是:
user query → EmbeddingClient.embed() → float[] → OracleVectorStore.similaritySearch() → List<Document> → ChatClient.prompt().withDocuments(...).call()
如果省略 EmbeddingClient,直接传字符串进 similaritySearch("xxx"),OracleVectorStore 会尝试用 Oracle 内置的 UTL_MATCH.EDIT_DISTANCE 做模糊匹配,结果完全偏离语义检索本意。
Oracle 23ai 的向量能力真正生效的前提,是整个数据链路(embedding 生成 → 向量入库 → 语义检索 → LLM 聚合)全部走 Spring AI 抽象层。任何环节绕过 VectorStore 或 EmbeddingClient,都会导致语义断裂或 silently fail。


















