PostgreSQL【应用 01】使用Vector插件实现向量相似度查询(Docker部署的PostgreSQL安装pgvector插件说明)和Milvus向量库对比

1.背景

想要实现一个图片特征向量相似度搜索的功能,项目使用的是Java开发,数据库是PostgreSQL,可选择的方案有:

  • Vector database - Milvus部署方便,有可视化界面Attu,有JavaSDK(但是需要专门部署)。
  • PostgreSQL插件(Cube 支持100维,Pase 支持512维,Vector 支持16000维)。

由于提取的图片的特征向量有1024维,所以只能使用Milvus和PostgreSQL插件Vector了。

2.应用

2.1 Milvus

Milvus官网有详细的安装流程和代码这里不再赘述,使用Docker安装,版本为2.2.9,这里为大家提供一个简单的工具类,数据库连接参数没有参数化,小伙伴们可以优化,对结果数据进行了简单的格式化:

结果封装:

@Data
@Builder
public class MilvusRes {
    public float score;
    public String imagePath;
}

工具类:

@Slf4j
@Component
public class MilvusUtil {
    public MilvusServiceClient milvusServiceClient;
    @PostConstruct
    private void connectToServer() {
        milvusServiceClient = new MilvusServiceClient(
                ConnectParam.newBuilder()
                        .withHost("your service host")
                        .withPort(19530)
                        .build());
        // 加载数据
        LoadCollectionParam faceSearchNewLoad = LoadCollectionParam.newBuilder().withCollectionName("CollectionName").build();
        R<RpcStatus> rpcStatusR = milvusServiceClient.loadCollection(faceSearchNewLoad);
        log.info("Milvus LoadCollection [{}]", rpcStatusR.getStatus());

    }

    public int insertDataToMilvus(String id, String path, float[] feature) {
        List<InsertParam.Field> fields = new ArrayList<>();
        List<Float> featureList = new ArrayList<>(feature.length);
        for (float v : feature) {
            featureList.add(v);
        }
        fields.add(new InsertParam.Field("field1", Collections.singletonList(id)));
        fields.add(new InsertParam.Field("field2", Collections.singletonList(path)));
        fields.add(new InsertParam.Field("field3", Collections.singletonList(featureList)));

        InsertParam insertParam = InsertParam.newBuilder()
                .withCollectionName("CollectionName")
                //.withPartitionName("novel")
                .withFields(fields)
                .build();
        R<MutationResult> insert = milvusServiceClient.insert(insertParam);
        return insert.getStatus();
    }

    public List<MilvusRes> searchImageByFeature(float[] feature) {
        List<Float> featureList = new ArrayList<>(feature.length);
        for (float v : feature) {
            featureList.add(v);
        }
        List<String> queryOutputFields = Arrays.asList("field");
        SearchParam faceSearch = SearchParam.newBuilder()
                .withCollectionName("CollectionName")
                .withMetricType(MetricType.IP)
                .withVectorFieldName("VectorFieldName")
                .withVectors(Collections.singletonList(featureList))
                .withOutFields(queryOutputFields)
                .withTopK(10).build();
        // 执行搜索
        long l = System.currentTimeMillis();
        R<SearchResults> respSearch = milvusServiceClient.search(faceSearch);
        log.info("MilvusServiceClient.search cost [{}]", System.currentTimeMillis() - l);
        // 解析结果数据
        SearchResultData results = respSearch.getData().getResults();
        int scoresCount = results.getScoresCount();
        SearchResultsWrapper wrapperSearch = new SearchResultsWrapper(results);
        List<MilvusRes> milvusResList = new ArrayList<>();
        for (int i = 0; i < scoresCount; i++) {
            float score = wrapperSearch.getIDScore(0).get(i).getScore();
            Object imagePath = wrapperSearch.getFieldData("field1", 0).get(i);
            MilvusRes milvusRes = MilvusRes.builder().score(score).imagePath(imagePath.toString()).build();
            milvusResList.add(milvusRes);
        }
        return milvusResList;
    }
}

数量如图:

在这里插入图片描述

性能测试结果如下:

MilvusServiceClient.search cost [24]

2.2 Vector

基础信息以下网站都有说明,这里不再赘述。

数据库PostgreSQL使用的是Docker部署,版本为12.12,插件安装流程如下:

# 进入容器
docker exec -it CONTAINER ID /bin/bash

# 1.更新 apt-get 
apt-get update
# 未更新直接安装会报错
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
E: Unable to locate package postgresql-12-postgis-3
E: Unable to locate package postgresql-12-postgis-3-dbgsym
E: Unable to locate package postgresql-12-postgis-3-scripts

