恃液 发表于 5 天前

向量数据库实战:Milvus入门与Java集成

<h2>前言</h2>
<p>向量数据库是 RAG 系统的核心组件,负责存储和检索高维向量数据。Milvus 是最流行的开源向量数据库,支持十亿级向量检索。本文带你快速入门 Milvus,并完成 Java 集成。</p>
<h2>一、Milvus 核心概念</h2>
<ul>
<li><strong>Collection</strong>:向量数据的集合,类似数据库中的表</li>
<li><strong>Partition</strong>:集合的分区,提升查询性能</li>
<li><strong>Vector Field</strong>:存储向量数据的字段</li>
<li><strong>Index</strong>:向量索引,决定检索性能</li>
<li><strong>Metric Type</strong>:相似度度量方式(IP欧式距离 / L2欧式距离)</li>
</ul>
<h2>二、快速部署 Milvus(Docker)</h2>
# 下载 docker-compose.yml
wget https://github.com/milvus-io/milvus/releases/download/v2.3.3/milvus-standalone-docker-compose.yml -O docker-compose.yml

# 启动 Milvus
docker-compose up -d

# 验证服务
docker ps | grep milvus
<h2>三、Java 客户端配置</h2>
<dependency>
    <groupId>io.milvus</groupId>
    milvus-sdk-java</artifactId>
    <version>2.3.4</version>
</dependency>
import io.milvus.client.MilvusClient;
import io.milvus.param.ConnectParam;
import io.milvus.param.collection.FieldType;
import io.milvus.param.collection.CreateCollectionParam;

public class MilvusConfig {
    private static final String HOST = "localhost";
    private static final int PORT = 19530;

    public static MilvusClient createClient() {
      ConnectParam param = ConnectParam.newBuilder()
            .withHost(HOST)
            .withPort(PORT)
            .build();
      return new MilvusClient(param);
    }
}
<h2>四、创建 Collection</h2>
public void createCollection(MilvusClient client) {
    // 定义字段
    FieldType idField = FieldType.newBuilder()
      .withName("id")
      .withDataType(DataType.Int64)
      .withPrimaryKey(true)
      .build();

    FieldType vectorField = FieldType.newBuilder()
      .withName("embedding")
      .withDataType(DataType.FloatVector)
      .withDimension(1536)// OpenAI text-embedding-3-small 默认维度
      .build();

    FieldType textField = FieldType.newBuilder()
      .withName("text")
      .withDataType(DataType.VarChar)
      .withMaxLength(65535)
      .build();

    CreateCollectionParam param = CreateCollectionParam.newBuilder()
      .withCollectionName("documents")
      .withDescription("Document embeddings collection")
      .addFieldType(idField)
      .addFieldType(vectorField)
      .addFieldType(textField)
      .build();

    client.createCollection(param);
    System.out.println("Collection created: documents");
}
<h2>五、插入向量数据</h2>
public void insertVectors(MilvusClient client, List<Float[]> vectors, List<String> texts) {
    List<List<Float>> vectorList = vectors.stream()
      .map(v -> Arrays.asList(v))
      .collect(Collectors.toList());

    List<InsertParam.Field> fields = Arrays.asList(
      new InsertParam.Field("id", Arrays.asList(1L, 2L, 3L)),
      new InsertParam.Field("embedding", vectorList),
      new InsertParam.Field("text", texts)
    );

    InsertParam param = InsertParam.newBuilder()
      .withCollectionName("documents")
      .withFields(fields)
      .build();

    MutationResult result = client.insert(param);
    System.out.println("Inserted " + result.getSuccIndexCount() + " vectors");

    // 加载Collection到内存
    client.loadCollection("documents");
}
<h2>六、向量检索</h2>
public void search(MilvusClient client, float[] queryVector, int topK) {
    SearchParam param = SearchParam.newBuilder()
      .withCollectionName("documents")
      .withVectorFieldName("embedding")
      .withTopK(topK)
      .withVectors(Arrays.asList(Arrays.asList(queryVector)))
      .withMetricType(MetricType.IP)// 内积相似度
      .build();

    SearchResult result = client.search(param);

    for (SearchResult.ScoredVector sv : result.getRowRecords()) {
      System.out.println("ID: " + sv.getVector().get("id")
            + ", Score: " + sv.getScore()
            + ", Text: " + sv.getVector().get("text"));
    }
}
<h2>七、性能优化建议</h2>
<ol>
<li><strong>选择合适的索引</strong>:HNSW 适合高精度场景,IVF_FLAT 适合大规模数据</li>
<li><strong>Partition 优化</strong>:按时间或类别分区,减少检索范围</li>
<li><strong>批量操作</strong>:使用批量插入和批量检索,减少网络开销</li>
<li><strong>内存管理</strong>:确保 Collection 加载到内存,避免磁盘 I/O</li>
</ol>
<h2>总结</h2>
<p>Milvus 是构建生产级 RAG 系统的最佳选择。本文涵盖了从部署到 Java 集成的完整流程,下期我们来聊:<strong>如何用 Milvus + LangChain4j 构建完整的知识库问答系统</strong>。</p>
<p>觉得有帮助请点赞收藏!有问题欢迎评论区交流 <br>来源:程序园用户自行投稿发布,如果侵权,请联系站长删除<br>免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: 向量数据库实战:Milvus入门与Java集成