# 基于openGauss的向量近邻搜索技术 **Repository Path**: ystraw/gaussvector ## Basic Information - **Project Name**: 基于openGauss的向量近邻搜索技术 - **Description**: 基于openGauss的向量近邻搜索技术研究与实现 - **Primary Language**: Unknown - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2024-08-09 - **Last Updated**: 2024-08-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # gaussvector ## 核心代码 核心代码在src/gausskernel/storage/access目录下的gaussvector⽂件夹。 ## 使用 正常重新编译安装数据库 ```shell ./configure --gcc-version=7.3.0 CC=g++ CFLAGS='-O0' --prefix=$GAUSSHOME --3rd=$BINARYLIBS --enable-debug --enable-cassert --enable-thread-safety --with-readline --without-zlib ``` ```shell make -j8 & make install -j8 ``` 正常创建数据存放地址,创建数据库后启动服务 ```shell gs_initdb -D /home/yanhan/Projects/data -w "Gauss@123" --nodename="data" ``` ```shell gaussdb -D /home/yanhan/Projects/data --single_node ``` 连接数据库 ```shell gsql -d postgres ``` 测试前,输入以下命令添加操作符类(必要操作) ```sql CREATE OPERATOR CLASS pase_hnsw_ops DEFAULT FOR TYPE float4[] USING gaussvector AS OPERATOR 1 (float4[], pase) FOR ORDER BY float_ops; ``` ### 计算L2距离 ```sql SELECT ARRAY[2, 1, 1]::float4[] '3,1,1:82:0'::pase AS distance; ``` ### 创建表格 ```sql CREATE TABLE TableName (id int, vector float4[]); ``` ### 插入向量 直接插入: ```sql INSERT INTO TableName SELECT id, ARRAY[id,1,1,1,1,1,1,1]::float4[] FROM generate_series(0, 5000) id; ``` 从csv文件中导入: ```sql COPY TableName FROM 'csv_filename' DELIMITER ',' CSV; ``` csv内部文件格式为: ```csv 0,"{72700.0,61464.0,57103.0,54998.0,50944.0,53272.0,73066.0,60373.0}" 1,"{1,1,1,1,1,1,1,1}" ``` ### 创建索引 * ```dim``` - 向量维度 * ```base_nb_num``` - 每层的最大连接数 * ```ef_build``` - 用于构造图的动态候选列表的大小 * ```ef_search``` - 用于搜索的动态候选列表的大小(可针对每个询问重新调整) * ```base64_encoded``` - 设置为0 ```sql CREATE INDEX IndexName ON TableName USING gaussvector(vector) WITH (dim = 8, base_nb_num = 16, ef_build = 40, ef_search = 200, base64_encoded = 0); ``` ### 处理询问 索引启用 ```sql SET enable_seqscan=off; SET enable_indexscan=on; ``` 查询: ``` '311,1,1,1,1,1,1,1:82:0' ```-表示: * ```311,1,1,1,1,1,1,1```表示查询向量为(311,1,1,1,1,1,1,1) * ```82```表示设置```ef_search = 82``` * ```0```表示用L2距离计算 ```sql SELECT id, vector '311,1,1,1,1,1,1,1:82:0'::pase as distance FROM TableName ORDER BY distance ASC LIMIT 10; SELECT id, vector '311,1,1,1,1,1,1,1:82:0'::pase FROM TableName ORDER BY vector '311,1,1,1,1,1,1,1:82:0'::pase ASC LIMIT 10; ```