Spring AI 1.x 系列【30】向量数据库:核心 API 和入门案例

文章目录

  • [1. 概述](#1. 概述)
  • [2. API 概述](#2. API 概述)
    • [2.1 VectorStoreRetriever 接口](#2.1 VectorStoreRetriever 接口)
    • [2.2 VectorStore 接口](#2.2 VectorStore 接口)
    • [2.3 SearchRequest 构建器](#2.3 SearchRequest 构建器)
  • [3. 集成 Milvus 向量数据库](#3. 集成 Milvus 向量数据库)
    • [3.1 Milvus 简介](#3.1 Milvus 简介)
    • [3.2 Docker Compose 部署](#3.2 Docker Compose 部署)
    • [3.3 自动配置(推荐)](#3.3 自动配置(推荐))
      • [3.3.1 依赖引入](#3.3.1 依赖引入)
      • [3.3.2 YAML 配置](#3.3.2 YAML 配置)
      • [3.3.3 完整配置参数](#3.3.3 完整配置参数)
      • [3.3.4 MilvusVectorStoreAutoConfiguration](#3.3.4 MilvusVectorStoreAutoConfiguration)
    • [3.4 业务方法](#3.4 业务方法)

1. 概述

向量数据库是面向 AI 原生场景设计的专用数据库系统,核心用于高维向量存储、向量索引构建、海量相似度检索。

与传统关系型数据库、文档数据库存在本质差异:

  • 传统数据库:依赖关键词、字段的精确匹配完成查询,无法理解数据间的语义关联;
  • 向量数据库 :依托高维空间几何运算与近似最近邻索引算法(ANN),以向量相似度计算为核心能力,实现语义级模糊检索、特征聚类、内容匹配等高级能力。

向量数据库是实现检索增强生成 (RAG)的核心基础设施,解决 AI 模型无法直接访问私有数据、知识滞后的问题,核心流程如下:

  1. 数据预处理与入库:将私有文档、知识库数据转换为高维向量,存储到向量数据库中,并关联元数据;
  2. 用户提问向量化 :用户输入的问题通过 Embedding 模型转换为查询向量;
  3. 相似度检索:向量数据库基于查询向量进行相似度搜索,召回与问题语义最相关的文档片段;
  4. 上下文拼接与生成:将召回的文档片段作为上下文,与用户问题一同发送给大语言模型,生成基于私有数据的精准回答。

2026 年主流向量数据库对比(按热度与生态成熟度排序):

名称 来源 核心优势 适用场景
Milvus 中国Zilliz(星爵科技)研发,LF AI & Data基金会毕业项目 全球最活跃的企业级开源向量库,分布式、云原生架构,支持千亿级向量,国内生态完善,与Spring AI、LangChain、LlamaIndex深度集成 企业级私有化部署、大规模RAG生产落地、分布式向量检索
Pinecone 美国Pinecone Inc.(2019年成立) 全托管SaaS向量库开创者,零运维、全球多区域部署,自动扩缩容,OpenAI/Anthropic官方推荐 快速原型开发、企业级全托管场景、全球化AI应用
Qdrant 俄罗斯Qdrant Solutions GmbH,Rust开发 极致性能(p50延迟约4ms,多项基准测试领先),轻量二进制部署,过滤能力强,社区增长极快 高并发低延迟场景、高性能向量检索、轻量部署
Weaviate 荷兰Weaviate B.V.(2019年开源) 向量+知识图谱(RDF)混合引擎,语义理解能力强,内置RAG、多模态与混合搜索(向量+BM25)能力成熟 知识图谱场景、多模态语义检索、金融/医疗复杂语义场景
pgvector 开源项目,由Andrew Kane主导开发,PostgreSQL扩展 无需新增组件,直接在现有PostgreSQL上扩展向量能力,完整支持ACID事务与SQL,数据一致性强 中小规模混合检索、现有PostgreSQL生态复用、结构化+向量混合数据场景
Chroma 美国Chroma Inc.,Python开源项目 极简轻量,开箱即用,一行代码启动,专为LLM原型设计,被称为"AI应用的SQLite",与LangChain/LlamaIndex默认集成 本地开发、原型验证、轻量RAG应用
FAISS Meta(Facebook)AI研究院开源 工业级向量算法库,支持HNSW、IVF、PQ、GPU加速等最全索引算法,是多数向量数据库的底层依赖,与PyTorch/TensorFlow无缝集成 科研/训练场景、自定义向量引擎开发、GPU加速的大规模向量计算

2. API 概述

Spring AI 提供了一套抽象化 API,通过 VectorStore 接口(读写)和 VectorStoreRetriever 接口(只读)与向量数据库交互。


2.1 VectorStoreRetriever 接口

Spring AI 提供了只读接口 VectorStoreRetriever,仅暴露文档检索能力:

java 复制代码
@FunctionalInterface
public interface VectorStoreRetriever {

    List<Document> similaritySearch(SearchRequest request);

    default List<Document> similaritySearch(String query) {
        return this.similaritySearch(SearchRequest.builder().query(query).build());
    }
}

该函数式接口专为仅需检索、无需修改数据 的场景设计,遵循最小权限原则,仅暴露必要的检索功能。

similaritySearch 方法支持通过以下参数精细化控制检索结果:

  1. k : 整数类型,指定返回的最大相似文档数量 ,即 Top K 检索(K 近邻算法 KNN)。
  2. threshold :0~1 之间的浮点数,数值越接近 1 表示相似度要求越高。 例:设置阈值 0.75,仅返回相似度高于 0.75 的文档。
  3. Filter.Expression :流式 DSL 领域特定语言,作用等价于 SQL 的 WHERE 条件,仅对文档元数据生效。
  4. filterExpression :基于 ANTLR4 的外部 DSL,支持字符串格式的过滤表达式。示例,country == 'UK' && year >= 2020 && isActive == true

2.2 VectorStore 接口

VectorStore 继承自 VectorStoreRetriever,并新增了数据修改能力:

java 复制代码
public interface VectorStore extends DocumentWriter, VectorStoreRetriever {

    default String getName() {
		return this.getClass().getSimpleName();
	}

    void add(List<Document> documents);

    void delete(List<String> idList);

    void delete(Filter.Expression filterExpression);

    default void delete(String filterExpression) { ... }

    default <T> Optional<T> getNativeClient() {
		return Optional.empty();
	}
}

VectorStore 整合了读写操作 ,支持向向量数据库添加、删除、检索文档。

向量数据库插入数据时,需将数据封装为 Document 对象:

  • Document:封装 PDF/Word 等数据源的文本内容 + 键值对元数据(如文件名);
  • 数据入库时,会通过嵌入模型 (EmbeddingModel)将文本转为数值数组 ,即向量嵌入 (vector embeddings);
  • 常用嵌入模型:Word2Vec、GLoVE、BERT、OpenAI text-embedding-ada-002;
  • 向量数据库只负责存储和检索 ,不生成向量嵌入,嵌入工作由 EmbeddingModel 完成。

以下是 VectorStore 接口的所有可用实现:

  • Azure Vector Search:Azure 向量数据库
  • Apache Cassandra:Apache Cassandra 向量数据库
  • Chroma Vector Store:Chroma 向量数据库
  • Elasticsearch Vector Store:Elasticsearch 向量数据库
  • GemFire Vector Store:GemFire 向量数据库
  • MariaDB Vector Store:MariaDB 向量数据库
  • Milvus Vector Store:Milvus 向量数据库
  • MongoDB Atlas Vector Store:MongoDB Atlas 向量数据库
  • Neo4j Vector Store:Neo4j 向量数据库
  • OpenSearch Vector Store:OpenSearch 向量数据库
  • Oracle Vector Store:Oracle 数据库向量数据库
  • PgVector Store:PostgreSQL/PGVector 向量数据库
  • Pinecone Vector Store:Pinecone 向量数据库
  • Qdrant Vector Store:Qdrant 向量数据库
  • Redis Vector Store:Redis 向量数据库
  • SAP Hana Vector Store:SAP HANA 向量数据库
  • Typesense Vector Store:Typesense 向量数据库
  • Weaviate Vector Store:Weaviate 向量数据库
  • SimpleVectorStore:简易向量存储实现,仅用于测试

注意:SimpleVectorStore 不适用于生产环境,仅用于测试/演示。


2.3 SearchRequest 构建器

SearchRequest 用于封装检索请求参数,核心代码如下:

java 复制代码
public class SearchRequest {

	public static final double SIMILARITY_THRESHOLD_ACCEPT_ALL = 0.0;
	public static final int DEFAULT_TOP_K = 4;

	private String query = "";
	private int topK = DEFAULT_TOP_K;
	private double similarityThreshold = SIMILARITY_THRESHOLD_ACCEPT_ALL;
	@Nullable
	private Filter.Expression filterExpression;

	// 构建器 + getter 方法省略
}

核心参数:

  • query:检索查询文本
  • topK:返回最相似的文档数量(默认 4)
  • similarityThreshold:相似度阈值(0~1,默认 0 不过滤)
  • filterExpression:元数据过滤表达式

3. 集成 Milvus 向量数据库

提示 :基于上篇嵌入模型相关代码!!!因为 MilvusVectorStore 依赖于 EmbeddingModel ,所以需要先集成嵌入模型

3.1 Milvus 简介

官方网站

Milvus 是由中国 Zilliz(星爵科技) 主导开发、LF AI & Data 基金会毕业的开源企业级分布式向量数据库 ,也是目前全球企业级落地最广泛的向量数据库之一,国内私有化 RAG 场景的首选方案。

核心优势:

  1. 分布式云原生架构 :支持分片集群、动态扩容,可稳定承载千亿级向量数据,适配大规模业务场景;
  2. 高效检索能力 :内置HNSW、IVF系列、FLAT等多种向量索引,支持CPU/GPU混合加速,亿级数据上实现毫秒级语义召回;
  3. 企业级混合检索:原生支持「向量语义检索 + 结构化条件过滤」,可结合时间、标签、权限等业务字段做精准筛选;
  4. 丰富生态兼容 :与 LangChain、LlamaIndex、Spring AI等主流 AI 框架深度集成,提供 Python/Java/Go 等多语言 SDK,私有化部署友好;
  5. 开源可商用 :基于Apache 2.0 协议开源,无商用限制,国内社区与技术支持完善。

典型应用场景:

  • 企业级私有化 RAG 知识库
  • 大规模多模态检索(文本/图像/视频/音频)
  • 推荐系统与用户行为向量分析
  • 内容风控、违规内容相似度匹配

3.2 Docker Compose 部署

Milvus 主要支持的部署方式:

  • 单机版:支持 Docker、Operator、Helm、DEB/RPM、Docker Compose 部署
  • 集群版:支持 Operator、Helm 部署

要使用 Docker Compose 安装 Milvus,只需运行:

bash 复制代码
wget https://github.com/milvus-io/milvus/releases/download/v2.6.15/milvus-standalone-docker-compose.yml -O docker-compose.yml

sudo docker compose up -d

Creating milvus-etcd  ... done
Creating milvus-minio ... done
Creating milvus-standalone ... done

可以加上 Milvus 可视化管理工具 Attu :

java 复制代码
  attu:
    container_name: milvus-attu
    image: zilliz/attu:v2.4
    environment:
      MILVUS_URL: milvus-standalone:19530
    ports:
      - "9021:3000"
    depends_on:
      - "standalone"

访问 http://{ip}:9021/ 控制台:

3.3 自动配置(推荐)

3.3.1 依赖引入

Maven 依赖:

xml 复制代码
<dependency>
	<groupId>org.springframework.ai</groupId>
	<artifactId>spring-ai-starter-vector-store-milvus</artifactId>
</dependency>

包含以下子依赖:

3.3.2 YAML 配置

在 application.yml 中配置 Milvus 连接参数:

yaml 复制代码
spring:
  ai:
    # 通过 spring.ai.vectorstore.type 选择向量存储类型
    # - simple: 内存向量存储 (默认,适合开发测试,重启数据丢失)
    # - milvus: Milvus 向量数据库 (生产环境推荐,支持大规模向量检索)
    vectorstore:
      type: milvus  # 当前使用内存存储,切换到 Milvus 改为: milvus
      # Milvus 配置 (仅当 type=milvus 时生效)
      # Milvus 是开源向量数据库,支持多种索引类型和度量方式
      milvus:
        client:
          host: 192.168.1.111   # Milvus 服务地址
          port: 19530           # Milvus gRPC 端口
          username: root        # 用户名
          password: milvus      # 密码
        database-name: default        # 数据库名称
        collection-name: vector_store # Collection 名称 (类似表名)
        embedding-dimension: 1024     # 向量维度 (OpenAI:1536, 智谱:1024)
        index-type: IVF_FLAT          # 索引类型: FLAT, IVF_FLAT, IVF_SQ8, IVF_PQ, HNSW, DISKANN
        metric-type: COSINE           # 度量类型: L2(欧氏距离), IP(内积), COSINE(余弦相似度)
        initialize-schema: true       # 自动创建 Collection 和索引

3.3.3 完整配置参数

Milvus 客户端连接配置前缀 spring.ai.vectorstore.milvus.client :

配置属性 中文说明 默认值 备注
secure 是否启用 TLS 安全连接 false 为 true 时才生效各类 SSL 证书配置
host Milvus 服务地址 localhost 服务域名/IP
port Milvus 服务端口 19530 取值范围 1~65535
uri Milvus 实例连接地址 空 可替代 host+port 方式连接
token 身份认证令牌 空 用于接口鉴权
connectTimeoutMs 客户端连接超时时间(毫秒) 10000 必须大于0
keepAliveTimeMs 通道保活时间(毫秒) 55000 必须大于0
keepAliveTimeoutMs 保活超时时间(毫秒) 20000 必须大于0
rpcDeadlineMs RPC 请求响应超时时间(毫秒) 0 0 表示禁用超时限制
clientKeyPath TLS 双向认证客户端私钥路径 空 仅 secure=true 生效
clientPemPath TLS 双向认证客户端证书路径 空 仅 secure=true 生效
caPemPath TLS 根证书路径 空 仅 secure=true 生效
serverPemPath TLS 单向认证服务端证书路径 空 仅 secure=true 生效
serverName SSL 主机名校验覆盖名称 空 透传给 grpc.ssl_target_name_override
idleTimeoutMs 连接通道空闲超时时间(毫秒) 24小时 超时自动释放空闲连接
username 登录用户名 root Milvus 默认账号
password 登录密码 milvus Milvus 默认密码

Milvus 向量存储业务配置前缀 spring.ai.vectorstore.milvus :

配置属性 中文说明 默认值 备注
databaseName Milvus 数据库名称 default 不可为空
collectionName 向量集合名称 vector_store 不可为空
embeddingDimension 向量嵌入维度 1536 适配 OpenAI 默认维度,必须大于0
indexType 向量索引类型 IVF_FLAT 枚举类型,见下文
metricType 向量相似度度量类型 COSINE 枚举类型,见下文
indexParameters 索引自定义参数 JSON {"nlist":1024} 不可为 null
idFieldName 集合主键字段名 doc_id 自定义主键字段标识
auto-id 是否开启自动生成主键 false 开启后无需手动指定 ID
contentFieldName 文本内容字段名 content 存储原始文档文本
metadataFieldName 元数据字段名 metadata 存储文档扩展属性
embeddingFieldName 向量嵌入字段名 embedding 存储高维向量数据
initialize-schema 是否自动初始化集合结构 false 新版 Spring AI 默认关闭,需手动开启

相似度度量枚举 MilvusMetricType :

枚举值 中文名称 适用场景
INVALID 无效类型 内部占位,不使用
L2 欧式距离 关注向量绝对距离
IP 内积 向量归一化后等价余弦相似度
COSINE 余弦相似度 语义相似度、文本检索首选
HAMMING 汉明距离 二进制向量相似度计算
JACCARD 杰卡德距离 集合相似度、稀疏特征匹配

向量索引类型枚举 MilvusIndexType :

枚举值 索引类型 特点
FLAT 暴力全量检索 精度100%,海量数据慢
IVF_FLAT 倒排暴力索引 均衡性能与精度
IVF_SQ8 倒排量化索引 存储空间低,精度轻微损耗
IVF_PQ 乘积量化索引 高压缩、适合超大规模向量
HNSW 多层近邻图索引 检索速度快、召回率高,生产常用
DISKANN 磁盘索引 适配亿级超大向量、节省内存
AUTOINDEX 自动索引 Milvus 自动择优选择索引
SCANN / GPU_IVF_FLAT / GPU_IVF_PQ GPU 加速索引 显卡算力加速检索
BIN_FLAT / BIN_IVF_FLAT 二进制向量索引 专为二值向量优化
TRIE / STL_SORT 结构化排序索引 非向量字段排序场景

3.3.4 MilvusVectorStoreAutoConfiguration

Spring AI 集成 Milvus 向量数据库的官方自动配置 Bean:

Bean 名称 Bean 类型 核心作用 创建条件 备注
milvusServiceClientConnectionDetails MilvusServiceClientConnectionDetails 封装 Milvus 连接地址(host/port),对接配置文件参数 缺失 MilvusServiceClientConnectionDetails 类型 Bean 实现类:PropertiesMilvusServiceClientConnectionDetails
milvusBatchingStrategy BatchingStrategy 文档向量嵌入批处理策略,防止大文档导致性能问题 缺失 BatchingStrategy 类型 Bean 默认实现:TokenCountBatchingStrategy
vectorStore MilvusVectorStore 核心业务Bean,提供向量增删改查、相似度检索、混合过滤能力 缺失 MilvusVectorStore 类型 Bean Spring AI 标准 VectorStore 接口实现
milvusClient MilvusServiceClient 底层通信Bean,Milvus 官方客户端,负责与服务端建立连接、执行指令 缺失 MilvusServiceClient 类型 Bean 基于配置自动构建 TLS、认证、超时参数

3.4 业务方法

VectorStore 对外暴露的核心业务方法:

方法名 返回值 入参 核心功能
add void List 批量添加文档(自动生成向量并存储)
delete void List 根据文档 ID 批量删除数据
delete void Filter.Expression 根据元数据过滤条件删除文档
similaritySearch List SearchRequest 相似度检索(支持过滤、TopK、阈值)
getNativeClient Optional 无 获取 Milvus 原生客户端,使用高级特性

3.4.1 添加文档

将数据加载到向量数据库的常规用法通常在批处理任务中完成:

  • 首先将数据加载到 Spring AI 的 Document 类中
  • 然后调用 VectorStore 接口的 add 方法

add(List<Document>) - 批量添加文档:

java 复制代码
@SpringBootTest
public class MilvusVectorStoreCoreTest {

    @Autowired
    private VectorStore vectorStore;

    // 测试文档ID(固定ID,方便删除验证)
    private static final String TEST_DOC_ID = "test_doc_001";
    private static final String TEST_CONTENT = "Spring AI 集成 Milvus 向量数据库,实现智能文本检索";
    private static final String TEST_QUERY = "Spring AI 向量检索";

    // -------------------------------------------------------------------------
    // 1. 测试:add(List<Document>) - 批量添加文档
    // -------------------------------------------------------------------------
    @Test
    @DisplayName("测试1:批量添加文档到Milvus")
    public void testAddDocuments() {
        // 1. 构建测试文档(带ID+元数据)
        Document document = Document.builder()
                .id(TEST_DOC_ID)
                .text(TEST_CONTENT)
                .metadata(Map.of("author", "spring-ai", "type", "test"))
                .build();

        List<Document> documents = List.of(document);

        // 2. 执行添加(无异常则成功)
        Assertions.assertDoesNotThrow(() -> {
            vectorStore.add(documents);
        });

        System.out.println("✅ 测试1:文档添加成功");
    }
}

3.4.2 删除文档

VectorStore 接口提供多种删除方法,支持按文档ID 或过滤表达式删除数据。

  • 传入文档 ID 列表:该方法会删除所有 ID 匹配的文档,列表中不存在的 ID 会被自动忽略。
  • 按过滤表达式删除:对于更复杂的删除条件,你可以使用过滤表达式 ,该方法接收一个 Filter.Expression 对象,用于定义需要删除的文档匹配规则。

删除文档的性能考量:

  • 当你明确知道要删除的文档ID时,按ID列表删除通常速度更快;
  • 基于过滤器的删除可能需要扫描索引以匹配文档,具体逻辑取决于向量数据库的实现;
  • 大规模删除操作应分批执行,避免系统负载过高;
  • 基于文档属性删除时,建议使用过滤表达式,无需先收集文档 ID。

所有删除方法在发生错误时都可能抛出异常,可以将删除操作包裹在 try-catch 代码块中:

java 复制代码
try {
    vectorStore.delete("country == '保加利亚'");
} catch (Exception e) {
    logger.error("过滤表达式无效", e);
}

delete(List<String>) - 根据文档 ID 批量删除:

java 复制代码
    @Test
    @DisplayName("测试3:根据文档ID删除")
    public void testDeleteByIdList() {
        // 1. 执行删除
        List<String> deleteIds = List.of(TEST_DOC_ID);
        Assertions.assertDoesNotThrow(() -> {
            vectorStore.delete(deleteIds);
        });

        // 2. 验证删除后检索不到数据
        MilvusSearchRequest searchRequest = MilvusSearchRequest.milvusBuilder()
                .query(TEST_QUERY)
                .topK(5)
                .build();

        List<Document> resultList = vectorStore.similaritySearch(searchRequest);
        Assertions.assertTrue(resultList.isEmpty(), "文档未删除成功");

        System.out.println("✅ 测试3:根据ID删除文档成功");
    }

delete(Filter.Expression) - 根据过滤条件删除:

java 复制代码
    @Test
    @Order(4)
    @DisplayName("测试4:根据元数据过滤条件删除")
    public void testDeleteByFilter() {
        // 0. 先重新添加测试数据
        vectorStore.add(List.of(
                Document.builder().id("test_002").text("测试过滤删除").metadata(Map.of("author", "test-user")).build()
        ));

        // 1. 构建过滤表达式:author = 'test-user'
        FilterExpressionBuilder filterBuilder = new FilterExpressionBuilder();
        var filterExpression = filterBuilder.eq("author", "test-user").build();

        // 2. 执行过滤删除
        Assertions.assertDoesNotThrow(() -> {
            vectorStore.delete(filterExpression);
        });

        System.out.println("✅ 测试4:根据过滤条件删除文档成功");
    }

3.4.3 相似度检索

构建检索请求

MilvusSearchRequest 链式构建通用搜索参数(继承自 SearchRequest,所有向量库通用):

构建方法 参数类型 核心功能 使用示例 备注/默认值
query(String query) String 搜索查询文本(会自动向量化) .query("什么是大模型") 必选参数,用于生成搜索向量
topK(int topK) int 返回最相似的向量结果数量 .topK(10) 默认值:10
similarityThreshold(double threshold) double 相似度过滤阈值(仅返回大于等于该值的结果) .similarityThreshold(0.75) 取值范围:0.0 ~ 1.0;默认:0.0(不过滤)
similarityThresholdAll() - 取消相似度阈值限制,返回所有匹配结果 .similarityThresholdAll() 无参数,重置阈值为不限制
filterExpression(String textExpression) String 通用过滤表达式(Spring AI 标准DSL语法) .filterExpression("country == '中国'") 跨向量库通用,自动转译为数据库语法
filterExpression(Filter.Expression expression) Filter.Expression 编程式构建过滤表达式 .filterExpression(Filter.eq("age", 18)) 类型安全的过滤方式,避免字符串语法错误

Milvus 专属参数(仅 Milvus 向量库生效):

构建方法 参数类型 核心功能 使用示例 备注/默认值
nativeExpression(String nativeExpression) String Milvus 原生过滤表达式(直接使用 Milvus 原生语法) .nativeExpression("city LIKE '上海%' AND price > 100") 优先级高于通用过滤表达式;支持 Milvus 所有原生运算符
searchParamsJson(String searchParamsJson) String Milvus 向量索引搜索参数(JSON格式) .searchParamsJson("{\"nprobe\":256, \"ef\":100}") 用于优化向量搜索性能/精度;不同索引类型参数不同

完整参数使用示例:

java 复制代码
MilvusSearchRequest request = MilvusSearchRequest.milvusBuilder()
    // 通用必选参数
    .query("推荐高性能的向量数据库")
    // 通用可选参数
    .topK(8)
    .similarityThreshold(0.8)
    .filterExpression("type == '分布式'")
    // Milvus专属可选参数
    .nativeExpression("brand == 'Milvus' AND version >= 2.4")
    .searchParamsJson("{\"nprobe\": 256, \"ef\": 200}")
    .build();

当前测试类使用示例:

java 复制代码
    @Test
    @Order(2)
    @DisplayName("测试2:文本相似度检索")
    public void testSimilaritySearch() {
        // 1. 构建检索请求
        MilvusSearchRequest searchRequest = MilvusSearchRequest.milvusBuilder()
                .query(TEST_QUERY)
                .topK(5)
                .similarityThreshold(0.5)
                .build();

        // 2. 执行检索
        List<Document> resultList = vectorStore.similaritySearch(searchRequest);

        // 3. 断言:结果不为空,且包含目标文档
        Assertions.assertFalse(resultList.isEmpty(), "检索结果为空");
        Assertions.assertEquals(TEST_DOC_ID, resultList.get(0).getId(), "文档ID不匹配");

        System.out.println("✅ 测试2:相似度检索成功,匹配文档:" + resultList.get(0).getText());
    }

元数据过滤

支持通用可移植的元数据过滤,两种写法等价:

文本表达式:

java 复制代码
vectorStore.similaritySearch(
    SearchRequest.builder()
        .query("The World")
        .topK(5)
        .similarityThreshold(0.7)
        .filterExpression("author in ['john', 'jill'] && article_type == 'blog'")
        .build()
);

编程式 DSL :

java 复制代码
FilterExpressionBuilder b = new FilterExpressionBuilder();
vectorStore.similaritySearch(
    SearchRequest.builder()
        .query("The World")
        .topK(5)
        .similarityThreshold(0.7)
        .filterExpression(b.and(
                b.in("author", "john", "jill"),
                b.eq("article_type", "blog")
        ).build())
        .build()
);

专属搜索请求

MilvusSearchRequest 继承 SearchRequest,支持 Milvus 原生参数,灵活性更强。

基础用法:

java 复制代码
MilvusSearchRequest request = MilvusSearchRequest.milvusBuilder()
    .query("sample query")
    .topK(5)
    .similarityThreshold(0.7)
    .nativeExpression("metadata[\"age\"] > 30") // 原生表达式(优先级高于 filterExpression)
    .searchParamsJson("{\"nprobe\":128}") // 索引参数
    .build();

List<Document> results = vectorStore.similaritySearch(request);

3.4.3 原生客户端访问

通过 getNativeClient() 获取 Milvus 原生客户端,使用高级特性:

java 复制代码
MilvusVectorStore vectorStore = context.getBean(MilvusVectorStore.class);
Optional<MilvusServiceClient> nativeClient = vectorStore.getNativeClient();

if (nativeClient.isPresent()) {
    MilvusServiceClient client = nativeClient.get();
    // 执行 Milvus 原生操作
}
相关推荐
小羊没烦恼!3 天前
微服务化的基石——持续集成
java·大数据·word·powerpoint·.net
回眸&啤酒鸭3 天前
【回眸】Minicart 电商购物车核心功能落地指南
人工智能
一隅论数智3 天前
给AI一张“业务概念地图“:本体如何从哲学走向企业智能
大数据·人工智能·经验分享·笔记·学习·学习方法·政务
AI的探索之旅3 天前
97 个 OpenCV 实例(三十):双目立体,从标定到点云
人工智能·opencv·计算机视觉
AlbertZein3 天前
Step-5-Preview 上手实测:3D 游戏、金融分析、网页设计一次跑完
人工智能·aigc
俊昭喜喜里3 天前
java中的继承和多态的区别
java
小羊没烦恼!3 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
LaughingZhu3 天前
Product Hunt 每日热榜 | 2026-09-19
人工智能·深度学习·神经网络·搜索引擎·百度
譕痕3 天前
JSONObject与JSONArray封装数据格式区别
java·json