VectorStore
2026/2/27大约 2 分钟
VectorStore 能做什么
VectorStore 是 Spring AI 的核心接口,来看它的完整能力:
也是自动装配的
接口方法全览
public interface VectorStore {
// ➕ 写入文档(自动 Embedding)
void add(List<Document> documents);
// ❌ 删除文档(按 ID)
Optional<Boolean> delete(List<String> idList);
// 🔍 相似度搜索(核心功能)
List<Document> similaritySearch(String query);
// 🔍 相似度搜索(带条件)
List<Document> similaritySearch(SearchRequest request);
}就这四个,非常简洁,核心是 写入 和 搜索。
逐个详细说
① add —— 写文档
Document doc1 = new Document("Spring AI 是一个 AI 框架");
Document doc2 = new Document("Redis 是一个内存数据库",
Map.of("category", "database", "version", "7.0"));
vectorStore.add(List.of(doc1, doc2));做了什么:
你的文本 → EmbeddingModel → [0.12, 0.87, -0.34, ...] → 存入 RedisDocument 可以带 metadata(元数据),后面过滤要用。
② delete —— 删文档
// 按 Document 的 id 删除
vectorStore.delete(List.of("doc-id-1", "doc-id-2"));Document 创建时会自动生成 UUID 作为 id,也可以自己指定:
Document doc = new Document("doc-id-001", "内容", Map.of());③ similaritySearch(String) —— 最简单的搜索
List<Document> results = vectorStore.similaritySearch("什么是 Spring AI?");
results.forEach(doc -> {
System.out.println(doc.getContent()); // 文本内容
System.out.println(doc.getMetadata()); // 元数据
System.out.println(doc.getScore()); // 相似度分数 0~1
});默认返回 Top4,相似度阈值 0。
④ similaritySearch(SearchRequest) —— 带条件的搜索(重点)
SearchRequest request = SearchRequest
.query("什么是 Spring AI?") // 查询文本
.withTopK(10) // 返回前10条
.withSimilarityThreshold(0.75) // 相似度必须 >= 0.75
.withFilterExpression("category == 'java' && version >= 3"); // 元数据过滤
List<Document> results = vectorStore.similaritySearch(request);FilterExpression 过滤语法:
// 等于
"source == 'manual'"
// 且
"source == 'manual' && author == 'tom'"
// 或
"category == 'java' || category == 'python'"
// IN
"category in ['java', 'python', 'go']"
// 数值比较
"year >= 2023"
// NOT
"NOT source == 'test'"过滤是在向量搜索的基础上,对 metadata 做精确筛选,相当于"先向量召回,再按条件过滤"
总结一句话
| 方法 | 用途 |
|---|---|
add | 写知识进去(自动向量化) |
delete | 按 ID 删 |
similaritySearch(String) | 快速语义搜索 |
similaritySearch(SearchRequest) | 带 TopK + 阈值 + 元数据过滤的精确搜索 |
VectorStore 本身就这些,复杂度在于怎么组织 metadata 和过滤条件,这决定了你的 RAG 召回质量。有哪块想深入?
