永远的光辉 發表於 2026-4-2 11:50:00

向量数据库实战: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>
<pre><code># 下载 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</code></pre>
<h2>三、Java 客户端配置</h2>
<pre><code>&lt;dependency&gt;
    &lt;groupId&gt;io.milvus&lt;/groupId&gt;
    &lt;artifactId&gt;milvus-sdk-java&lt;/artifactId&gt;
    &lt;version&gt;2.3.4&lt;/version&gt;
&lt;/dependency&gt;</code></pre>
<pre><code>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);
    }
}</code></pre>
<h2>四、创建 Collection</h2>
<pre><code>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");
}</code></pre>
<h2>五、插入向量数据</h2>
<pre><code>public void insertVectors(MilvusClient client, List&lt;Float[]&gt; vectors, List&lt;String&gt; texts) {
    List&lt;List&lt;Float&gt;&gt; vectorList = vectors.stream()
      .map(v -&gt; Arrays.asList(v))
      .collect(Collectors.toList());

    List&lt;InsertParam.Field&gt; 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");
}</code></pre>
<h2>六、向量检索</h2>
<pre><code>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"));
    }
}</code></pre>
<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>觉得有帮助请点赞收藏!有问题欢迎评论区交流 🚀</p>

</div>
<div id="MySignature" role="contentinfo">
   

---

📌 **如果觉得文章对你有帮助,欢迎点赞👍收藏⭐!**

💬 有问题或建议?欢迎在评论区留言讨论~

🔗 更多技术干货请关注作者:弥烟袅绕

📚 本文地址:https://www.cnblogs.com/czlws/p/19810753/milvus-vector-database-java-rag<br><br>
来源:https://www.cnblogs.com/czlws/p/19810753/milvus-vector-database-java-rag
頁: [1]
查看完整版本: 向量数据库实战:Milvus入门与Java集成