diff --git "a/content/docs-lite/zh/docs/BriefTutorial/\351\253\230\347\272\247\347\211\271\346\200\247.md" "b/content/docs-lite/zh/docs/BriefTutorial/\351\253\230\347\272\247\347\211\271\346\200\247.md" index e022e480451a04cac176a5a013a1fa64485b07dd..21b0e06398e02d947ce13cd370e8fb7ea9211575 100644 --- "a/content/docs-lite/zh/docs/BriefTutorial/\351\253\230\347\272\247\347\211\271\346\200\247.md" +++ "b/content/docs-lite/zh/docs/BriefTutorial/\351\253\230\347\272\247\347\211\271\346\200\247.md" @@ -1,5 +1,3 @@ # 高级特性 - **[列存储](列存储.md)** - -- **[PQ](PQ.md)** diff --git a/content/docs-lite/zh/docs/DataVec/DataVec-Overview.md b/content/docs-lite/zh/docs/DataVec/DataVec-Overview.md new file mode 100644 index 0000000000000000000000000000000000000000..56037031cb1e2a8c8b9fb84185292ef49445c3e2 --- /dev/null +++ b/content/docs-lite/zh/docs/DataVec/DataVec-Overview.md @@ -0,0 +1,47 @@ +# DataVec向量数据库 +openGauss DataVec 向量数据库是一个基于openGauss的向量引擎, 提供向量数据类型的存储、检索。在处理大规模高维向量数据时,能够提供快速、准确的检索结果。适用于智能知识检索、 检索增强生成 RAG(Retrieval-Augmented Generation) 等各种复杂应用场景的智能应用。 + +DataVec目前支持的向量功能有:精确和近似的最近邻搜索、L2距离&余弦距离&内积、向量索引、向量操作函数和操作符。作为openGauss的内核特性,DataVec使用熟悉的SQL语法操作向量,简化了用户使用向量数据库的过程。 + +## 快速部署指南 +DataVec向量数据库可通过[容器镜像安装](../InstallationGuide/容器镜像安装.md)快速部署,并快速对接大模型,打造本地RAG智能问答服务。 + +## 特性描述 + +DataVec能够无缝对接自研大模型。通过嵌入技术将非结构化数据(如文本、图像等)转换为向量数据,DataVec为之提供存储和检索能力。嵌入是一种将非结构化数据映射到向量空间的技术,使得相似文本、图像在向量空间中的距离相近,从而提高检索的准确性和效率。 + +此外,DataVec还支持鲲鹏指令集加速,实现毫秒级响应。鲲鹏指令集是华为自主研发的一套高性能计算指令集,能够显著提升数据处理和计算的效率。通过利用鲲鹏指令集,DataVec可以在处理大规模向量数据时,提供更快的想用速度和更高的处理能力。 + +在实际应用中,DataVec可以广泛应用于各种需要高效向量检索的场景。例如,在推荐系统中,DataVec可以根据用户的历史行为和偏好,快速找到与用户兴趣相似的内容,从而提供个性化的推荐。在图像检索中,DataVec可以通过图像特征向量,快速找到与查询图像相似的图片。在自然语言处理(NLP)中,DataVec可以通过文本嵌入,快速找到与查询文本语义相似的文档。 + +DataVec架构与特性实现详情可参考[向量存储引擎](DataVec-architecture.md)介绍。 + +### 向量数据类型 +- [vector](../SQLReference/向量数据类型.md##Vector) - float向量,最高支持2000维 +- [bitvec](../SQLReference/向量数据类型.md##Bit) - bit向量,最高支持64000维 +- [sparsevec](../SQLReference/向量数据类型.md##Sparsevec) - sparse向量,最高支持1000非零元素 +>![](figures/icon-note.png) **说明:** +这里的最高维度是在使用索引场景下的最大维度上限值。 + +支持向量类型与普通类型转换、距离计算、向量计算等,具体可参考[向量函数和操作符](../SQLReference/向量函数和操作符.md) + +### 索引支持 +- [IVFFLAT](../SQLReference/向量索引.md##IVFFlat) 倒排索引 +- [IVF-PQ](../SQLReference/PQ.md##IVF-PQ) 量化压缩倒排索引 +- [HNSW](../SQLReference/向量索引.md##HNSW) 图索引 +- [HNSW-PQ](../SQLReference/PQ.md##HNSW-PQ) 量化压缩图索引 + +## 生态对接 +openGauss DataVec 提供Python、Java、Node.js、Go等多语言生态对接,让你能够通过API调用,快速使能向量数据库能力。同时, DataVec拥抱开源第三方组件,在RAG场景下做到快速兼容,多样选择。 +更详细的指导,参考[向量数据库工具编排使用](DataVec-integrations.md) + +## 使用场景 +- 图像识别:用于安全监控、身份验证等场景,通过分析图像中的人脸特征进行识别。 +- 车辆检索:通过摄像头捕捉车辆图像,进行车牌识别和车辆特征分析。 +- 实时轨迹跟踪:在物流行业,通过实时跟踪获取运输轨迹,提高物流效率和安全性。 +- 推荐系统:根据用户浏览和购买力是,推荐相关产品,提高用户满意度。 +- 声纹匹配:在金融、安防等领域,通过声纹识别技术进行身份验证,确保交易和操作的安全性。 +- 基因筛选:在药物研发过程中,通过检索特定基因序列,找到潜在的药物靶点,加速新药研发。 + +这些应用场景展示了DataVec在各个领域的能力,用户可以自由的将向量数据库库使能到各个应用中去。通过[向量数据库教程案例](DataVec-tutorials.md), 我们为你展示了向量数据库的多种应用模式。 + diff --git "a/content/docs-lite/zh/docs/AboutopenGauss/DataVec\345\220\221\351\207\217\345\274\225\346\223\216.md" b/content/docs-lite/zh/docs/DataVec/DataVec-architecture.md similarity index 36% rename from "content/docs-lite/zh/docs/AboutopenGauss/DataVec\345\220\221\351\207\217\345\274\225\346\223\216.md" rename to content/docs-lite/zh/docs/DataVec/DataVec-architecture.md index 08a6271ff8c0763d083fe0a8570b7d0f17c2a04e..7de6956b8c5a30b627fc3cd2615ddebcdd25dd51 100644 --- "a/content/docs-lite/zh/docs/AboutopenGauss/DataVec\345\220\221\351\207\217\345\274\225\346\223\216.md" +++ b/content/docs-lite/zh/docs/DataVec/DataVec-architecture.md @@ -1,101 +1,26 @@ -# DataVec向量引擎 +# 向量存储引擎 -## 可获得性 -本特性自openGauss 7.0.0-RC1 版本开始引入。 - -## 特性简介 -DataVec是一个基于openGauss的向量引擎,目前支持的向量功能有:精确和近似的最近邻搜索、L2距离&余弦距离&内积、向量索引、向量操作函数和操作符。作为openGauss的内核特性,DataVec使用熟悉的SQL语法操作向量,简化了用户使用向量数据库的过程。 - -## 快速部署指南 -详见[向量数据库容器镜像安装](../InstallationGuide/容器镜像安装.md)。 - -## 客户价值 -伴随着深度学习的不断发展,非结构化数据如图片、视频、音频等得以通过向量的方式进行表征。这种表征方式使得在搜索、推荐、广告等业务中,基于向量的K近邻(K-Nearest Neighbors,KNN)检索需求变得尤为重要。如何在海量数据中高效地实现这一需求,成为了一个重要的研究方向和基础能力。 - -DataVec的目标是存储和检索由神经网络及机器学习等大模型生成的高维向量数据。为了实现这一目标,DataVec目前支持IVFFlat和HNSW两种索引结构,以加速向量相似度查询。IVFFlat(Inverted File Flat)是一种基于倒排文件的索引结构,适用于大规模数据集的快速检索。HNSW(Hierarchical Navigable Small World)则是一种基于图的索引结构,能够在高维空间中实现高效地近似最近邻搜索。 - -总的来说,DataVec在处理大规模高维向量数据时,能够提供快速、准确的检索结果,满足各种复杂应用场景的需求。随着深度学习和大数据技术的不断发展,DataVec在向量数据库领域的应用前景将更加广阔。 - -## 特性描述 - -DataVec能够无缝对接自研大模型。通过嵌入技术将非结构化数据(如文本、图像等)转换为向量数据,DataVec为之提供存储和检索能力。嵌入是一种将非结构化数据映射到向量空间的技术,使得相似文本、图像在向量空间中的距离相近,从而提高检索的准确性和效率。 - -此外,DataVec还支持鲲鹏指令集加速,实现毫秒级响应。鲲鹏指令集是华为自主研发的一套高性能计算指令集,能够显著提升数据处理和计算的效率。通过利用鲲鹏指令集,DataVec可以在处理大规模向量数据时,提供更快的想用速度和更高的处理能力。 - -在实际应用中,DataVec可以广泛应用于各种需要高效向量检索的场景。例如,在推荐系统中,DataVec可以根据用户的历史行为和偏好,快速找到与用户兴趣相似的内容,从而提供个性化的推荐。在图像检索中,DataVec可以通过图像特征向量,快速找到与查询图像相似的图片。在自然语言处理(NLP)中,DataVec可以通过文本嵌入,快速找到与查询文本语义相似的文档。 - -### 数据类型 -- vector - float向量,最高支持2000维 -- bitvec - bit向量,最高支持64000维 -- sparsevec - sparse向量,最高支持1000非零元素 ->![](public_sys-resources/icon-note.gif) **说明:** -这里的最高维度是在使用索引场景下的最大维度上限值。 - -### 索引支持 -- IVFFLAT -- HNSW -- IVFPQ -- HNSWPQ - -### 架构设计 - -**图 1** DataVec框架图 -
- -
+## 架构设计 #### SQL层 -- Embedding:支持与盘古大模型对接,将高维数据转化为向量。 +- Embedding:支持与DeepSeek、Qwen、盘古大模型对接,将高维数据转化为向量。 - 混合查询:基于RBO生成标量和向量混合的查询,支持大规模标签的过滤查询能力以及基于过滤率的向量查询策略。 - 向量计算:通过鲲鹏SVE/SME指令优化的距离计算如欧氏距离、余弦距离等。 #### 存储引擎层 - 向量存储:支持单页最高64000维向量数据存储 - 向量索引:支持多种高效ANN索引。 #### 硬件加速层 -- 基于Index AM实现昇腾等硬件加速检索。 - -## 特性增强 -无。 - -## 特性约束 -数据类型、索引构建约束细节参考: -- [向量数据类型](../SQLReference/向量数据类型.md) +- 基于鲲鹏Boostkit量化压缩、向量指令集等软硬结合技术加速检索。 -- [向量函数和操作符](../SQLReference/向量函数和操作符.md) +## BoostKit加速 +openGauss DataVec 深度结合鲲鹏硬件,通过量化压缩算法、Rerank精排、向量化指令加速等软硬协同技术,加速向量检索进程。 -- [向量索引](../SQLReference/向量索引.md) - -## 依赖关系 -无。 - -## 基本原理 -### 支持原地更新引擎 - -ANN索引页面中在每个Element Tuple尾部附加xmin和xmax字段,从而支持原地更新引擎。这些字段在索引构建和查询过程中起到关键作用,确保数据的可见性和一致性。在实际实现中,插入新数据时系统会记录当前事务ID到xmin字段;在删除数据时系统会更新xmax字段。原地更新引擎采用原位更新的方式极大的节约了空间,将回滚段、数据页面分离存储,具备高效、平稳的IO能力。 - -**图 2** ANN原位更新索引页面 -
- -
- -### 并行构建索引 - -ANN支持并行构建索引,通过将数据集分成若干个子集分配到不同工作线程上,在每个线程上独立计算并将各线程结果合并形成最终全局索引,这极大地提升了处理大规模数据集的效率。 -- 数据分片:数据按照工作线程数划分,切分为若干子集。 -- 并行处理:leader线程创建Bgworker,每个Bgworker并行扫描各个数据子集,计算向量之间距离加入候选集。 -- 结果合并:leader线程合并所有线程结果并进行排序,然后持久化到页面上。 - -**图 3** ANN并行索引构建 +**图 1** BoostKit 加速检索
- +
-### 指令集加速 - -具体来说,鲲鹏指令集包括一系列优化的指令,如NENO指令和内联汇编,这些指令能够加速向量运算、数据预取和流水线处理。通过利用鲲鹏处理器的硬件加速特性和优化的指令集,ANN算法能够在处理大规模数据集时显著提高性能和效率。 - ### PQ量化压缩 - 乘积量化(Product Quantization, PQ)是一种基于高效压缩高维向量的方法,适用于大规模数据集的相似度搜索。通过将高维向量分割成为多个低维子向量,并对每个子向量进行独立聚类,将原始向量表示为一系列质心,从而显著减少内存使用和提升检索速度。 #### PQ码本训练 @@ -107,7 +32,7 @@ ANN支持并行构建索引,通过将数据集分成若干个子集分配到 - step3:底库切分向量和训练码本进行IP或者L2距离求解获得距离值,选择距离值中最小的据类中心索引,进而生成底库向量编码表,其维度为N × M。 - step4:对query向量进行切分,执行与step3相同的操作,生成query向量距离表,其维度为K × M。 -**图 4** PQ码本训练 +**图 2** PQ码本训练
@@ -116,134 +41,55 @@ ANN支持并行构建索引,通过将数据集分成若干个子集分配到 检索阶段:通过训练阶段生成的底库索引表和query距离表,进行查表进而获得query向量与底库向量之间的距离。仅需通过M次查表和M次相加,即可得到query向量和任一底库向量之间的距离。 -**图 5** PQ检索 +**图 3** PQ检索
-#### 分层导航+PQ融合索引 +### 分层导航+PQ融合索引 将PQ的查表法和分层导航索引结合在一起,用查表法来代替向量距离计算,进而提高检索性能, 在索引构时,并行构建分层导航图和PQ索引。在检索阶段,对0层以上的图求解query向量和图中节点之间的距离时采用Flat求解器求解,这样可以保证为第0层提供较好的入口节点。同时,顶层节点数较小也不会花费较长时间。在第0层进行检索时,采用PQ求解器的码本来代替距离求解,极大提高了计算效率。 为了进一步提高检索精度,对采用PQ查表法获取的候选集,进行二级精排,通过Flat求解器更新候选集中元素的距离,此时更新的距离为候选集向量与query向量之间的真是距离。然后对更新距离后的候选集进行二次更新,输出最终TopK结果。 -### 标量向量混合查询 -DataVec还能够同时处理标量数据(如数值、类别)和向量数据(如文本、音视频)。这种混合查询的支持使得用户可以在同一个查询中结合不同类型的数据,从而实现更复杂和精细的分析。 - -## 使用指导 -### 创建向量表 - -DataVec新增多种[向量数据类型](../SQLReference/向量数据类型.md)(vector、bitvector、sparsevector等),向量表的创建与openGauss原生语法保持一致,创建时指定存储向量类型即可。 -``` -CREATE TABLE [TABLE_NAME] -( - COL1 DATATYPE, - ..., - COLN VECTORTYPE, -); -``` - -示例1:创建一个带有3维向量的表。 - -``` -openGauss=# CREATE TABLE items (val vector(3)); -``` - -### 数据插入 - -向量的数据插入与openGauss原生语法保持一致,使用INSERT或者COPY插入,指定数据类型即可。 - -``` -INSERT INTO [TABLE_NAME] VALUES -( - DATA1, - ..., - [0.1, 0.3, 0.6, ...] -); -``` - -示例2:向量数据的插入。 - -``` -openGauss=# INSERT INTO items (val) VALUES ('[1,2,3]'), ('[4,5,6]'); -``` - -### 向量索引创建 - -DataVec目前支持了IVFFLAT、HNSW、IVFPQ及HNSWPQ等算法的[向量索引](../SQLReference/向量索引.md),基于openGauss中的ASTORE存储实现,通过索引结构能够高效地检索出查询结果。 - -``` -CREATE INDEX [INDEX_NAME] -ON [TABLE_NAME] -USING [ivfflat|hnsw|...] -WITH ( - lists=,| - m=, - ef_construction=, - ... -); -``` - -示例3:索引创建。 - -``` -openGauss=# CREATE INDEX ON items USING ivfflat (val vector_l2_ops) WITH (lists = 100); -openGauss=# CREATE INDEX ON items USING hnsw (val vector_cosine_ops) WITH (m = 16, ef_construction=200); -``` - -### 向量检索 -通过ANN索引,DataVec可以进行高效的近似搜索;此外还可以进行非索引的精确检索。 - -``` -SELECT COL1, COLN -FROM [TABLE_NAME] -ORDER BY COLN [VECTOR_OPERATER] '[0.1, 0.3, 0.7, ...]' -LIMIT ; -``` - -示例4:计算最近邻。 - -``` -openGauss=# SELECT * FROM items ORDER BY val <-> '[3,1,2]' LIMIT 5; -openGauss=# SELECT * FROM items ORDER BY val <#> '[3,1,2]' LIMIT 5; -openGauss=# SELECT * FROM items ORDER BY val <=> '[3,1,2]' LIMIT 5; -``` ->![](public_sys-resources/icon-note.gif) **说明:**
-> 如果使用当前索引中不存在的距离计算操作符来进行扫描,即使关闭顺序扫描后仍会执行顺序扫描。
-> -> 如果表中向量存在空值或者距离计算结果为NAN,查询结果会将其自动过滤。
-> -> 目前向量索引查询语法仅支持`order by <字段> <操作符> <查询向量>`子句,order by子句增加desc、非order by子句等均不支持走向量索引。 +#### 向量指令集加速 +具体来说,鲲鹏指令集包括一系列优化的指令,如NENO指令和内联汇编,这些指令能够加速向量运算、数据预取和流水线处理。通过利用鲲鹏处理器的硬件加速特性和优化的指令集,ANN算法能够在处理大规模数据集时显著提高性能和效率。 -更多使用细节请参考: +## 标量向量混合查询 +DataVec还能够同时处理标量数据(如数值、类别)和向量数据(如文本、音视频)。这种混合查询的支持使得用户可以在同一个查询中结合不同类型的数据,从而实现更复杂和精细的分析。 -- [向量数据类型](../SQLReference/向量数据类型.md) +**图 4** 融合查询 +
+ +
-- [向量函数和操作符](../SQLReference/向量函数和操作符.md) +- SQL Join :支持相似性搜索JOIN关系型数据。 +- 复杂、融合SQL: + - 支持所有类型的工作负载和数据模型:Graph, Text, JSON, Spatial, Relational, etc。 + - 支持所有SQL,包括复杂的运算和功能:Window analytic functions, stored procedures, aggregation。 +- 与向量搜索组合成复杂融合的SQL: + - 初始按照标量过滤条件生成过滤位图信息,通过ANN检索算法获取向量数据,将同时满足位图过滤和向量检索的数据返回,否则增大候选集再次检索。 -- [向量索引](../SQLReference/向量索引.md) -## 使用场景 -- 图像识别:用于安全监控、身份验证等场景,通过分析图像中的人脸特征进行识别。 -- 车辆检索:通过摄像头捕捉车辆图像,进行车牌识别和车辆特征分析。 -- 实时轨迹跟踪:在物流行业,通过实时跟踪获取运输轨迹,提高物流效率和安全性。 -- 推荐系统:根据用户浏览和购买力是,推荐相关产品,提高用户满意度。 -- 声纹匹配:在金融、安防等领域,通过声纹识别技术进行身份验证,确保交易和操作的安全性。 -- 基因筛选:在药物研发过程中,通过检索特定基因序列,找到潜在的药物靶点,加速新药研发。 +## 支持原地更新引擎 -这些应用场景展示了DataVec在各个领域的能力,用户可以自由的将向量数据库库使能到各个应用中去。 - -### DataVec使用场景示例:智能问答系统 +ANN索引页面中在每个Element Tuple尾部附加xmin和xmax字段,从而支持原地更新引擎。这些字段在索引构建和查询过程中起到关键作用,确保数据的可见性和一致性。在实际实现中,插入新数据时系统会记录当前事务ID到xmin字段;在删除数据时系统会更新xmax字段。原地更新引擎采用原位更新的方式极大的节约了空间,将回滚段、数据页面分离存储,具备高效、平稳的IO能力。 -**图 6** 高斯小智智能问答系统 +**图 5** ANN原位更新索引页面
- +
-当前,openGauss社区的文档数量庞大,用户在查找特定知识时常常面临困难。为了解决这一问题,可以借助DataVec搭建高斯小智问答系统,通过高效的数据处理和混合查询能力,精准提取相关信息,大幅提升用户的使用体验。 +## 并行构建索引 -智能问答系统是一种利用自然语言处理技术,模拟人类回答问题的智能系统。它能够理解用户提出的自然语言问题,并从海量数据中检索相关信息,最终提供准确、有用的答案。 +ANN支持并行构建索引,通过将数据集分成若干个子集分配到不同工作线程上,在每个线程上独立计算并将各线程结果合并形成最终全局索引,这极大地提升了处理大规模数据集的效率。 +- 数据分片:数据按照工作线程数划分,切分为若干子集。 +- 并行处理:leader线程创建Bgworker,每个Bgworker并行扫描各个数据子集,计算向量之间距离加入候选集。 +- 结果合并:leader线程合并所有线程结果并进行排序,然后持久化到页面上。 -DataVec通过高斯小智将语料库导入到向量数据库中,并对接自研大模型实现对用户查询语句的实时转换,从而在DataVec中高效检索出相关知识以达到快速、精准的响应。 \ No newline at end of file +**图 6** ANN并行索引构建 +
+ +
diff --git a/content/docs-lite/zh/docs/DataVec/DataVec-integrations.md b/content/docs-lite/zh/docs/DataVec/DataVec-integrations.md new file mode 100644 index 0000000000000000000000000000000000000000..f2e255c0bb45e20000b1f5dc212a8eef4dd1fc4c --- /dev/null +++ b/content/docs-lite/zh/docs/DataVec/DataVec-integrations.md @@ -0,0 +1,19 @@ +# 工具编排使用 + +openGauss DataVec提供多种第三方组件的集成教程,并通过多语言SDK支持,帮助你轻松搭建RAG服务,提升数据处理效率。 + +## 编排第三方组件 +- Dify +- AnythingLLM + +## 向量数据迁移 +- [从Milvus迁移至openGauss DataVec](milvus2datavec.md) +- 从Pgvector迁移至openGauss DataVec +- 从ElasticSearch迁移至openGauss DataVec + +## API Reference +- Python +- Java +- Node.js +- Go + diff --git a/content/docs-lite/zh/docs/DataVec/DataVec-quickstart.md b/content/docs-lite/zh/docs/DataVec/DataVec-quickstart.md new file mode 100644 index 0000000000000000000000000000000000000000..59788b38e0d1de513b56c7d95fbd2b02dcadfa87 --- /dev/null +++ b/content/docs-lite/zh/docs/DataVec/DataVec-quickstart.md @@ -0,0 +1,96 @@ +# 向量数据库快速入门 + +## 快速部署 +详见[容器镜像安装](../InstallationGuide/容器镜像安装.md)。 + +## 创建向量表 + +DataVec新增多种[向量数据类型](../SQLReference/向量数据类型.md)(vector、bitvector、sparsevector等),向量表的创建与openGauss原生语法保持一致,创建时指定存储向量类型即可。 +``` +CREATE TABLE [TABLE_NAME] +( + COL1 DATATYPE, + ..., + COLN VECTORTYPE, +); +``` + +示例1:创建一个带有3维向量的表。 + +``` +openGauss=# CREATE TABLE items (val vector(3)); +``` + +## 数据插入 + +向量的数据插入与openGauss原生语法保持一致,使用INSERT或者COPY插入,指定数据类型即可。 + +``` +INSERT INTO [TABLE_NAME] VALUES +( + DATA1, + ..., + [0.1, 0.3, 0.6, ...] +); +``` + +示例2:向量数据的插入。 + +``` +openGauss=# INSERT INTO items (val) VALUES ('[1,2,3]'), ('[4,5,6]'); +``` + +## 向量索引创建 + +DataVec目前支持了IVFFLAT、HNSW、IVFPQ及HNSWPQ等算法的[向量索引](../SQLReference/向量索引.md),基于openGauss中的ASTORE存储实现,通过索引结构能够高效地检索出查询结果。 + +``` +CREATE INDEX [INDEX_NAME] +ON [TABLE_NAME] +USING [ivfflat|hnsw|...] +WITH ( + lists=,| + m=, + ef_construction=, + ... +); +``` + +示例3:索引创建。 + +``` +openGauss=# CREATE INDEX ON items USING ivfflat (val vector_l2_ops) WITH (lists = 100); +openGauss=# CREATE INDEX ON items USING hnsw (val vector_cosine_ops) WITH (m = 16, ef_construction=200); +``` + +## 向量检索 +通过ANN索引,DataVec可以进行高效的近似搜索;此外还可以进行非索引的精确检索。 + +``` +SELECT COL1, COLN +FROM [TABLE_NAME] +ORDER BY COLN [VECTOR_OPERATER] '[0.1, 0.3, 0.7, ...]' +LIMIT ; +``` + +示例4:计算最近邻。 + +``` +openGauss=# SELECT * FROM items ORDER BY val <-> '[3,1,2]' LIMIT 5; +openGauss=# SELECT * FROM items ORDER BY val <#> '[3,1,2]' LIMIT 5; +openGauss=# SELECT * FROM items ORDER BY val <=> '[3,1,2]' LIMIT 5; +``` +>![](figures/icon-note.png) **说明:**
+>如果使用当前索引中不存在的距离计算操作符来进行扫描,即使关闭顺序扫描后仍会执行顺序扫描。
+> +>如果表中向量存在空值或者距离计算结果为NAN,查询结果会将其自动过滤。
+> +> 目前向量索引查询语法仅支持`order by <字段> <操作符> <查询向量>`子句,order by子句增加desc、非order by子句等均不支持走向量索引。 + +更多使用细节请参考: + +- [向量数据类型](../SQLReference/向量数据类型.md) + +- [向量函数和操作符](../SQLReference/向量函数和操作符.md) + +- [向量索引](../SQLReference/向量索引.md) diff --git a/content/docs-lite/zh/docs/DataVec/DataVec-tutorials.md b/content/docs-lite/zh/docs/DataVec/DataVec-tutorials.md new file mode 100644 index 0000000000000000000000000000000000000000..4416a1f2ef3cd94d43f1c4efc9051ad9dab7190e --- /dev/null +++ b/content/docs-lite/zh/docs/DataVec/DataVec-tutorials.md @@ -0,0 +1,6 @@ +# 向量数据库教程案例 + +本章节提供基于openGauss DataVec 的教程案例,帮助你更好的了解向量数据库的使用模式。 + +- openGauss DataVec + Dify, 快速搭建你的智能助手平台 +- SpringBoot 集成 openGauss DataVec, 智能问答一站式开发 diff --git a/content/docs-lite/zh/docs/AboutopenGauss/figures/Architecture-datavec.png b/content/docs-lite/zh/docs/DataVec/figures/Architecture-datavec.png similarity index 100% rename from content/docs-lite/zh/docs/AboutopenGauss/figures/Architecture-datavec.png rename to content/docs-lite/zh/docs/DataVec/figures/Architecture-datavec.png diff --git a/content/docs-lite/zh/docs/AboutopenGauss/figures/PQSearch-datavec.png b/content/docs-lite/zh/docs/DataVec/figures/PQSearch-datavec.png similarity index 100% rename from content/docs-lite/zh/docs/AboutopenGauss/figures/PQSearch-datavec.png rename to content/docs-lite/zh/docs/DataVec/figures/PQSearch-datavec.png diff --git a/content/docs-lite/zh/docs/AboutopenGauss/figures/PQTrain-datavec.png b/content/docs-lite/zh/docs/DataVec/figures/PQTrain-datavec.png similarity index 100% rename from content/docs-lite/zh/docs/AboutopenGauss/figures/PQTrain-datavec.png rename to content/docs-lite/zh/docs/DataVec/figures/PQTrain-datavec.png diff --git a/content/docs-lite/zh/docs/AboutopenGauss/figures/ParallelBuild-datavec.png b/content/docs-lite/zh/docs/DataVec/figures/ParallelBuild-datavec.png similarity index 100% rename from content/docs-lite/zh/docs/AboutopenGauss/figures/ParallelBuild-datavec.png rename to content/docs-lite/zh/docs/DataVec/figures/ParallelBuild-datavec.png diff --git a/content/docs-lite/zh/docs/AboutopenGauss/figures/SupportUstore-datavec.png b/content/docs-lite/zh/docs/DataVec/figures/SupportUstore-datavec.png similarity index 100% rename from content/docs-lite/zh/docs/AboutopenGauss/figures/SupportUstore-datavec.png rename to content/docs-lite/zh/docs/DataVec/figures/SupportUstore-datavec.png diff --git a/content/docs-lite/zh/docs/DataVec/figures/boostkit.png b/content/docs-lite/zh/docs/DataVec/figures/boostkit.png new file mode 100644 index 0000000000000000000000000000000000000000..bf354fb0b48fbab693aa8b354d9908dd8c00c58b Binary files /dev/null and b/content/docs-lite/zh/docs/DataVec/figures/boostkit.png differ diff --git a/content/docs-lite/zh/docs/AboutopenGauss/figures/gausscopilot-datavec.png b/content/docs-lite/zh/docs/DataVec/figures/gausscopilot-datavec.png similarity index 100% rename from content/docs-lite/zh/docs/AboutopenGauss/figures/gausscopilot-datavec.png rename to content/docs-lite/zh/docs/DataVec/figures/gausscopilot-datavec.png diff --git a/content/docs-lite/zh/docs/DataVec/figures/hybridsearch.png b/content/docs-lite/zh/docs/DataVec/figures/hybridsearch.png new file mode 100644 index 0000000000000000000000000000000000000000..fb60821f36644c12cb27fbf9757e08f86af96659 Binary files /dev/null and b/content/docs-lite/zh/docs/DataVec/figures/hybridsearch.png differ diff --git a/content/docs-lite/zh/docs/DataVec/figures/icon-note.png b/content/docs-lite/zh/docs/DataVec/figures/icon-note.png new file mode 100644 index 0000000000000000000000000000000000000000..789e42a8a4e810f4848631a7a64a8fe521ef0fe4 Binary files /dev/null and b/content/docs-lite/zh/docs/DataVec/figures/icon-note.png differ diff --git a/content/docs-lite/zh/docs/DataVec/milvus2datavec.md b/content/docs-lite/zh/docs/DataVec/milvus2datavec.md new file mode 100644 index 0000000000000000000000000000000000000000..0ed381af4f4374b82cdad18251313f2b4f30af7e --- /dev/null +++ b/content/docs-lite/zh/docs/DataVec/milvus2datavec.md @@ -0,0 +1,252 @@ +# 从Milvus迁移至openGauss DataVec + +本教程通过Python编程语言,支持将本地Milvus数据迁移至openGauss DataVec实例中 + +## 环境准备 +- 已部署2.3 及以上版本的Milvus实例 +- 已部署7.0.0-RC1 及以上版本的openGauss实例,容器部署参考[容器镜像安装](../InstallationGuide/容器镜像安装.md) +- 已安装3.8 及以上版本的Python环境 +- 已安装涉及的Python库 + +```python +pip3 install psycopg2 +pip3 install pymilvus==2.4.9 +pip3 install numpy +``` + +## 迁移操作 + +1. 参考如下迁移脚本milvus2datavec.py及配置文件config.ini,根据本地部署的Milvus与openGauss进行配置修改: + +迁移配置文件config.ini如下: +``` +[Milvus] +host = localhost +port = 19530 + +[openGauss] +user = postgres +password = xxxxxx +port = 5432 +database = postgres + +[Table] +milvus_collection_name = test +opengauss_table_name = test +``` + +milvus2datavec.py迁移脚本如下: +```python +import psycopg2 +import csv +from pymilvus import connections, Collection +from concurrent.futures import ThreadPoolExecutor +import configparser +import numpy as np +import re +import os + +# Read database configuration from config.ini +config = configparser.ConfigParser() +config.read('config.ini') + +# Connect to Milvus +def connect_milvus(): + milvus_host = config.get('Milvus', 'host') + milvus_port = config.get('Milvus', 'port') + try: + connections.connect(alias="default", host=milvus_host, port=milvus_port) + print("Connected to Milvus successfully!") + except Exception as e: + print(f"Failed to connect to Milvus: {e}") + +# Query data from Milvus collection in pages +def query_milvus_paginated(collection_name, limit=1000, offset=0): + collection = Collection(collection_name) + collection.load() + results = collection.query(expr="", output_fields=[field.name for field in collection.schema.fields], limit=limit, offset=offset) + return results + +# Connect to openGauss +def connect_opengauss(): + opengauss_user = config.get('openGauss', 'user') + opengauss_password = config.get('openGauss', 'password') + opengauss_host = config.get('openGauss', 'host') + opengauss_port = config.get('openGauss', 'port') + opengauss_database = config.get('openGauss', 'database') + try: + conn = psycopg2.connect( + user=opengauss_user, + password=opengauss_password, + host=opengauss_host, + port=opengauss_port, + database=opengauss_database + ) + print("Connected to openGauss successfully!") + return conn + except Exception as e: + print(f"Failed to connect to openGauss: {e}") + return None + +# Define the data type mapping from Milvus to openGauss +def milvus_to_opengauss_type(milvus_field_type): + type_mapping = { + "Int64": "BIGINT", + "Int8": "SMALLINT", + "Int16": "SMALLINT", + "Int32": "INTEGER", + "Float": "FLOAT", + "Double": "DOUBLE PRECISION", + "VarChar": "VARCHAR", + "String": "TEXT", + "Json": "TEXT", + "FLOAT_VECTOR": "VECTOR", + "BINARY_VECTOR": "BIT", + "SPARSE_FLOAT_VECTOR": "SPARSEVECTOR", + "Bool": "BOOLEAN", + + } + return type_mapping.get(milvus_field_type, "TEXT") + +# Create a table in openGauss +def create_table_opengauss(conn, table_name, fields, collection): + cursor = conn.cursor() + columns = [] + for field in fields: + # Manually find the field with the specified name + milvus_field = next((f for f in collection.schema.fields if f.name == field), None) + if milvus_field: + opengauss_type = milvus_to_opengauss_type(milvus_field.dtype.name) + columns.append(f"{field} {opengauss_type}") + else: + print(f"Field {field} not found in collection schema.") + columns_str = ", ".join(columns) + create_table_query = f"CREATE TABLE IF NOT EXISTS {table_name} ({columns_str});" + try: + cursor.execute(create_table_query) + conn.commit() + print(f"Table {table_name} created successfully!") + except Exception as e: + print(f"Failed to create table: {e}") + finally: + cursor.close() + +# Save Milvus data to a CSV file in batches +def save_to_csv_batch(data, fields, csv_file_path): + with open(csv_file_path, 'a', newline='', encoding='utf-8') as csvfile: + writer = csv.DictWriter(csvfile, fieldnames=fields) + if csvfile.tell() == 0: + writer.writeheader() + for row in data: + new_row = {} + for field in fields: + value = row[field] + milvus_field = next((f for f in collection.schema.fields if f.name == field), None) + if milvus_field: + if isinstance(value, (list, np.ndarray)): + new_row[field] = "[" + ", ".join(str(x) for x in value) + "]" + else: + new_row[field] = str(value) + + writer.writerow(new_row) + print(f"Batch data saved to {csv_file_path} successfully!") + +# Export data from Milvus to a CSV file +def export_milvus_to_csv(milvus_collection_name, csv_file_path, limit=1000): + offset = 0 + collection = Collection(milvus_collection_name) + collection.load() + initial_data = query_milvus_paginated(milvus_collection_name, limit=1) + fields = [field.name for field in collection.schema.fields] + + while True: + milvus_data = query_milvus_paginated(milvus_collection_name, limit=limit, offset=offset) + if not milvus_data: + break + save_to_csv_batch(milvus_data, fields, csv_file_path) + offset += limit + +# Import data from a CSV file to openGauss +def import_csv_to_opengauss(conn, table_name, csv_file_path, fields): + cursor = conn.cursor() + try: + # Truncate the target table + cursor.execute(f"TRUNCATE TABLE {table_name};") + with open(csv_file_path, 'r', encoding='utf-8') as csvfile: + columns = ', '.join(fields) + copy_query = f"COPY {table_name} ({columns}) FROM STDIN WITH (FORMAT CSV, HEADER);" + cursor.copy_expert(copy_query, csvfile) + conn.commit() + print("Data imported from CSV to openGauss successfully!") + except Exception as e: + print(f"Failed to import data from CSV to openGauss: {e}") + finally: + cursor.close() + +if __name__ == "__main__": + # Read table name from config file + milvus_collection_name = config.get('Table', 'milvus_collection_name') + opengauss_table_name = config.get('Table', 'opengauss_table_name') + + # Generate the CSV file path based on the table name + output_folder = 'output' + if not os.path.exists(output_folder): + os.makedirs(output_folder) + + #csv_file_path = f'{opengauss_table_name}.csv' + + # Generate the CSV file path based on the table name + csv_file_path = os.path.join(output_folder, f'{milvus_collection_name}.csv') + + # Connect to Milvus + connect_milvus() + collection = Collection(milvus_collection_name) + collection.load() + initial_data = query_milvus_paginated(milvus_collection_name, limit=1) + fields = [field.name for field in collection.schema.fields] + + # Connect to openGauss + opengauss_conn = connect_opengauss() + + if opengauss_conn: + # Create a table in openGauss + create_table_opengauss(opengauss_conn, opengauss_table_name, fields, collection) + + # Export data from Milvus to a CSV file + export_milvus_to_csv(milvus_collection_name, csv_file_path) + + # Import data from a CSV file to openGauss + import_csv_to_opengauss(opengauss_conn, opengauss_table_name, csv_file_path, fields) + + opengauss_conn.close() + +``` + +2. 将迁移脚本、配置文件放置在同一目录下,层级如下: +``` +├── milvus2datavec.py +└── config.ini +``` + +3. 运行迁移脚本,并查看输出结果: +``` +python3 milvus2datavec.py +``` + +4. 登录openGauss,查看数据是否完成迁移: + + 4.1 进入容器: + ``` + $ docker exec -it bash + ``` + + 4.2 登录`omm`超级用户: + ``` + $ su omm + $ gsql -d postgres -p 5432 + ``` + + 4.3 查看迁移表数据量: + ``` + $ select count(*) from test; + ``` \ No newline at end of file diff --git "a/content/docs-lite/zh/docs/InstallationGuide/\345\256\271\345\231\250\351\225\234\345\203\217\345\256\211\350\243\205.md" "b/content/docs-lite/zh/docs/InstallationGuide/\345\256\271\345\231\250\351\225\234\345\203\217\345\256\211\350\243\205.md" index 09e7fda098a979c57ef9db670145d0aa18247a4c..5130df15911bb18bb9241f24bfcc3c4771611731 100644 --- "a/content/docs-lite/zh/docs/InstallationGuide/\345\256\271\345\231\250\351\225\234\345\203\217\345\256\211\350\243\205.md" +++ "b/content/docs-lite/zh/docs/InstallationGuide/\345\256\271\345\231\250\351\225\234\345\203\217\345\256\211\350\243\205.md" @@ -1,10 +1,9 @@ -# 向量数据库容器镜像安装 -本章节主要介绍如何获取openGauss DataVec向量数据库镜像,并通过Docker安装DataVec,以便用户能快速开启数据库之旅。 +# 轻量版容器镜像安装 +本章节主要介绍如何获取openGauss镜像,并通过Docker安装,以便用户能快速开启数据库之旅。 ## 1. 获取镜像 -openGauss向量数据库镜像主要有两种获取方式,分别可以通过`docker pull`和`docker load`拉取对应镜像,下面将详细介绍这两种获取路径。 +openGauss数据库镜像主要有两种获取方式,分别可以通过`docker pull`和`docker load`拉取对应镜像,下面将详细介绍这两种获取路径。 ### 拉取dockerhub镜像 -openGauss 镜像支持x86-64、ARM64架构和openEuler 20.03 LTS操作系统版本,拉取镜像时无需指定架构和版本。 ```bash $ docker pull opengauss/opengauss:latest @@ -36,7 +35,6 @@ opengauss latest 9aa832ba6684 2 hours ago 1 >![](public_sys-resources/icon-note.gif) **说明:** > > 以上镜像包会周期性更新,可以根据自身需求修改路径获取最新镜像包。
-> 镜像支持的操作系统暂时仅限于`openEuler 20.03` ## 2. 运行容器 diff --git a/content/zh/docs/BriefTutorial/PQ.md b/content/docs-lite/zh/docs/SQLReference/PQ.md similarity index 90% rename from content/zh/docs/BriefTutorial/PQ.md rename to content/docs-lite/zh/docs/SQLReference/PQ.md index 0d3adbda5b609812437148bc1a05f7e12a98d170..3f4d7b38f6c25257a70c87705ffc3fae1d6c248a 100644 --- a/content/zh/docs/BriefTutorial/PQ.md +++ b/content/docs-lite/zh/docs/SQLReference/PQ.md @@ -4,7 +4,7 @@ 本章节主要介绍openGauss数据库DataVec向量引擎PQ(Product Quantization)特性的安装使用步骤,以指导用户顺利完成操作。本特性将DataVec向量引擎和自研PQ算法相结合,以提高向量检索的查询性能。 ->![](public_sys-resources/icon-note.png) **限制:
** +>![](../../../../zh/docs/BriefTutorial/public_sys-resources/icon-note.png) **限制:
** >PQ特性暂时只支持ARM架构环境。
>PQ特性暂时只支持HNSW和IVF索引。
>PQ特性暂时只支持vector数据类型,在其他向量数据类型构建HNSWPQ以及IVFPQ索引会导致执行失败。
@@ -35,10 +35,10 @@ PQ特性只支持ARM架构环境。 ## 安装与卸载 ### 启用PQ特性 -设置GUC参数`enable_pq = on`启用PQ特性,详情请参考[DataVec向量引擎参数](../DatabaseReference/DataVec向量引擎参数.md)。 +设置GUC参数`enable_pq = on`启用PQ特性,详情请参考[DataVec向量引擎参数](../../../../zh/docs/DatabaseReference/DataVec向量引擎参数.md)。 ### 关闭PQ特性 -设置GUC参数`enable_pq = off`关闭PQ特性,详情请参考[DataVec向量引擎参数](../DatabaseReference/DataVec向量引擎参数.md)。 +设置GUC参数`enable_pq = off`关闭PQ特性,详情请参考[DataVec向量引擎参数](../../../../zh/docs/DatabaseReference/DataVec向量引擎参数.md)。 ## 使用PQ @@ -96,7 +96,7 @@ vector_cosine_ops | 余弦距离 - pq_m:切分子空间越多,精度越高,同时性能越低。该值必须要能整除数据集维度,否则索引无法创建成功,推荐值为`维度/4`。 - pq_ksub:聚类中心越多,精度越高,但同时性能越低。推荐值为`256`。 -- 其余参数设置与[向量索引](../SQLReference/向量索引.md)中HNSW索引中相同。 +- 其余参数设置与[向量索引](../../../../zh/docs/SQLReference/向量索引.md)中HNSW索引中相同。 #### GUC参数 - `hnsw_earlystop_threshold` - 设置图搜索的最大连续迭代次数 160~INT32_MAX-1 (默认INT32_MAX) @@ -164,11 +164,11 @@ vector_cosine_ops|<=>|余弦距离 - pq_m:切分子空间越多,精度越高,同时性能越低。该值需要能整除数据集维度,推荐值为`维度/4`。 - pq_ksub:聚类中心越多,精度越高,但同时性能越低。推荐值为`256`。 - by_residual:启动残差计算可以提升精度,但是会增加构建索引的时间。推荐值`off`。 -- 其余参数设置与[向量索引](../SQLReference/向量索引.md)中IVFFLAT索引相同。 +- 其余参数设置与[向量索引](../../../../zh/docs/SQLReference/向量索引.md)中IVFFLAT索引相同。 #### 查询选项 -- `ivfflat_probe` - 查询时候选集的大小,参见[DataVec向量引擎参数](../DatabaseReference/DataVec向量引擎参数.md)。 +- `ivfflat_probe` - 查询时候选集的大小,参见[DataVec向量引擎参数](../../../../zh/docs/DatabaseReference/DataVec向量引擎参数.md)。 **示例:** @@ -176,7 +176,7 @@ vector_cosine_ops|<=>|余弦距离 openGauss=# SET ivfflat_probes = 10; ``` -- `ivfpq_kreorder` - 设置参与精排候选集的大小,参见[DataVec向量引擎参数](../DatabaseReference/DataVec向量引擎参数.md)。 +- `ivfpq_kreorder` - 设置参与精排候选集的大小,参见[DataVec向量引擎参数](../../../../zh/docs/DatabaseReference/DataVec向量引擎参数.md)。 **示例:** diff --git a/content/docs-lite/zh/menu/index.md b/content/docs-lite/zh/menu/index.md index 712139b5f93d432df69e4c9a8e18b213e4b60099..8152173d2382ba1c293496d5be719cf97b3080c2 100644 --- a/content/docs-lite/zh/menu/index.md +++ b/content/docs-lite/zh/menu/index.md @@ -82,7 +82,6 @@ headless: true - [全文索引]({{< relref "./docs/AboutopenGauss/全文索引.md" >}}) - [Copy接口支持容错机制]({{< relref "./docs/AboutopenGauss/Copy接口支持容错机制.md" >}}) - [分区]({{< relref "./docs/AboutopenGauss/分区.md" >}}) - - [DataVec向量引擎]({{< relref "./docs/AboutopenGauss/DataVec向量引擎.md" >}}) - [高级分析函数支持]({{< relref "./docs/AboutopenGauss/高级分析函数支持.md" >}}) - [物化视图]({{< relref "./docs/AboutopenGauss/物化视图.md" >}}) - [支持HyperLogLog]({{< relref "./docs/AboutopenGauss/支持HyperLogLog.md" >}}) @@ -220,7 +219,6 @@ headless: true - [函数]({{< relref "./docs/BriefTutorial/函数.md" >}}) - [高级特性]({{< relref "./docs/BriefTutorial/高级特性.md" >}}) - [列存储]({{< relref "./docs/BriefTutorial/列存储.md" >}}) - - [PQ]({{< relref "./docs/BriefTutorial/PQ.md" >}}) - [附录:SQL语法]({{< relref "./docs/BriefTutorial/附录-SQL语法.md" >}}) - [应用开发指南]({{< relref "./docs/DeveloperGuide/应用开发指南.md" >}}) - [数据查询请求处理过程]({{< relref "./docs/DeveloperGuide/数据查询请求处理过程.md" >}}) @@ -625,6 +623,11 @@ headless: true - [案例:改写SQL消除in-clause]({{< relref "./docs/PerformanceTuningGuide/案例-改写SQL消除in-clause.md" >}}) - [案例:修改启动参数解决TPCC大幅度波动]({{< relref "./docs/PerformanceTuningGuide/案例-修改启动参数解决TPCC大幅度波动.md" >}}) - [案例:子事务TPCC性能调优]({{< relref "./docs/PerformanceTuningGuide/案例-子事务TPCC性能调优.md" >}}) +- [向量数据库]({{< relref "./docs/DataVec/DataVec-Overview.md" >}}) + - [快速入门指南]({{< relref "./docs/DataVec/DataVec-quickstart.md" >}}) + - [向量存储引擎]({{< relref "./docs/DataVec/DataVec-architecture.md" >}}) + - [工具编排使用]({{< relref "./docs/DataVec/DataVec-integrations.md" >}}) + - [教程案例指导]({{< relref "./docs/DataVec/DataVec-tutorials.md" >}}) - [安全加固指南]({{< relref "./docs/SecHarden/secHarden.md" >}}) - [数据库加固概述]({{< relref "./docs/SecHarden/数据库加固概述.md" >}}) - [安全配置规范基线]({{< relref "./docs/SecHarden/安全配置规范基线.md" >}}) diff --git "a/content/zh/docs/AboutopenGauss/\344\274\201\344\270\232\347\272\247\347\211\271\346\200\247.md" "b/content/zh/docs/AboutopenGauss/\344\274\201\344\270\232\347\272\247\347\211\271\346\200\247.md" index 57b327bb8c2b09e401c064fab36640266f5ebee5..4b1a21e0f8e1784cda1b582062b503174117d7b3 100644 --- "a/content/zh/docs/AboutopenGauss/\344\274\201\344\270\232\347\272\247\347\211\271\346\200\247.md" +++ "b/content/zh/docs/AboutopenGauss/\344\274\201\344\270\232\347\272\247\347\211\271\346\200\247.md" @@ -10,8 +10,6 @@ - **[分区](分区.md)** -- **[DataVec向量引擎](DataVec向量引擎.md)** - - **[高级分析函数支持](高级分析函数支持.md)** - **[物化视图](物化视图.md)** diff --git "a/content/zh/docs/BriefTutorial/\351\253\230\347\272\247\347\211\271\346\200\247.md" "b/content/zh/docs/BriefTutorial/\351\253\230\347\272\247\347\211\271\346\200\247.md" index e9120140339884d61e7b78e3765299272c7044df..41032053a348eaa3a3655ae6a46bf15ff1767861 100644 --- "a/content/zh/docs/BriefTutorial/\351\253\230\347\272\247\347\211\271\346\200\247.md" +++ "b/content/zh/docs/BriefTutorial/\351\253\230\347\272\247\347\211\271\346\200\247.md" @@ -19,5 +19,3 @@ - **[资源池化](资源池化.md)** - **[UWAL](UWAL.md)** - -- **[PQ](PQ.md)** diff --git a/content/zh/docs/DataVec/DataVec-Overview.md b/content/zh/docs/DataVec/DataVec-Overview.md new file mode 100644 index 0000000000000000000000000000000000000000..e44f0778aa76249a9207e270c0c19b043dbc77af --- /dev/null +++ b/content/zh/docs/DataVec/DataVec-Overview.md @@ -0,0 +1,46 @@ +# DataVec向量数据库 +openGauss DataVec 向量数据库是一个基于openGauss的向量引擎, 提供向量数据类型的存储、检索。在处理大规模高维向量数据时,能够提供快速、准确的检索结果。适用于智能知识检索、 检索增强生成 RAG(Retrieval-Augmented Generation) 等各种复杂应用场景的智能应用。 + +DataVec目前支持的向量功能有:精确和近似的最近邻搜索、L2距离&余弦距离&内积、向量索引、向量操作函数和操作符。作为openGauss的内核特性,DataVec使用熟悉的SQL语法操作向量,简化了用户使用向量数据库的过程。 + +## 快速部署指南 +DataVec向量数据库可通过[容器镜像安装](../InstallationGuide/容器镜像安装.md)快速部署,并快速对接大模型,打造本地RAG智能问答服务。 + +## 特性描述 + +DataVec能够无缝对接自研大模型。通过嵌入技术将非结构化数据(如文本、图像等)转换为向量数据,DataVec为之提供存储和检索能力。嵌入是一种将非结构化数据映射到向量空间的技术,使得相似文本、图像在向量空间中的距离相近,从而提高检索的准确性和效率。 + +此外,DataVec还支持鲲鹏指令集加速,实现毫秒级响应。鲲鹏指令集是华为自主研发的一套高性能计算指令集,能够显著提升数据处理和计算的效率。通过利用鲲鹏指令集,DataVec可以在处理大规模向量数据时,提供更快的想用速度和更高的处理能力。 + +在实际应用中,DataVec可以广泛应用于各种需要高效向量检索的场景。例如,在推荐系统中,DataVec可以根据用户的历史行为和偏好,快速找到与用户兴趣相似的内容,从而提供个性化的推荐。在图像检索中,DataVec可以通过图像特征向量,快速找到与查询图像相似的图片。在自然语言处理(NLP)中,DataVec可以通过文本嵌入,快速找到与查询文本语义相似的文档。 + +DataVec架构与特性实现详情可参考[向量存储引擎](DataVec-architecture.md)介绍。 + +### 向量数据类型 +- [vector](../SQLReference/向量数据类型.md##Vector) - float向量,最高支持2000维 +- [bitvec](../SQLReference/向量数据类型.md##Bit) - bit向量,最高支持64000维 +- [sparsevec](../SQLReference/向量数据类型.md##Sparsevec) - sparse向量,最高支持1000非零元素 +>![](figures/icon-note.png) **说明:** +这里的最高维度是在使用索引场景下的最大维度上限值。 + +支持向量类型与普通类型转换、距离计算、向量计算等,具体可参考[向量函数和操作符](../SQLReference/向量函数和操作符.md) + +### 索引支持 +- [IVFFLAT](../SQLReference/向量索引.md##IVFFlat) 倒排索引 +- [IVF-PQ](../SQLReference/PQ.md##IVF-PQ) 量化压缩倒排索引 +- [HNSW](../SQLReference/向量索引.md##HNSW) 图索引 +- [HNSW-PQ](../SQLReference/PQ.md##HNSW-PQ) 量化压缩图索引 + +## 生态对接 +openGauss DataVec 提供Python、Java、Node.js、Go等多语言生态对接,让你能够通过API调用,快速使能向量数据库能力。同时, DataVec拥抱开源第三方组件,在RAG场景下做到快速兼容,多样选择。 +更详细的指导,参考[向量数据库工具编排使用](DataVec-integrations.md) + +## 使用场景 +- 图像识别:用于安全监控、身份验证等场景,通过分析图像中的人脸特征进行识别。 +- 车辆检索:通过摄像头捕捉车辆图像,进行车牌识别和车辆特征分析。 +- 实时轨迹跟踪:在物流行业,通过实时跟踪获取运输轨迹,提高物流效率和安全性。 +- 推荐系统:根据用户浏览和购买力是,推荐相关产品,提高用户满意度。 +- 声纹匹配:在金融、安防等领域,通过声纹识别技术进行身份验证,确保交易和操作的安全性。 +- 基因筛选:在药物研发过程中,通过检索特定基因序列,找到潜在的药物靶点,加速新药研发。 + +这些应用场景展示了DataVec在各个领域的能力,用户可以自由的将向量数据库库使能到各个应用中去。通过[向量数据库教程案例](DataVec-tutorials.md), 我们为你展示了向量数据库的多种应用模式。 \ No newline at end of file diff --git "a/content/zh/docs/AboutopenGauss/DataVec\345\220\221\351\207\217\345\274\225\346\223\216.md" b/content/zh/docs/DataVec/DataVec-architecture.md similarity index 37% rename from "content/zh/docs/AboutopenGauss/DataVec\345\220\221\351\207\217\345\274\225\346\223\216.md" rename to content/zh/docs/DataVec/DataVec-architecture.md index 2db9cd67ff107960aeb6e17b60803aa39cdce65d..a1f81ca8c5732131ad3883f79972850103542370 100644 --- "a/content/zh/docs/AboutopenGauss/DataVec\345\220\221\351\207\217\345\274\225\346\223\216.md" +++ b/content/zh/docs/DataVec/DataVec-architecture.md @@ -1,101 +1,26 @@ -# DataVec向量引擎 +# 向量存储引擎 -## 可获得性 -本特性自openGauss 7.0.0-RC1 版本开始引入。 - -## 特性简介 -DataVec是一个基于openGauss的向量引擎,目前支持的向量功能有:精确和近似的最近邻搜索、L2距离&余弦距离&内积、向量索引、向量操作函数和操作符。作为openGauss的内核特性,DataVec使用熟悉的SQL语法操作向量,简化了用户使用向量数据库的过程。 - -## 快速部署指南 -详见[向量数据库容器镜像安装](../InstallationGuide/容器镜像安装.md)。 - -## 客户价值 -伴随着深度学习的不断发展,非结构化数据如图片、视频、音频等得以通过向量的方式进行表征。这种表征方式使得在搜索、推荐、广告等业务中,基于向量的K近邻(K-Nearest Neighbors,KNN)检索需求变得尤为重要。如何在海量数据中高效地实现这一需求,成为了一个重要的研究方向和基础能力。 - -DataVec的目标是存储和检索由神经网络及机器学习等大模型生成的高维向量数据。为了实现这一目标,DataVec目前支持IVFFlat和HNSW两种索引结构,以加速向量相似度查询。IVFFlat(Inverted File Flat)是一种基于倒排文件的索引结构,适用于大规模数据集的快速检索。HNSW(Hierarchical Navigable Small World)则是一种基于图的索引结构,能够在高维空间中实现高效地近似最近邻搜索。 - -总的来说,DataVec在处理大规模高维向量数据时,能够提供快速、准确的检索结果,满足各种复杂应用场景的需求。随着深度学习和大数据技术的不断发展,DataVec在向量数据库领域的应用前景将更加广阔。 - -## 特性描述 - -DataVec能够无缝对接自研大模型。通过嵌入技术将非结构化数据(如文本、图像等)转换为向量数据,DataVec为之提供存储和检索能力。嵌入是一种将非结构化数据映射到向量空间的技术,使得相似文本、图像在向量空间中的距离相近,从而提高检索的准确性和效率。 - -此外,DataVec还支持鲲鹏指令集加速,实现毫秒级响应。鲲鹏指令集是华为自主研发的一套高性能计算指令集,能够显著提升数据处理和计算的效率。通过利用鲲鹏指令集,DataVec可以在处理大规模向量数据时,提供更快的想用速度和更高的处理能力。 - -在实际应用中,DataVec可以广泛应用于各种需要高效向量检索的场景。例如,在推荐系统中,DataVec可以根据用户的历史行为和偏好,快速找到与用户兴趣相似的内容,从而提供个性化的推荐。在图像检索中,DataVec可以通过图像特征向量,快速找到与查询图像相似的图片。在自然语言处理(NLP)中,DataVec可以通过文本嵌入,快速找到与查询文本语义相似的文档。 - -### 数据类型 -- vector - float向量,最高支持2000维 -- bitvec - bit向量,最高支持64000维 -- sparsevec - sparse向量,最高支持1000非零元素 ->![](public_sys-resources/icon-note.png) **说明:** -这里的最高维度是在使用索引场景下的最大维度上限值。 - -### 索引支持 -- IVFFLAT -- HNSW -- IVFPQ -- HNSWPQ - -### 架构设计 - -**图 1** DataVec框架图 -
- -
+## 架构设计 #### SQL层 -- Embedding:支持与盘古大模型对接,将高维数据转化为向量。 +- Embedding:支持与DeepSeek、Qwen、盘古大模型对接,将高维数据转化为向量。 - 混合查询:基于RBO生成标量和向量混合的查询,支持大规模标签的过滤查询能力以及基于过滤率的向量查询策略。 - 向量计算:通过鲲鹏SVE/SME指令优化的距离计算如欧氏距离、余弦距离等。 #### 存储引擎层 - 向量存储:支持单页最高64000维向量数据存储 - 向量索引:支持多种高效ANN索引。 #### 硬件加速层 -- 基于Index AM实现昇腾等硬件加速检索。 - -## 特性增强 -无。 - -## 特性约束 -数据类型、索引构建约束细节参考: -- [向量数据类型](../SQLReference/向量数据类型.md) +- 基于鲲鹏Boostkit量化压缩、向量指令集等软硬结合技术加速检索。 -- [向量函数和操作符](../SQLReference/向量函数和操作符.md) +## BoostKit加速 +openGauss DataVec 深度结合鲲鹏硬件,通过量化压缩算法、Rerank精排、向量化指令加速等软硬协同技术,加速向量检索进程。 -- [向量索引](../SQLReference/向量索引.md) - -## 依赖关系 -无。 - -## 基本原理 -### 支持原地更新引擎 - -ANN索引页面中在每个Element Tuple尾部附加xmin和xmax字段,从而支持原地更新引擎。这些字段在索引构建和查询过程中起到关键作用,确保数据的可见性和一致性。在实际实现中,插入新数据时系统会记录当前事务ID到xmin字段;在删除数据时系统会更新xmax字段。原地更新引擎采用原位更新的方式极大的节约了空间,将回滚段、数据页面分离存储,具备高效、平稳的IO能力。 - -**图 2** ANN原位更新索引页面 -
- -
- -### 并行构建索引 - -ANN支持并行构建索引,通过将数据集分成若干个子集分配到不同工作线程上,在每个线程上独立计算并将各线程结果合并形成最终全局索引,这极大地提升了处理大规模数据集的效率。 -- 数据分片:数据按照工作线程数划分,切分为若干子集。 -- 并行处理:leader线程创建Bgworker,每个Bgworker并行扫描各个数据子集,计算向量之间距离加入候选集。 -- 结果合并:leader线程合并所有线程结果并进行排序,然后持久化到页面上。 - -**图 3** ANN并行索引构建 +**图 1** BoostKit 加速检索
- +
-### 指令集加速 - -具体来说,鲲鹏指令集包括一系列优化的指令,如NENO指令和内联汇编,这些指令能够加速向量运算、数据预取和流水线处理。通过利用鲲鹏处理器的硬件加速特性和优化的指令集,ANN算法能够在处理大规模数据集时显著提高性能和效率。 - ### PQ量化压缩 - 乘积量化(Product Quantization, PQ)是一种基于高效压缩高维向量的方法,适用于大规模数据集的相似度搜索。通过将高维向量分割成为多个低维子向量,并对每个子向量进行独立聚类,将原始向量表示为一系列质心,从而显著减少内存使用和提升检索速度。 #### PQ码本训练 @@ -107,7 +32,7 @@ ANN支持并行构建索引,通过将数据集分成若干个子集分配到 - step3:底库切分向量和训练码本进行IP或者L2距离求解获得距离值,选择距离值中最小的据类中心索引,进而生成底库向量编码表,其维度为N × M。 - step4:对query向量进行切分,执行与step3相同的操作,生成query向量距离表,其维度为K × M。 -**图 4** PQ码本训练 +**图 2** PQ码本训练
@@ -116,7 +41,7 @@ ANN支持并行构建索引,通过将数据集分成若干个子集分配到 检索阶段:通过训练阶段生成的底库索引表和query距离表,进行查表进而获得query向量与底库向量之间的距离。仅需通过M次查表和M次相加,即可得到query向量和任一底库向量之间的距离。 -**图 5** PQ检索 +**图 3** PQ检索
@@ -128,122 +53,43 @@ ANN支持并行构建索引,通过将数据集分成若干个子集分配到 为了进一步提高检索精度,对采用PQ查表法获取的候选集,进行二级精排,通过Flat求解器更新候选集中元素的距离,此时更新的距离为候选集向量与query向量之间的真是距离。然后对更新距离后的候选集进行二次更新,输出最终TopK结果。 -### 标量向量混合查询 -DataVec还能够同时处理标量数据(如数值、类别)和向量数据(如文本、音视频)。这种混合查询的支持使得用户可以在同一个查询中结合不同类型的数据,从而实现更复杂和精细的分析。 - -## 使用指导 -### 创建向量表 - -DataVec新增多种[向量数据类型](../SQLReference/向量数据类型.md)(vector、bitvector、sparsevector等),向量表的创建与openGauss原生语法保持一致,创建时指定存储向量类型即可。 -``` -CREATE TABLE [TABLE_NAME] -( - COL1 DATATYPE, - ..., - COLN VECTORTYPE, -); -``` - -示例1:创建一个带有3维向量的表。 - -``` -openGauss=# CREATE TABLE items (val vector(3)); -``` - -### 数据插入 - -向量的数据插入与openGauss原生语法保持一致,使用INSERT或者COPY插入,指定数据类型即可。 - -``` -INSERT INTO [TABLE_NAME] VALUES -( - DATA1, - ..., - [0.1, 0.3, 0.6, ...] -); -``` - -示例2:向量数据的插入。 - -``` -openGauss=# INSERT INTO items (val) VALUES ('[1,2,3]'), ('[4,5,6]'); -``` - -### 向量索引创建 - -DataVec目前支持了IVFFLAT、HNSW、IVFPQ及HNSWPQ等算法的[向量索引](../SQLReference/向量索引.md),基于openGauss中的ASTORE存储实现,通过索引结构能够高效地检索出查询结果。 - -``` -CREATE INDEX [INDEX_NAME] -ON [TABLE_NAME] -USING [ivfflat|hnsw|...] -WITH ( - lists=,| - m=, - ef_construction=, - ... -); -``` - -示例3:索引创建。 - -``` -openGauss=# CREATE INDEX ON items USING ivfflat (val vector_l2_ops) WITH (lists = 100); -openGauss=# CREATE INDEX ON items USING hnsw (val vector_cosine_ops) WITH (m = 16, ef_construction=200); -``` - -### 向量检索 -通过ANN索引,DataVec可以进行高效的近似搜索;此外还可以进行非索引的精确检索。 - -``` -SELECT COL1, COLN -FROM [TABLE_NAME] -ORDER BY COLN [VECTOR_OPERATER] '[0.1, 0.3, 0.7, ...]' -LIMIT ; -``` - -示例4:计算最近邻。 - -``` -openGauss=# SELECT * FROM items ORDER BY val <-> '[3,1,2]' LIMIT 5; -openGauss=# SELECT * FROM items ORDER BY val <#> '[3,1,2]' LIMIT 5; -openGauss=# SELECT * FROM items ORDER BY val <=> '[3,1,2]' LIMIT 5; -``` ->![](public_sys-resources/icon-note.png) **说明:**
->如果使用当前索引中不存在的距离计算操作符来进行扫描,即使关闭顺序扫描后仍会执行顺序扫描。
-> ->如果表中向量存在空值或者距离计算结果为NAN,查询结果会将其自动过滤。
-> -> 目前向量索引查询语法仅支持`order by <字段> <操作符> <查询向量>`子句,order by子句增加desc、非order by子句等均不支持走向量索引。 +### 向量指令集加速 +具体来说,鲲鹏指令集包括一系列优化的指令,如NENO指令和内联汇编,这些指令能够加速向量运算、数据预取和流水线处理。通过利用鲲鹏处理器的硬件加速特性和优化的指令集,ANN算法能够在处理大规模数据集时显著提高性能和效率。 -更多使用细节请参考: +## 标量向量混合查询 +DataVec还能够同时处理标量数据(如数值、类别)和向量数据(如文本、音视频)。这种混合查询的支持使得用户可以在同一个查询中结合不同类型的数据,从而实现更复杂和精细的分析。 -- [向量数据类型](../SQLReference/向量数据类型.md) +**图 4** 融合查询 +
+ +
-- [向量函数和操作符](../SQLReference/向量函数和操作符.md) +- SQL Join :支持相似性搜索JOIN关系型数据。 +- 复杂、融合SQL: + - 支持所有类型的工作负载和数据模型:Graph, Text, JSON, Spatial, Relational, etc。 + - 支持所有SQL,包括复杂的运算和功能:Window analytic functions, stored procedures, aggregation。 +- 与向量搜索组合成复杂融合的SQL: + - 初始按照标量过滤条件生成过滤位图信息,通过ANN检索算法获取向量数据,将同时满足位图过滤和向量检索的数据返回,否则增大候选集再次检索。 -- [向量索引](../SQLReference/向量索引.md) -## 使用场景 -- 图像识别:用于安全监控、身份验证等场景,通过分析图像中的人脸特征进行识别。 -- 车辆检索:通过摄像头捕捉车辆图像,进行车牌识别和车辆特征分析。 -- 实时轨迹跟踪:在物流行业,通过实时跟踪获取运输轨迹,提高物流效率和安全性。 -- 推荐系统:根据用户浏览和购买力是,推荐相关产品,提高用户满意度。 -- 声纹匹配:在金融、安防等领域,通过声纹识别技术进行身份验证,确保交易和操作的安全性。 -- 基因筛选:在药物研发过程中,通过检索特定基因序列,找到潜在的药物靶点,加速新药研发。 +## 支持原地更新引擎 -这些应用场景展示了DataVec在各个领域的能力,用户可以自由的将向量数据库库使能到各个应用中去。 - -### DataVec使用场景示例:智能问答系统 +ANN索引页面中在每个Element Tuple尾部附加xmin和xmax字段,从而支持原地更新引擎。这些字段在索引构建和查询过程中起到关键作用,确保数据的可见性和一致性。在实际实现中,插入新数据时系统会记录当前事务ID到xmin字段;在删除数据时系统会更新xmax字段。原地更新引擎采用原位更新的方式极大的节约了空间,将回滚段、数据页面分离存储,具备高效、平稳的IO能力。 -**图 6** 高斯小智智能问答系统 +**图 5** ANN原位更新索引页面
- +
-当前,openGauss社区的文档数量庞大,用户在查找特定知识时常常面临困难。为了解决这一问题,可以借助DataVec搭建高斯小智问答系统,通过高效的数据处理和混合查询能力,精准提取相关信息,大幅提升用户的使用体验。 +## 并行构建索引 -智能问答系统是一种利用自然语言处理技术,模拟人类回答问题的智能系统。它能够理解用户提出的自然语言问题,并从海量数据中检索相关信息,最终提供准确、有用的答案。 +ANN支持并行构建索引,通过将数据集分成若干个子集分配到不同工作线程上,在每个线程上独立计算并将各线程结果合并形成最终全局索引,这极大地提升了处理大规模数据集的效率。 +- 数据分片:数据按照工作线程数划分,切分为若干子集。 +- 并行处理:leader线程创建Bgworker,每个Bgworker并行扫描各个数据子集,计算向量之间距离加入候选集。 +- 结果合并:leader线程合并所有线程结果并进行排序,然后持久化到页面上。 -DataVec通过高斯小智将语料库导入到向量数据库中,并对接自研大模型实现对用户查询语句的实时转换,从而在DataVec中高效检索出相关知识以达到快速、精准的响应。 \ No newline at end of file +**图 6** ANN并行索引构建 +
+ +
diff --git a/content/zh/docs/DataVec/DataVec-integrations.md b/content/zh/docs/DataVec/DataVec-integrations.md new file mode 100644 index 0000000000000000000000000000000000000000..f2e255c0bb45e20000b1f5dc212a8eef4dd1fc4c --- /dev/null +++ b/content/zh/docs/DataVec/DataVec-integrations.md @@ -0,0 +1,19 @@ +# 工具编排使用 + +openGauss DataVec提供多种第三方组件的集成教程,并通过多语言SDK支持,帮助你轻松搭建RAG服务,提升数据处理效率。 + +## 编排第三方组件 +- Dify +- AnythingLLM + +## 向量数据迁移 +- [从Milvus迁移至openGauss DataVec](milvus2datavec.md) +- 从Pgvector迁移至openGauss DataVec +- 从ElasticSearch迁移至openGauss DataVec + +## API Reference +- Python +- Java +- Node.js +- Go + diff --git a/content/zh/docs/DataVec/DataVec-quickstart.md b/content/zh/docs/DataVec/DataVec-quickstart.md new file mode 100644 index 0000000000000000000000000000000000000000..59788b38e0d1de513b56c7d95fbd2b02dcadfa87 --- /dev/null +++ b/content/zh/docs/DataVec/DataVec-quickstart.md @@ -0,0 +1,96 @@ +# 向量数据库快速入门 + +## 快速部署 +详见[容器镜像安装](../InstallationGuide/容器镜像安装.md)。 + +## 创建向量表 + +DataVec新增多种[向量数据类型](../SQLReference/向量数据类型.md)(vector、bitvector、sparsevector等),向量表的创建与openGauss原生语法保持一致,创建时指定存储向量类型即可。 +``` +CREATE TABLE [TABLE_NAME] +( + COL1 DATATYPE, + ..., + COLN VECTORTYPE, +); +``` + +示例1:创建一个带有3维向量的表。 + +``` +openGauss=# CREATE TABLE items (val vector(3)); +``` + +## 数据插入 + +向量的数据插入与openGauss原生语法保持一致,使用INSERT或者COPY插入,指定数据类型即可。 + +``` +INSERT INTO [TABLE_NAME] VALUES +( + DATA1, + ..., + [0.1, 0.3, 0.6, ...] +); +``` + +示例2:向量数据的插入。 + +``` +openGauss=# INSERT INTO items (val) VALUES ('[1,2,3]'), ('[4,5,6]'); +``` + +## 向量索引创建 + +DataVec目前支持了IVFFLAT、HNSW、IVFPQ及HNSWPQ等算法的[向量索引](../SQLReference/向量索引.md),基于openGauss中的ASTORE存储实现,通过索引结构能够高效地检索出查询结果。 + +``` +CREATE INDEX [INDEX_NAME] +ON [TABLE_NAME] +USING [ivfflat|hnsw|...] +WITH ( + lists=,| + m=, + ef_construction=, + ... +); +``` + +示例3:索引创建。 + +``` +openGauss=# CREATE INDEX ON items USING ivfflat (val vector_l2_ops) WITH (lists = 100); +openGauss=# CREATE INDEX ON items USING hnsw (val vector_cosine_ops) WITH (m = 16, ef_construction=200); +``` + +## 向量检索 +通过ANN索引,DataVec可以进行高效的近似搜索;此外还可以进行非索引的精确检索。 + +``` +SELECT COL1, COLN +FROM [TABLE_NAME] +ORDER BY COLN [VECTOR_OPERATER] '[0.1, 0.3, 0.7, ...]' +LIMIT ; +``` + +示例4:计算最近邻。 + +``` +openGauss=# SELECT * FROM items ORDER BY val <-> '[3,1,2]' LIMIT 5; +openGauss=# SELECT * FROM items ORDER BY val <#> '[3,1,2]' LIMIT 5; +openGauss=# SELECT * FROM items ORDER BY val <=> '[3,1,2]' LIMIT 5; +``` +>![](figures/icon-note.png) **说明:**
+>如果使用当前索引中不存在的距离计算操作符来进行扫描,即使关闭顺序扫描后仍会执行顺序扫描。
+> +>如果表中向量存在空值或者距离计算结果为NAN,查询结果会将其自动过滤。
+> +> 目前向量索引查询语法仅支持`order by <字段> <操作符> <查询向量>`子句,order by子句增加desc、非order by子句等均不支持走向量索引。 + +更多使用细节请参考: + +- [向量数据类型](../SQLReference/向量数据类型.md) + +- [向量函数和操作符](../SQLReference/向量函数和操作符.md) + +- [向量索引](../SQLReference/向量索引.md) diff --git a/content/zh/docs/DataVec/DataVec-tutorials.md b/content/zh/docs/DataVec/DataVec-tutorials.md new file mode 100644 index 0000000000000000000000000000000000000000..4416a1f2ef3cd94d43f1c4efc9051ad9dab7190e --- /dev/null +++ b/content/zh/docs/DataVec/DataVec-tutorials.md @@ -0,0 +1,6 @@ +# 向量数据库教程案例 + +本章节提供基于openGauss DataVec 的教程案例,帮助你更好的了解向量数据库的使用模式。 + +- openGauss DataVec + Dify, 快速搭建你的智能助手平台 +- SpringBoot 集成 openGauss DataVec, 智能问答一站式开发 diff --git a/content/zh/docs/AboutopenGauss/figures/Architecture-datavec.png b/content/zh/docs/DataVec/figures/Architecture-datavec.png similarity index 100% rename from content/zh/docs/AboutopenGauss/figures/Architecture-datavec.png rename to content/zh/docs/DataVec/figures/Architecture-datavec.png diff --git a/content/zh/docs/AboutopenGauss/figures/PQSearch-datavec.png b/content/zh/docs/DataVec/figures/PQSearch-datavec.png similarity index 100% rename from content/zh/docs/AboutopenGauss/figures/PQSearch-datavec.png rename to content/zh/docs/DataVec/figures/PQSearch-datavec.png diff --git a/content/zh/docs/AboutopenGauss/figures/PQTrain-datavec.png b/content/zh/docs/DataVec/figures/PQTrain-datavec.png similarity index 100% rename from content/zh/docs/AboutopenGauss/figures/PQTrain-datavec.png rename to content/zh/docs/DataVec/figures/PQTrain-datavec.png diff --git a/content/zh/docs/AboutopenGauss/figures/ParallelBuild-datavec.png b/content/zh/docs/DataVec/figures/ParallelBuild-datavec.png similarity index 100% rename from content/zh/docs/AboutopenGauss/figures/ParallelBuild-datavec.png rename to content/zh/docs/DataVec/figures/ParallelBuild-datavec.png diff --git a/content/zh/docs/AboutopenGauss/figures/SupportUstore-datavec.png b/content/zh/docs/DataVec/figures/SupportUstore-datavec.png similarity index 100% rename from content/zh/docs/AboutopenGauss/figures/SupportUstore-datavec.png rename to content/zh/docs/DataVec/figures/SupportUstore-datavec.png diff --git a/content/zh/docs/DataVec/figures/boostkit.png b/content/zh/docs/DataVec/figures/boostkit.png new file mode 100644 index 0000000000000000000000000000000000000000..bf354fb0b48fbab693aa8b354d9908dd8c00c58b Binary files /dev/null and b/content/zh/docs/DataVec/figures/boostkit.png differ diff --git a/content/zh/docs/AboutopenGauss/figures/gausscopilot-datavec.png b/content/zh/docs/DataVec/figures/gausscopilot-datavec.png similarity index 100% rename from content/zh/docs/AboutopenGauss/figures/gausscopilot-datavec.png rename to content/zh/docs/DataVec/figures/gausscopilot-datavec.png diff --git a/content/zh/docs/DataVec/figures/hybridsearch.png b/content/zh/docs/DataVec/figures/hybridsearch.png new file mode 100644 index 0000000000000000000000000000000000000000..fb60821f36644c12cb27fbf9757e08f86af96659 Binary files /dev/null and b/content/zh/docs/DataVec/figures/hybridsearch.png differ diff --git a/content/zh/docs/DataVec/figures/icon-note.png b/content/zh/docs/DataVec/figures/icon-note.png new file mode 100644 index 0000000000000000000000000000000000000000..789e42a8a4e810f4848631a7a64a8fe521ef0fe4 Binary files /dev/null and b/content/zh/docs/DataVec/figures/icon-note.png differ diff --git a/content/zh/docs/DataVec/milvus2datavec.md b/content/zh/docs/DataVec/milvus2datavec.md new file mode 100644 index 0000000000000000000000000000000000000000..424f2eef128dfc4f9601ffda36a76df6d5a827d5 --- /dev/null +++ b/content/zh/docs/DataVec/milvus2datavec.md @@ -0,0 +1,250 @@ +# 从Milvus迁移至openGauss DataVec + +本教程通过Python编程语言,支持将本地Milvus数据迁移至openGauss DataVec实例中 + +## 环境准备 +- 已部署2.3 及以上版本的Milvus实例 +- 已部署7.0.0-RC1 及以上版本的openGauss实例,容器部署参考[容器镜像安装](../InstallationGuide/容器镜像安装.md) +- 已安装3.8 及以上版本的Python环境 +- 已安装涉及的Python库 + +```python +pip3 install psycopg2 +pip3 install pymilvus==2.4.9 +pip3 install numpy +``` + +## 迁移操作 +### 1. 参考如下迁移脚本milvus2datavec.py及配置文件config.ini,根据本地部署的Milvus与openGauss进行配置修改: + +迁移配置文件config.ini如下: +``` +[Milvus] +host = localhost +port = 19530 + +[openGauss] +user = postgres +password = xxxxxx +port = 5432 +database = postgres + +[Table] +milvus_collection_name = test +opengauss_table_name = test +``` + +milvus2datavec.py迁移脚本如下: +```python +import psycopg2 +import csv +from pymilvus import connections, Collection +from concurrent.futures import ThreadPoolExecutor +import configparser +import numpy as np +import re +import os + +# Read database configuration from config.ini +config = configparser.ConfigParser() +config.read('config.ini') + +# Connect to Milvus +def connect_milvus(): + milvus_host = config.get('Milvus', 'host') + milvus_port = config.get('Milvus', 'port') + try: + connections.connect(alias="default", host=milvus_host, port=milvus_port) + print("Connected to Milvus successfully!") + except Exception as e: + print(f"Failed to connect to Milvus: {e}") + +# Query data from Milvus collection in pages +def query_milvus_paginated(collection_name, limit=1000, offset=0): + collection = Collection(collection_name) + collection.load() + results = collection.query(expr="", output_fields=[field.name for field in collection.schema.fields], limit=limit, offset=offset) + return results + +# Connect to openGauss +def connect_opengauss(): + opengauss_user = config.get('openGauss', 'user') + opengauss_password = config.get('openGauss', 'password') + opengauss_host = config.get('openGauss', 'host') + opengauss_port = config.get('openGauss', 'port') + opengauss_database = config.get('openGauss', 'database') + try: + conn = psycopg2.connect( + user=opengauss_user, + password=opengauss_password, + host=opengauss_host, + port=opengauss_port, + database=opengauss_database + ) + print("Connected to openGauss successfully!") + return conn + except Exception as e: + print(f"Failed to connect to openGauss: {e}") + return None + +# Define the data type mapping from Milvus to openGauss +def milvus_to_opengauss_type(milvus_field_type): + type_mapping = { + "Int64": "BIGINT", + "Int8": "SMALLINT", + "Int16": "SMALLINT", + "Int32": "INTEGER", + "Float": "FLOAT", + "Double": "DOUBLE PRECISION", + "VarChar": "VARCHAR", + "String": "TEXT", + "Json": "TEXT", + "FLOAT_VECTOR": "VECTOR", + "BINARY_VECTOR": "BIT", + "SPARSE_FLOAT_VECTOR": "SPARSEVECTOR", + "Bool": "BOOLEAN", + + } + return type_mapping.get(milvus_field_type, "TEXT") + +# Create a table in openGauss +def create_table_opengauss(conn, table_name, fields, collection): + cursor = conn.cursor() + columns = [] + for field in fields: + # Manually find the field with the specified name + milvus_field = next((f for f in collection.schema.fields if f.name == field), None) + if milvus_field: + opengauss_type = milvus_to_opengauss_type(milvus_field.dtype.name) + columns.append(f"{field} {opengauss_type}") + else: + print(f"Field {field} not found in collection schema.") + columns_str = ", ".join(columns) + create_table_query = f"CREATE TABLE IF NOT EXISTS {table_name} ({columns_str});" + try: + cursor.execute(create_table_query) + conn.commit() + print(f"Table {table_name} created successfully!") + except Exception as e: + print(f"Failed to create table: {e}") + finally: + cursor.close() + +# Save Milvus data to a CSV file in batches +def save_to_csv_batch(data, fields, csv_file_path): + with open(csv_file_path, 'a', newline='', encoding='utf-8') as csvfile: + writer = csv.DictWriter(csvfile, fieldnames=fields) + if csvfile.tell() == 0: + writer.writeheader() + for row in data: + new_row = {} + for field in fields: + value = row[field] + milvus_field = next((f for f in collection.schema.fields if f.name == field), None) + if milvus_field: + if isinstance(value, (list, np.ndarray)): + new_row[field] = "[" + ", ".join(str(x) for x in value) + "]" + else: + new_row[field] = str(value) + + writer.writerow(new_row) + print(f"Batch data saved to {csv_file_path} successfully!") + +# Export data from Milvus to a CSV file +def export_milvus_to_csv(milvus_collection_name, csv_file_path, limit=1000): + offset = 0 + collection = Collection(milvus_collection_name) + collection.load() + initial_data = query_milvus_paginated(milvus_collection_name, limit=1) + fields = [field.name for field in collection.schema.fields] + + while True: + milvus_data = query_milvus_paginated(milvus_collection_name, limit=limit, offset=offset) + if not milvus_data: + break + save_to_csv_batch(milvus_data, fields, csv_file_path) + offset += limit + +# Import data from a CSV file to openGauss +def import_csv_to_opengauss(conn, table_name, csv_file_path, fields): + cursor = conn.cursor() + try: + # Truncate the target table + cursor.execute(f"TRUNCATE TABLE {table_name};") + with open(csv_file_path, 'r', encoding='utf-8') as csvfile: + columns = ', '.join(fields) + copy_query = f"COPY {table_name} ({columns}) FROM STDIN WITH (FORMAT CSV, HEADER);" + cursor.copy_expert(copy_query, csvfile) + conn.commit() + print("Data imported from CSV to openGauss successfully!") + except Exception as e: + print(f"Failed to import data from CSV to openGauss: {e}") + finally: + cursor.close() + +if __name__ == "__main__": + # Read table name from config file + milvus_collection_name = config.get('Table', 'milvus_collection_name') + opengauss_table_name = config.get('Table', 'opengauss_table_name') + + # Generate the CSV file path based on the table name + output_folder = 'output' + if not os.path.exists(output_folder): + os.makedirs(output_folder) + + #csv_file_path = f'{opengauss_table_name}.csv' + + # Generate the CSV file path based on the table name + csv_file_path = os.path.join(output_folder, f'{milvus_collection_name}.csv') + + # Connect to Milvus + connect_milvus() + collection = Collection(milvus_collection_name) + collection.load() + initial_data = query_milvus_paginated(milvus_collection_name, limit=1) + fields = [field.name for field in collection.schema.fields] + + # Connect to openGauss + opengauss_conn = connect_opengauss() + + if opengauss_conn: + # Create a table in openGauss + create_table_opengauss(opengauss_conn, opengauss_table_name, fields, collection) + + # Export data from Milvus to a CSV file + export_milvus_to_csv(milvus_collection_name, csv_file_path) + + # Import data from a CSV file to openGauss + import_csv_to_opengauss(opengauss_conn, opengauss_table_name, csv_file_path, fields) + + opengauss_conn.close() + +``` + +2. 将迁移脚本、配置文件放置在同一目录下,层级如下: +``` +├── milvus2datavec.py +└── config.ini +``` + +3. 运行迁移脚本,并查看输出结果: +``` +python3 milvus2datavec.py +``` + +4. 登录openGauss,查看数据是否完成迁移: +4.1 进入容器: +``` +$ docker exec -it bash +``` + +4.2 登录`omm`超级用户: +``` +$ su omm +$ gsql -d postgres -p 5432 +``` + +4.3 查看迁移表数据量: +``` +$ select count(*) from test; +``` \ No newline at end of file diff --git a/content/docs-lite/zh/docs/BriefTutorial/PQ.md b/content/zh/docs/SQLReference/PQ.md similarity index 78% rename from content/docs-lite/zh/docs/BriefTutorial/PQ.md rename to content/zh/docs/SQLReference/PQ.md index 6e8e8f8bfb568d1f51f46e6f8632fb334c4e68a6..48f77568d0a52b60a1ce26c3c5e9465f5ac877fd 100644 --- a/content/docs-lite/zh/docs/BriefTutorial/PQ.md +++ b/content/zh/docs/SQLReference/PQ.md @@ -3,13 +3,13 @@ ## 介绍 本章节主要介绍openGauss数据库DataVec向量引擎PQ(Product Quantization)特性的安装使用步骤,以指导用户顺利完成操作。本特性将DataVec向量引擎和自研PQ算法相结合,以提高向量检索的查询性能。 ->![](public_sys-resources/icon-note.gif) **限制:
** +>![](../../../docs-lite/zh/docs/BriefTutorial/public_sys-resources/icon-note.gif) **限制:
** >PQ特性暂时只支持ARM架构环境。
>PQ特性暂时只支持HNSW和IVF索引。
->PQ特性暂时只支持vector数据类型,在其他向量数据类型构建HNSWPQ以及IVFPQ索引会导致执行失败。
+>PQ特性暂时只支持vector数据类型,在其他向量数据类型构建HNSW-PQ以及IVF-PQ索引会导致执行失败。
>在创建PQ索引前需要先插入数据,无数据情况下会创建失败。
>创建PQ索引时表中的数据量小于pq_ksub可以正常创建索引,但会提示参与训练码本的数据量较少,召回率可能会偏低。
->创建IVFPQ索引时,如果表数据量小于索引选项lists,会提示召回率低。
+>创建IVF-PQ索引时,如果表数据量小于索引选项lists,会提示召回率低。
>PQ不支持ustore表建立索引。 ## 安装准备 @@ -34,14 +34,14 @@ PQ特性只支持ARM架构环境。 ## 安装与卸载 ### 启用PQ特性 -设置GUC参数`enable_pq = on`启用PQ特性,详情请参考[DataVec向量引擎参数](../DatabaseReference/DataVec向量引擎参数.md)。 +设置GUC参数`enable_pq = on`启用PQ特性,详情请参考[DataVec向量引擎参数](../../../docs-lite/zh/docs/DatabaseReference/DataVec向量引擎参数.md)。 ### 关闭PQ特性 -设置GUC参数`enable_pq = off`关闭PQ特性,详情请参考[DataVec向量引擎参数](../DatabaseReference/DataVec向量引擎参数.md)。 +设置GUC参数`enable_pq = off`关闭PQ特性,详情请参考[DataVec向量引擎参数](../../../docs-lite/zh/docs/DatabaseReference/DataVec向量引擎参数.md)。 ## 使用PQ -### HNSWPQ +### HNSW-PQ ``` openGauss=# CREATE INDEX [INDEX_NAME] ON [TABLE_NAME] @@ -53,14 +53,14 @@ with (m=, ef_construction=, enable_pq = on, pq_m = , p - `TABLE_NAME` - 表名 - `COLUMN_NAME` - 向量数据列名 -#### HNSWPQ索引操作符 +#### HNSW-PQ索引操作符 HNSW索引操作符`[TYPE]_[DISTANCE_FUN]_ops` 格式: - `TYPE` - 向量类型 - vector -HNSWPQ索引支持向量数据维度: +HNSW-PQ索引支持向量数据维度: 名称 | 维度限制 --- | --- vector | 2,000 @@ -83,31 +83,31 @@ vector_cosine_ops | 余弦距离 - `enable_pq` - 开启pq量化压缩(默认off) - `pq_m` - 切分的子空间数量 1~2000(默认为8)。对于高维向量,pq_m的上限受页面大小限制,可能会在创建索引时报错,并给出当前向量维度对应pq_m的上限,还需结合pq_m的其他限制确定最终值。 - **示例:** 使用L2距离创建HNSWPQ索引,其中表items中向量为2000维。 + **示例:** 使用L2距离创建HNSW-PQ索引,其中表items中向量为2000维。 ``` openGauss=# CREATE INDEX ON items USING hnsw (embedding vector_l2_ops) WITH (enable_pq=on, pq_m=2000); ERROR: vector and pqcode must on the same page, max pq_m is 72 ``` - 对于HNSWPQ索引,2000维的vector pq_m的最大值是72,由于维度%pq_m=0的限制,pq_m的最大值是50。 + 对于HNSW-PQ索引,2000维的vector pq_m的最大值是72,由于维度%pq_m=0的限制,pq_m的最大值是50。 - `pq_ksub` - 每个子空间的聚类中心数量 1~256(默认为256)
**设置建议:** - pq_m:切分子空间越多,精度越高,同时性能越低。该值必须要能整除数据集维度,否则索引无法创建成功,推荐值为`维度/4`。 - pq_ksub:聚类中心越多,精度越高,但同时性能越低。推荐值为`256`。 -- 其余参数设置与[向量索引](../SQLReference/向量索引.md)中HNSW索引中相同。 +- 其余参数设置与[向量索引](../../../docs-lite/zh/docs/SQLReference/向量索引.md)中HNSW索引中相同。 #### GUC参数 - `hnsw_earlystop_threshold` - 设置图搜索的最大连续迭代次数 160~INT32_MAX-1 (默认INT32_MAX) - **示例:** 使用L2距离计算创建HNSWPQ索引并设置`m = 16, ef_construction = 64, pq_m=32`,并设置`hnsw_earlystop_threshold`为320。 + **示例:** 使用L2距离计算创建HNSW-PQ索引并设置`m = 16, ef_construction = 64, pq_m=32`,并设置`hnsw_earlystop_threshold`为320。 ``` openGauss=# CREATE INDEX ON items USING hnsw (embedding vector_l2_ops) WITH (m = 16, ef_construction = 64, enable_pq=on, pq_m=32); openGauss=# SET hnsw_earlystop_threshold = 320; ``` -### IVFPQ +### IVF-PQ ``` openGauss=# CREATE INDEX [INDEX_NAME] @@ -120,14 +120,14 @@ with (lists = , enable_pq = on, pq_m = , pq_ksub = , by_re - `TABLE_NAME` - 表名 - `COLUMN_NAME` - 向量数据列名 -#### IVFPQ索引操作符 +#### IVF-PQ索引操作符 IVFFLAT索引操作符 `[TYPE]_[DISTANCE_FUN]_ops` 格式: - `TYPE` -向量类型 - vector -IVFPQ索引执行向量数据维度: +IVF-PQ索引执行向量数据维度: 名称 | 维度限制 --- | --- vector | 2,000 @@ -151,7 +151,7 @@ vector_cosine_ops|<=>|余弦距离 - `pq_ksub` - 仅在`enable_pq`开启时有效,每个子空间的聚类中心数量 1~256 (默认256) - `by_residual` - 仅在`enable_pq`开启时有效,启用残差运算(默认off) - **示例:** 使用带残差的L2距离计算创建IVFPQ索引并设置`lists = 200, pq_m = 4, pq_ksub = 256`。 + **示例:** 使用带残差的L2距离计算创建IVF-PQ索引并设置`lists = 200, pq_m = 4, pq_ksub = 256`。 ``` openGauss=# CREATE INDEX ON items USING ivfflat (embedding vector_l2_ops) WITH (lists = 200, @@ -163,11 +163,11 @@ vector_cosine_ops|<=>|余弦距离 - pq_m:切分子空间越多,精度越高,同时性能越低。该值需要能整除数据集维度,推荐值为`维度/4`。 - pq_ksub:聚类中心越多,精度越高,但同时性能越低。推荐值为`256`。 - by_residual:启动残差计算可以提升精度,但是会增加构建索引的时间。推荐值`off`。 -- 其余参数设置与[向量索引](../SQLReference/向量索引.md)中IVFFLAT索引相同。 +- 其余参数设置与[向量索引](../../../docs-lite/zh/docs/SQLReference/向量索引.md)中IVFFLAT索引相同。 #### 查询选项 -- `ivfflat_probe` - 查询时候选集的大小,参见[DataVec向量引擎参数](../DatabaseReference/DataVec向量引擎参数.md)。 +- `ivfflat_probe` - 查询时候选集的大小,参见[DataVec向量引擎参数](../../../docs-lite/zh/docs/DatabaseReference/DataVec向量引擎参数.md)。 **示例:** @@ -175,7 +175,7 @@ vector_cosine_ops|<=>|余弦距离 openGauss=# SET ivfflat_probes = 10; ``` -- `ivfpq_kreorder` - 设置参与精排候选集的大小,参见[DataVec向量引擎参数](../DatabaseReference/DataVec向量引擎参数.md)。 +- `ivfpq_kreorder` - 设置参与精排候选集的大小,参见[DataVec向量引擎参数](../../../docs-lite/zh/docs/DatabaseReference/DataVec向量引擎参数.md)。 **示例:** diff --git a/content/zh/menu/index.md b/content/zh/menu/index.md index 272a84c40a6a5ca175bd1269371e795fcacb0a9d..c93bec3eba192f272bc1a88030a53605db4be592 100644 --- a/content/zh/menu/index.md +++ b/content/zh/menu/index.md @@ -123,7 +123,6 @@ headless: true - [全文索引]({{< relref "./docs/AboutopenGauss/全文索引.md" >}}) - [Copy接口支持容错机制]({{< relref "./docs/AboutopenGauss/Copy接口支持容错机制.md" >}}) - [分区]({{< relref "./docs/AboutopenGauss/分区.md" >}}) - - [DataVec向量引擎]({{< relref "./docs/AboutopenGauss/DataVec向量引擎.md" >}}) - [高级分析函数支持]({{< relref "./docs/AboutopenGauss/高级分析函数支持.md" >}}) - [物化视图]({{< relref "./docs/AboutopenGauss/物化视图.md" >}}) - [支持HyperLogLog]({{< relref "./docs/AboutopenGauss/支持HyperLogLog.md" >}}) @@ -297,7 +296,6 @@ headless: true - [并行查询]({{< relref "./docs/BriefTutorial/并行查询.md" >}}) - [资源池化]({{< relref "./docs/BriefTutorial/资源池化.md" >}}) - [UWAL]({{< relref "./docs/BriefTutorial/UWAL.md" >}}) - - [PQ]({{< relref "./docs/BriefTutorial/PQ.md" >}}) - [附录:SQL语法]({{< relref "./docs/BriefTutorial/附录-SQL语法.md" >}}) - [应用开发指南]({{< relref "./docs/DeveloperGuide/应用开发指南.md" >}}) - [数据查询请求处理过程]({{< relref "./docs/DeveloperGuide/数据查询请求处理过程.md" >}}) @@ -909,6 +907,11 @@ headless: true - [案例:改写SQL消除in-clause]({{< relref "./docs/PerformanceTuningGuide/案例-改写SQL消除in-clause.md" >}}) - [案例:修改启动参数解决TPCC大幅度波动]({{< relref "./docs/PerformanceTuningGuide/案例-修改启动参数解决TPCC大幅度波动.md" >}}) - [案例: 子事务TPCC性能调优]({{< relref "./docs/PerformanceTuningGuide/案例-子事务TPCC性能调优.md" >}}) +- [向量数据库]({{< relref "./docs/DataVec/DataVec-Overview.md" >}}) + - [快速入门指南]({{< relref "./docs/DataVec/DataVec-quickstart.md" >}}) + - [向量存储引擎]({{< relref "./docs/DataVec/DataVec-architecture.md" >}}) + - [工具编排使用]({{< relref "./docs/DataVec/DataVec-integrations.md" >}}) + - [教程案例指导]({{< relref "./docs/DataVec/DataVec-tutorials.md" >}}) - [AI特性指南]({{< relref "./docs/AIFeatureGuide/AI特性.md" >}}) - [AI4DB: 数据库自治运维]({{< relref "./docs/AIFeatureGuide/AI4DB-数据库自治运维.md" >}}) - [DBMind模式说明]({{< relref "./docs/AIFeatureGuide/DBMind模式说明.md" >}})