Lazy loaded image
🥳从零到一:milvus-Java
Words 2544Read Time 7 min
2024-11-19
2025-7-10
status
type
date
slug
summary
tags
category
icon
password
😀
前言: 上网搜了很多教学,说实话看到的全是官话,也就是非要把一个能好好说的词说的让别人听不懂,这里特意做一个记录,如果你有mysql和java基础,相信你可以很快理解上手
 

📝 主旨内容

Milvus术语详解

Collection(集合)

  • MySQL中的类比:数据库中的表(Table)
  • Milvus中的定义:在Milvus中,Collection是数据的基本单位,类似于MySQL中的表。每个Collection包含一组具有相同结构的数据记录。这些数据记录在Milvus中被称为Entity

Entity(实体)

  • MySQL中的类比:表中的行(Row)或记录(Record)
  • Milvus中的定义Entity代表Collection中的单个数据项。就像MySQL中的一行数据包含了多个字段的值一样,一个Entity也包含了一组字段的值,这些值定义了该实体的特征。

Field(字段)

  • MySQL中的类比:表中的列(Column)
  • Milvus中的定义Field定义了Entity中的数据属性。每个Field都有一个类型,例如整数、浮点数或向量等。这与MySQL中定义列的数据类型非常相似。

Partition(分区)

  • MySQL中的类比:表分区(Table Partitioning)
  • Milvus中的定义Partition是一种逻辑划分,用于将Collection中的数据按照一定的规则分割成多个部分。这有助于提高查询效率,尤其是在处理大量数据时。这类似于MySQL中的表分区功能,可以根据特定条件(如日期范围)将数据分成不同的物理部分。

Segment(段)

  • MySQL中的类比:没有直接对应的MySQL概念,但可以类比为存储引擎层面对数据的物理组织方式
  • Milvus中的定义Segment是在物理存储层面的概念,它表示Partition中的一部分数据。当数据写入Partition时,Milvus会自动将其划分为多个Segment进行存储。这样做是为了优化读取性能和管理大规模数据集。

Sharding(分片)

  • MySQL中的类比:水平分片(Horizontal Sharding)
  • Milvus中的定义Sharding是指将数据分布在多个节点上,以实现负载均衡和提高查询速度。这与MySQL中的水平分片概念类似,通过将数据分散到不同的服务器上来提高系统的可扩展性和性能。

索引

  • MySQL中的类比:索引(Index)
  • Milvus中的定义:在Milvus中,创建索引是为了加速对Collection中数据的搜索操作。虽然Milvus中的索引通常针对的是向量数据,但是其目的与MySQL中创建索引来加快查询速度的目的是一样的。通过索引,可以显著减少搜索所需的时间。

查询过程详解

假设你正在开发一个图像搜索应用,用户可以通过上传一张图片来查找与其相似的其他图片。

数据准备

  1. 数据收集
      • 收集大量的图片。
      • 使用某种算法(如深度学习模型)提取每张图片的特征向量。特征向量可以看作是图片的一种数字表示,通常是一个高维向量。
  1. 数据格式
      • 每张图片的特征向量会被存储为一个Entity
      • 每个Entity可能包含以下字段:
        • id:图片的唯一标识符。
        • vector:图片的特征向量。
        • metadata:其他元数据,如图片的标签、上传时间等。
  1. 创建Collection
      • 在Milvus中创建一个Collection来存储这些Entity
      • 定义Collection的结构,包括各个字段的名称和类型。

插入数据

  1. 插入Entity
      • 将每张图片的特征向量和其他元数据作为一个Entity插入到Collection中。
      • 例如,插入一个Entity可能如下所示:

    创建索引

    1. 创建索引
        • 为了加速相似性搜索,需要在vector字段上创建索引。
        • 选择合适的索引类型(如IVF_FLAT、HNSW等),根据你的数据特性和需求来决定。

    查询数据

    1. 查询请求
        • 用户上传一张图片。
        • 提取上传图片的特征向量。
        • 使用这个特征向量作为查询条件,在Collection中进行相似性搜索。
    1. 查询参数
        • 指定要返回的相似图片数量(例如,返回前10个最相似的图片)。
        • 可能还需要指定其他过滤条件,如只返回某个标签的图片。
    1. 执行查询
        • 发送查询请求到Milvus。
        • Milvus会根据索引快速找到最相似的图片。

    获取结果

    1. 结果格式
        • 查询结果通常是一个列表,每个元素包含一个相似的Entity
        • 例如,查询结果可能如下所示:
      1. 处理结果
          • 根据返回的Entity信息,展示给用户相似的图片。
          • 例如,可以在前端显示每张相似图片的缩略图和相关信息(如标签、上传时间等)。

      总结

      • 输入:用户上传一张图片,系统提取其特征向量。
      • 处理:在Milvus中进行相似性搜索,返回最相似的图片。
      • 输出:返回一个包含相似图片的列表,每个图片包含其特征向量和元数据。
       

      🤗 问答

      Q-它的返回值不是图片啊?我们该如何去获取呢

       
      Milvus 返回的结果中并不直接包含图片文件,而是包含了一些元数据和特征向量。你需要通过这些元数据来获取实际的图片文件。以下是一个具体的步骤来说明如何通过Milvus的返回值获取图片:

      1. 数据准备阶段

      在数据准备阶段,除了将图片的特征向量存储到Milvus中,还需要保存图片的实际文件路径或其他能够唯一标识图片的信息(如图片ID)。这些信息可以存储在另一个数据库中,例如MySQL或MongoDB。

      示例数据结构

      假设你有一个MySQL表来存储图片的元数据:
      在Milvus中,Entity的结构可能如下:

      2. 插入数据

      当你插入数据到Milvus时,同时将图片的文件路径和其他元数据插入到MySQL中:

      3. 查询数据

      当用户上传一张图片并进行相似性搜索时,Milvus会返回最相似的图片的Entity信息。你可以从这些Entity中提取出图片的ID,然后使用这些ID从MySQL中查询图片的文件路径。

      示例查询代码

      4. 显示图片

      最后,你可以使用这些文件路径来加载和显示图片。例如,在Web应用中,你可以将这些文件路径传递给前端,前端再通过这些路径加载和显示图片。

      前端示例

      通过上述步骤,你可以从Milvus的查询结果中获取图片的实际文件路径
       

      📎 实战:长文本查询相似语句

       
       
      💡
      欢迎交流~
      上一篇
      与AI合作的12个范式
      下一篇
      从零开始了解推荐系统-转载自抖音

      Comments
      Loading...