# 2.安装插件
apt-get install postgresql-12-pgvector

数据库操作:

-- 添加 vector 扩展
CREATE EXTENSION vector;

-- 查询可使用的扩展
SELECT * FROM pg_available_extensions;

-- 创建表
CREATE TABLE "public"."test" ( 
  "field1" VARCHAR ( 64 ), 
  "field2" VARCHAR ( 128 ), 
  "field3" vector ( 1024 ), 
  CONSTRAINT "test_pkey" PRIMARY KEY ( "field1" ) 
);

创建索引的时候要根据使用的算法:

-- 创建索引
CREATE INDEX ON test USING ivfflat ( field3);
CREATE INDEX ON test USING ivfflat ( field3 vector_ip_ops) WITH (lists = 50);
CREATE INDEX ON test USING ivfflat ( field3 vector_ip_ops) WITH (lists = 500);
CREATE INDEX ON test USING ivfflat ( field3 vector_ip_ops) WITH (lists = 1024);

这里提供一个mapper文件内SQL的书写方法【查询相似度排名前十】:

    <select id="queryId" resultType="map">
        SELECT
        field1,
        field2,
        field3 <![CDATA[ <#> ]]> CAST ( #{featrue}  AS vector ) AS "score"
        FROM test
        ORDER BY field1 <![CDATA[ <#> ]]> CAST ( #{featrue}  AS vector )
        LIMIT 10;
    </select>

符号说明:

  1. L2 Distance(<->):L2 距离,也称为欧氏距离或欧几里得距离,用于度量两个向量之间的直线距离。L2 距离的计算方法是将两个向量的对应元素差的平方相加,然后取平方根。L2 距离较小表示向量之间更接近。
  2. Inner Product(<#>):内积距离,也称为余弦距离或内积相似度,用于度量两个向量之间的夹角余弦值。内积距离的计算方法是两个向量的点积除以两个向量的范数的乘积。内积距离越大表示向量之间的夹角越小,相似度越高。
  3. Cosine Distance(<=>):余弦距离,也称为余弦相似度的补数。余弦距离是一种度量两个向量之间夹角的距离指标,取值范围从 0 到 2,其中 0 表示完全相似,2 表示完全不相似。余弦距离的计算方法是两个向量的点积除以两个向量的范数的乘积的补数。

性能测试如下:

PostgreSQL.vector.search cost [30]

3.总结

各有优势:Milvus无需重建索引,查询速度较快;Vector不用专门部署,好维护。

<think>嗯,用户想了解如何在本地部署Milvus,而且不用DockerKubernetes。我需要回忆一下Milvus安装步骤,确保不遗漏任何细节。首先,用户可能是有一定的技术背景,但不太熟悉容器技术,或者他们希望直接在系统上安装,避免容器带来的开销。 首先,我应该检查系统要求。Milvus需要什么操作系统?通常支持Linux,可能还有MacOS。需要确认CPU是否支持AVX指令集,因为Milvus依赖这个。然后是依赖项,比如GCC、CMake之类的编译工具。用户可能需要安装这些依赖项。 接下来是安装方式。不用Docker的话,有两种方法:从源码编译或者下载预编译的二进制包。编译源码可能更灵活,但步骤更多,容易出错。而预编译的二进制相对简单,推荐给大多数用户。我需要分别介绍这两种方法,但可能重点放在二进制包上,因为更快捷。 然后,安装后的配置。Milvus的配置文件需要调整,比如设置存储路径、日志路径,以及集群模式还是单机模式。用户可能用的是单机版,但需要说明如何配置。还有元数据存储,默认是SQLite,但生产环境可能用MySQL或PostgreSQL,需要提示用户这一点。 启动服务部分,要说明如何启动Milvus它的依赖,比如etcdminio。如果是单机模式,可能这些组件已经集成,或者需要单独启动。可能需要分开启动各个组件,或者用脚本管理。 测试连接的部分,用户可能想确认安装是否成功,可以通过Python SDK连接,创建集合、插入向量、搜索等操作示例。需要确保步骤清晰,代码正确。 常见问题处理方面,比如端口冲突,依赖项缺失,或者权限问题。用户可能在安装过程中遇到这些问题,需要给出解决建议,比如检查端口是否被占用,安装必要的依赖库。 最后,提醒用户生产环境本地开发配置的不同,比如更换元数据库,调整性能参数。可能用户是在本地测试,但未来有上生产的需求,所以提前说明这些注意事项会有帮助。 现在需要把这些步骤整理成逻辑顺序,先系统要求,再安装方法,配置,启动,测试,问题处理,注意事项。确保语言简洁,步骤明确,用户能一步步跟着操作。可能还需要注意命令的正确性,比如下载链接是否最新,是否需要解压到特定目录,设置环境变量等。 另外,用户可能对Milvus的组件不熟悉,比如etcdminio的作用,是否需要单独安装。如果是单机部署,可能Milvus已经内置了这些依赖,或者需要手动启动。需要确认Milvus版本,比如2.x版本之前的版本安装步骤不同,这里假设是最新的2.x版本,所以需要分开启动etcd、minioMilvus。 最后,确保所有步骤在中文环境下可行,比如路径是否有中文问题,是否需要使用sudo权限等。可能还需要提醒用户根据实际路径修改命令,避免直接复制粘贴导致错误。</think>以下是在 Linux 系统上本地部署 Milvus(不使用 Docker/Kubernetes)的详细步骤: --- ### **一、系统要求** - **操作系统**: Linux (推荐 Ubuntu 18.04+ / CentOS 7+) 或 macOS - **CPU**: 支持 AVX 指令集(通过 `cat /proc/cpuinfo | grep avx` 验证) - **依赖项**: - GCC 7+ - CMake 3.18+ - Python 3.6+(如需使用 Python SDK) --- ### **二、安装方式(二选一)** #### **方法 1:下载预编译二进制包** 1. **下载 Milvus 发行版** 访问 [Milvus GitHub Releases](https://github.com/milvus-io/milvus/releases),下载对应系统的二进制包(如 `milvus-2.x.x-linux-amd64.tar.gz`)。 2. **解压文件** ```bash tar -zxvf milvus-2.x.x-linux-amd64.tar.gz cd milvus-2.x.x ``` --- #### **方法 2:从源码编译** 1. **克隆仓库** ```bash git clone https://github.com/milvus-io/milvus.git cd milvus git checkout v2.x.x # 切换到指定版本 ``` 2. **编译源码** ```bash make milvus # 仅编译核心服务 # 或编译全部组件(包括工具) make all ``` --- ### **三、配置 Milvus** 1. **修改配置文件** 进入解压或编译后的目录,编辑 `conf` 文件夹下的配置文件: - `milvus.yaml`: 主配置文件(设置端口、存储路径等) - `etcd.yaml`: etcd 配置(元数据存储) - `minio.yaml`: MinIO 配置(对象存储) **关键配置项示例**: ```yaml # milvus.yaml common: storagePath: /path/to/milvus/data # 数据存储路径 meta: store: etcd # 元数据存储方式(默认 etcd) ``` 2. **创建必要目录** 确保配置文件中指定的目录(如 `storagePath`)已存在且有写入权限: ```bash mkdir -p /path/to/milvus/data ``` --- ### **四、启动依赖服务** Milvus 依赖以下组件: - **etcd**(元数据存储) - **MinIO** 或 **S3**(对象存储) 1. **手动启动依赖**(以单机模式为例) ```bash # 启动 etcd ./bin/etcd --data-dir=/path/to/etcd/data # 启动 MinIO ./bin/minio server /path/to/minio/data --console-address :9090 ``` --- ### **五、启动 Milvus** ```bash # 进入 Milvus 目录 ./bin/milvus run # 默认使用 standalone 模式(集成依赖) # 或指定配置文件启动 ./bin/milvus run -c ./conf/milvus.yaml ``` --- ### **六、验证安装** 1. **检查服务状态** 访问以下地址确认服务运行: - Milvus: `http://localhost:19530`(默认端口) - etcd: `http://localhost:2379` - MinIO: `http://localhost:9090` 2. **使用 Python SDK 测试** ```python from pymilvus import connections, Collection connections.connect("default", host="localhost", port="19530") # 创建测试集合 schema = ... # 定义 Schema collection = Collection("test_collection", schema) print("Collection created:", collection.name) ``` --- ### **七、常见问题处理** - **端口冲突**: 修改配置文件中 `common.port` 或依赖服务的端口。 - **依赖缺失**: 安装缺失库(如 `libssl-dev`、`zlib`)。 - **权限问题**: 使用 `chmod` 赋予执行权限,或通过 `sudo` 运行。 --- ### **八、生产环境建议** - **元数据存储**: 替换 SQLite 为 MySQL/PostgreSQL。 - **分布式部署**: 配置多节点 etcd MinIO 集群。 - **性能调优**: 调整 `knowhere` 索引参数缓存配置。 如需更详细的配置说明,可参考 [Milvus 官方文档](https://milvus.io/docs)
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yuanzhengme.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值