From e864ca5e08b37aa7bbd26dc25ee6cb5f29c07bca Mon Sep 17 00:00:00 2001 From: Shicong Date: Fri, 31 Oct 2025 01:04:26 +0800 Subject: [PATCH 1/5] add docs for vector index --- dir.yaml | 3 + zh_CN/assets/vector-index-model.png | Bin 0 -> 16182 bytes zh_CN/vector-search/quick-start.md | 2 +- zh_CN/vector-search/vector-index.md | 196 ++++++++++++++++++++++++++++ 4 files changed, 200 insertions(+), 1 deletion(-) create mode 100644 zh_CN/assets/vector-index-model.png create mode 100644 zh_CN/vector-search/vector-index.md diff --git a/dir.yaml b/dir.yaml index ce1318f6..dfb093c0 100644 --- a/dir.yaml +++ b/dir.yaml @@ -334,6 +334,9 @@ - title_en: Quick Start title_cn: 快速开始 path: vector-search/quick-start + - title_en: Vector Index + title_cn: 向量索引 + path: vector-search/vector-index - title_en: Key Value Data Model title_cn: Key-Value 存储 diff --git a/zh_CN/assets/vector-index-model.png b/zh_CN/assets/vector-index-model.png new file mode 100644 index 0000000000000000000000000000000000000000..ccaab86f78e9a61a46403bc63845dedd7ff944ac GIT binary patch literal 16182 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 向量组的倒排索引。在构建向量索引时,我们首先利用 K-Means 聚簇算法将向量数据集分成若干个向量组,每个向量组存在一个质心(Centroid)。IVF 模型维护了每个质心与其所在向量组的映射关系。 + +### Cell Index + +我们将每一个向量组称为一个 Cell,该名称延用知名向量检索库 Faiss 中的命名。Datalayers 支持给向量组内的向量构建索引,称为 Cell Index,以加速向量组内的近似最近邻搜索。例如,当我们使用 HNSW 向量索引时,我们会为每个向量组构建一个图索引,利用图数据结构来加速检索。 + +### Vector Store + +Vector Store 是向量的存储抽象。为了节省存储空间,我们支持对向量进行量化。量化指将原始向量投影到另一个更紧凑的向量空间,以达到数据压缩的目的。主流的量化算法包括乘积量化(PQ)、标量量化(SQ)等,它们均是有损、不可逆的量化算法,因此在搜索时会降低召回率。 + +## 基于索引的向量检索 + +基于索引的三层式结构,Datalayers 的向量检索分成如下步骤: + +1. 模糊搜索:给定查询向量 Q,我们首先访问 IVF Model,计算 Q 与所有质心的距离,并取最近的 P 个质心所对应的向量组。 +2. 精确搜索:对于每个向量组,我们使用 Cell Index 加速向量组内的近似最近邻搜索,每个质心得到 top-N 个与 Q 距离最近的向量。 +3. Refine:考虑到向量索引会降低召回率,对于搜索得到的 `P * N` 个向量,计算它们与 Q 的距离,得到最终的 top-K 个距离最近的向量。其中 `N / K` 称为 `refine_factor`,表示为了补偿召回率,我们在精确搜索时多检索了多少向量。 + +## 索引类型 + +| | IVF Model | Cell Index | Vector Store | 是否已支持 | +| :----- | :----------: | :---------: | :----------: | :-----: | +| FLAT | Cell 个数固定为 1 | FLAT | FLAT | 是 | +| IVF_FLAT | 支持配置 Cell 个数 | FLAT | FLAT | 是 | +| IVF_PQ | 支持配置 Cell 个数 | FLAT | PQ | 是 | +| IVF_SQ | 支持配置 Cell 个数 | FLAT | SQ | 否 | +| IVF_RQ | 支持配置 Cell 个数 | FLAT | RQ | 否 | +| HNSW | Cell 个数固定为 1 | HNSW | FLAT | 否 | +| IVF_HNSW | 支持配置 Cell 个数 | HNSW | FLAT | 否 | +| IVF_HNSW_PQ | 支持配置 Cell 个数 | HNSW | PQ | 否 | + +注: + +- Cell Index 为 FLAT,表示不使用 Cell Index。 +- Cell Index 为 HNSW,表示使用 HNSW(Hierarchical Navigable Small Worlds)索引作为 Cell Index。 +- Vector Store 为 FLAT,表示不使用任何量化算法,而存储原始、未经压缩的向量。 +- PQ 指 Product Quantization,即乘积量化。 +- SQ 指 Scalar Quantization,即标量量化。 +- RQ 指 RaBit Quantization。 + +## 示例 + +创建一个表,包含一个向量列,为该向量列指定 IVF_PQ 索引,同时指定构建索引的距离函数为 L2。 + +``` sql +CREATE DATABASE IF NOT EXISTS `demo`; + +CREATE TABLE `demo`.`t` ( + `ts` TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + `sid` INT32 NOT NULL, + `value` REAL, + `flag` INT8, + `embed` VECTOR(64), + TIMESTAMP KEY(`ts`), + VECTOR INDEX `my_vector_index`(`embed`) WITH (TYPE=IVF_PQ, DISTANCE=L2) +) +PARTITION BY HASH (`sid`) PARTITIONS 2 +ENGINE=TimeSeries +WITH ( + MEMTABLE_SIZE=1024MB, + STORAGE_TYPE=LOCAL, + UPDATE_MODE=APPEND +); +``` + +使用以下脚本向该表写入一定规模的随机向量数据。 + +``` bash +#!/bin/bash + +# 数据库和表信息 +DATABASE="demo" +TABLE="t" + +# 写入参数 +TOTAL_ROWS=10000 +BATCH_SIZE=1000 +NUM_BATCHES=$((TOTAL_ROWS / BATCH_SIZE)) + +echo "开始向表 $DATABASE.$TABLE 写入 $TOTAL_ROWS 条数据..." +echo "批次大小: $BATCH_SIZE, 总批次: $NUM_BATCHES" + +# 循环写入每个批次 +for ((batch=0; batch show tasks + ++-------------+---------+---------+-------------------+-------------+----------------------------------------------------+ +| type | running | pending | concurrence_limit | queue_limit | description | ++-------------+---------+---------+-------------------+-------------+----------------------------------------------------+ +| build_index | 1 | 1 | 1 | 10000 | Build index. | +| compact | 0 | 0 | 3 | 10000 | Compaction, TTL clean. | +| flush | 0 | 0 | 10 | 10000 | Flush memtable into file. | +| gc | 0 | 0 | 100 | 10000 | Delete files when drop table, truncate table, etc. | +| timer | 0 | 18 | 0 | 0 | Delayed tasks executed at specified time | +| workflow | 0 | 0 | 10 | 10000 | Table DDL operation. | ++-------------+---------+---------+-------------------+-------------+----------------------------------------------------+ +``` + +基于向量索引,执行向量检索。 + +``` sql +> select value from demo.t order by l2_distance(embed, [-27.257347, 69.88406, -33.87725, -45.43667, 78.53923, -62.239624, 46.93875, -65.58995, 58.593567, -50.290775, -84.47287, -50.84324, -96.29624, 31.380386, -84.86805, 46.32669, 64.30214, -20.59021, -13.050842, 7.1819077, -90.43755, 78.410645, -95.14334, 11.760185, -28.298279, -50.35386, 28.105515, 2.62928, -1.5383224, -65.421036, -43.670464, -70.41793, 98.37227, -72.5616, -92.90261, 83.1181, 95.64261, -24.865028, -93.47577, 35.42575, 21.040176, -66.507195, 12.745956, 11.97419, -63.0162, -56.616615, -2.9391556, 9.117722, 51.044647, -34.543037, 0.15356445, -43.10696, 75.61786, 51.381348, -83.28052, -72.96283, 95.93945, 20.84031, 78.44403, 4.9338837, -40.74118, -75.96121, 62.313156, 59.93535]) limit 5; + ++-----------+ +| value | ++-----------+ +| 160.44057 | +| 114.49519 | +| 144.50352 | +| 130.83801 | +| 161.06036 | ++-----------+ +``` + +注意,示例数据为随机生成,因此实际检索结果可能与示例结果存在差异。 + +## 注意事项 + +- 构建索引时的距离函数与搜索时的距离函数必须一致,否则无法触发向量索引。 +- 目前仅支持为 32 维以上的向量列构建向量索引。 +- 目前不支持为索引配置构建参数、搜索参数,仅支持使用内部默认参数。 From 382cd9754e703b210c7d98112b7f20d8f71e7b8e Mon Sep 17 00:00:00 2001 From: Shicong Date: Fri, 31 Oct 2025 01:05:49 +0800 Subject: [PATCH 2/5] add docs for vector index --- en_US/vector-search/vector-index.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 en_US/vector-search/vector-index.md diff --git a/en_US/vector-search/vector-index.md b/en_US/vector-search/vector-index.md new file mode 100644 index 00000000..e69de29b From b94a3f4c9c4cfbe9198a62892b470edacdebcbb3 Mon Sep 17 00:00:00 2001 From: Shicong Date: Fri, 31 Oct 2025 11:21:01 +0800 Subject: [PATCH 3/5] add docs for vector index --- zh_CN/vector-search/vector-index.md | 278 ++++++++++++++++------------ 1 file changed, 158 insertions(+), 120 deletions(-) diff --git a/zh_CN/vector-search/vector-index.md b/zh_CN/vector-search/vector-index.md index a4420820..bb43c49f 100644 --- a/zh_CN/vector-search/vector-index.md +++ b/zh_CN/vector-search/vector-index.md @@ -24,11 +24,11 @@ Vector Store 是向量的存储抽象。为了节省存储空间,我们支持 ## 基于索引的向量检索 -基于索引的三层式结构,Datalayers 的向量检索分成如下步骤: +给定查询向量 Q 以及 top-K 中的 K,基于索引的三层式结构,Datalayers 的向量检索分成如下步骤: -1. 模糊搜索:给定查询向量 Q,我们首先访问 IVF Model,计算 Q 与所有质心的距离,并取最近的 P 个质心所对应的向量组。 +1. 模糊搜索:我们首先访问 IVF Model,计算 Q 与所有质心的距离,并取最近的 P 个质心所对应的向量组。 2. 精确搜索:对于每个向量组,我们使用 Cell Index 加速向量组内的近似最近邻搜索,每个质心得到 top-N 个与 Q 距离最近的向量。 -3. Refine:考虑到向量索引会降低召回率,对于搜索得到的 `P * N` 个向量,计算它们与 Q 的距离,得到最终的 top-K 个距离最近的向量。其中 `N / K` 称为 `refine_factor`,表示为了补偿召回率,我们在精确搜索时多检索了多少向量。 +3. 精炼:考虑到向量索引会降低召回率,对于搜索得到的 `P * N` 个向量,计算它们与 Q 的距离,得到最终的 top-K 个距离最近的向量。其中 `N / K` 称为 `refine_factor`,表示为了补偿召回率,我们在精确搜索时每个向量组额外检索了多少个向量。这个步骤称为精炼(Refine)。 ## 索引类型 @@ -38,15 +38,17 @@ Vector Store 是向量的存储抽象。为了节省存储空间,我们支持 | IVF_FLAT | 支持配置 Cell 个数 | FLAT | FLAT | 是 | | IVF_PQ | 支持配置 Cell 个数 | FLAT | PQ | 是 | | IVF_SQ | 支持配置 Cell 个数 | FLAT | SQ | 否 | -| IVF_RQ | 支持配置 Cell 个数 | FLAT | RQ | 否 | -| HNSW | Cell 个数固定为 1 | HNSW | FLAT | 否 | -| IVF_HNSW | 支持配置 Cell 个数 | HNSW | FLAT | 否 | +| IVF_RQ | 支持配置 Cell 个数 | FLAT | RQ | 否 | +| HNSW | Cell 个数固定为 1 | HNSW | FLAT | 否 | +| IVF_HNSW | 支持配置 Cell 个数 | HNSW | FLAT | 否 | | IVF_HNSW_PQ | 支持配置 Cell 个数 | HNSW | PQ | 否 | +| IVF_HNSW_SQ | 支持配置 Cell 个数 | HNSW | SQ | 否 | +| IVF_HNSW_RQ | 支持配置 Cell 个数 | HNSW | RQ | 否 | 注: -- Cell Index 为 FLAT,表示不使用 Cell Index。 -- Cell Index 为 HNSW,表示使用 HNSW(Hierarchical Navigable Small Worlds)索引作为 Cell Index。 +- Cell Index 为 FLAT,表示向量组内的搜索退回到平搜(Flat Search),即搜索所有向量。 +- Cell Index 为 HNSW,表示使用 HNSW(Hierarchical Navigable Small Worlds)索引加速向量组内的搜索。 - Vector Store 为 FLAT,表示不使用任何量化算法,而存储原始、未经压缩的向量。 - PQ 指 Product Quantization,即乘积量化。 - SQ 指 Scalar Quantization,即标量量化。 @@ -54,107 +56,161 @@ Vector Store 是向量的存储抽象。为了节省存储空间,我们支持 ## 示例 -创建一个表,包含一个向量列,为该向量列指定 IVF_PQ 索引,同时指定构建索引的距离函数为 L2。 +我们提供了一个 Python 脚本,展示如何使用向量索引来加速向量检索。这个脚本执行的步骤如下: + +1. 创建数据库 `demo`。 +2. 创建表 `t`。表中包含一个向量列 `embed`,维度为 64。同时为该列指定 IVF_PQ 索引,同时设置构建索引的距离函数为 L2。 +3. 写入 5000 条随机数据。 +4. Flush 数据。 +5. 等待索引构建完成,默认等待 15 秒。 +6. 使用随机向量,执行向量检索。 + +``` python +import http +import json +import random +import time +from http.client import HTTPConnection + + +def main(): + host = "0.0.0.0" + port = 8361 + url = "http://{}:{}/api/v1/sql".format(host, port) + headers = { + "Content-Type": "application/binary", + "Authorization": "Basic YWRtaW46cHVibGlj" + } + conn = http.client.HTTPConnection(host=host, port=port) + + # Create database `demo`. + sql = "CREATE DATABASE IF NOT EXISTS demo;" + conn.request(method="POST", url=url, headers=headers, body=sql) + print_response("创建数据库", conn) + + # Create table `t`. + sql = ''' + CREATE TABLE IF NOT EXISTS `demo`.`t` ( + `ts` TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + `sid` INT32 NOT NULL, + `value` REAL, + `flag` INT8, + `embed` VECTOR(64), + TIMESTAMP KEY(`ts`), + VECTOR INDEX `my_vector_index`(`embed`) WITH (TYPE=IVF_PQ, DISTANCE=L2) + ) + PARTITION BY HASH (`sid`) PARTITIONS 1 + ENGINE=TimeSeries + WITH ( + MEMTABLE_SIZE=1024MB, + STORAGE_TYPE=LOCAL, + UPDATE_MODE=APPEND + ); + ''' + conn.request(method="POST", url=url, headers=headers, body=sql) + print_response("创建表", conn) + + # 分批插入数据 + insert_data( + conn, url, headers, total_rows=5000, batch_size=1000) + + # Flush 数据 + flush_data(conn, url, headers) + + # 等待索引构建完成 + print("等待索引构建完成...") + time.sleep(15) + + # Vector search with random query vector + query_vector = generate_random_vector(64) + sql = f"SELECT value FROM demo.t WHERE sid = 1 ORDER BY l2_distance(embed, {query_vector}) LIMIT 1" + print(f"执行向量检索: {sql}") + conn.request(method="POST", url=url, headers=headers, body=sql) + print_query_result(conn) + + +def generate_random_vector(dim: int) -> str: + """生成随机向量字符串表示""" + vector = [round(random.uniform(-1.0, 1.0), 6) for _ in range(dim)] + return "[" + ", ".join(map(str, vector)) + "]" + + +def insert_data(conn: HTTPConnection, url: str, headers: dict, total_rows: int, batch_size: int): + """分批插入数据""" + num_batches = total_rows // batch_size + + print(f"开始插入 {total_rows} 条数据,分 {num_batches} 批次,每批 {batch_size} 条") + + for batch in range(num_batches): + print(f"插入第 {batch + 1}/{num_batches} 批次...") + + values = [] + for _ in range(batch_size): + sid = random.randint(0, 5000) + value = round(random.uniform(0.0, 100.0), 2) + flag = random.randint(0, 1) + embed = generate_random_vector(64) + + values.append(f"({sid}, {value}, {flag}, {embed})") + + sql = f"INSERT INTO demo.t (sid, value, flag, embed) VALUES {', '.join(values)}" + conn.request(method="POST", url=url, headers=headers, body=sql) + + response = conn.getresponse() + + if response.status == 200: + print(f"✓ 第 {batch + 1} 批次插入成功") + else: + print(f"✗ 第 {batch + 1} 批次插入失败: {response.status} {response.reason}") + + response.read() + + time.sleep(0.5) + + +def flush_data(conn: HTTPConnection, url: str, headers: dict): + print("正在 Flush 数据") + sql = "FLUSH TABLE demo.t SYNC" + conn.request(method="POST", url=url, headers=headers, body=sql) + + response = conn.getresponse() + + if response.status == 200: + print(f"Flush 数据成功") + else: + print(f"Flush 数据失败: {response.status} {response.reason}") -``` sql -CREATE DATABASE IF NOT EXISTS `demo`; - -CREATE TABLE `demo`.`t` ( - `ts` TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - `sid` INT32 NOT NULL, - `value` REAL, - `flag` INT8, - `embed` VECTOR(64), - TIMESTAMP KEY(`ts`), - VECTOR INDEX `my_vector_index`(`embed`) WITH (TYPE=IVF_PQ, DISTANCE=L2) -) -PARTITION BY HASH (`sid`) PARTITIONS 2 -ENGINE=TimeSeries -WITH ( - MEMTABLE_SIZE=1024MB, - STORAGE_TYPE=LOCAL, - UPDATE_MODE=APPEND -); -``` + response.read() -使用以下脚本向该表写入一定规模的随机向量数据。 - -``` bash -#!/bin/bash - -# 数据库和表信息 -DATABASE="demo" -TABLE="t" - -# 写入参数 -TOTAL_ROWS=10000 -BATCH_SIZE=1000 -NUM_BATCHES=$((TOTAL_ROWS / BATCH_SIZE)) - -echo "开始向表 $DATABASE.$TABLE 写入 $TOTAL_ROWS 条数据..." -echo "批次大小: $BATCH_SIZE, 总批次: $NUM_BATCHES" - -# 循环写入每个批次 -for ((batch=0; batch show tasks @@ -171,24 +227,6 @@ FLUSH TABLE demo.t; +-------------+---------+---------+-------------------+-------------+----------------------------------------------------+ ``` -基于向量索引,执行向量检索。 - -``` sql -> select value from demo.t order by l2_distance(embed, [-27.257347, 69.88406, -33.87725, -45.43667, 78.53923, -62.239624, 46.93875, -65.58995, 58.593567, -50.290775, -84.47287, -50.84324, -96.29624, 31.380386, -84.86805, 46.32669, 64.30214, -20.59021, -13.050842, 7.1819077, -90.43755, 78.410645, -95.14334, 11.760185, -28.298279, -50.35386, 28.105515, 2.62928, -1.5383224, -65.421036, -43.670464, -70.41793, 98.37227, -72.5616, -92.90261, 83.1181, 95.64261, -24.865028, -93.47577, 35.42575, 21.040176, -66.507195, 12.745956, 11.97419, -63.0162, -56.616615, -2.9391556, 9.117722, 51.044647, -34.543037, 0.15356445, -43.10696, 75.61786, 51.381348, -83.28052, -72.96283, 95.93945, 20.84031, 78.44403, 4.9338837, -40.74118, -75.96121, 62.313156, 59.93535]) limit 5; - -+-----------+ -| value | -+-----------+ -| 160.44057 | -| 114.49519 | -| 144.50352 | -| 130.83801 | -| 161.06036 | -+-----------+ -``` - -注意,示例数据为随机生成,因此实际检索结果可能与示例结果存在差异。 - ## 注意事项 - 构建索引时的距离函数与搜索时的距离函数必须一致,否则无法触发向量索引。 From 821c7bce5d1b5ff2aeb442117a63612143ec5407 Mon Sep 17 00:00:00 2001 From: YinBo Date: Mon, 3 Nov 2025 03:40:27 +0000 Subject: [PATCH 4/5] chore: docs --- zh_CN/vector-search/overview.md | 25 ++++++++++++++----------- zh_CN/vector-search/quick-start.md | 14 +++++++++----- zh_CN/vector-search/vector-index.md | 6 +++--- 3 files changed, 26 insertions(+), 19 deletions(-) diff --git a/zh_CN/vector-search/overview.md b/zh_CN/vector-search/overview.md index 6ee075f3..ed535a9f 100644 --- a/zh_CN/vector-search/overview.md +++ b/zh_CN/vector-search/overview.md @@ -1,6 +1,7 @@ -# 向量检索概述 +# 向量检索技术指南 -向量检索是一种在非结构化数据中进行快速近似搜索的技术。常见的非结构化数据,例如文档、图像、音频、视频等数据,作为向量嵌入(Vector Embedding)存储在数据库中。用户使用向量检索技术,在数据库中查找与给定的目标向量最相似的数条向量,以及这些向量所对应的元信息,最终交给上层应用执行业务操作。 +## 概述 +向量检索是一种针对非结构化数据的高效近似搜索技术。该技术将文档、图像、音频、视频等非结构化数据转换为向量嵌入(Vector Embedding)存储在数据库中,通过计算向量间的相似度来实现数据检索。 ![向量检索框架](../assets/vector-search-arch.png) @@ -8,15 +9,17 @@ 与传统的全文搜索不同,向量检索并不使用关键词进行精确或模糊匹配,而是用向量距离近似度量语义相似度,从而实现高效的近似检索。 -## 为什么选择 Datalayers 向量检索 - -- 原生向量类型:原生提供向量类型,支持高压缩率向量存储、高性能向量检索。 -- 混合检索:支持向量检索、以及向量检索与标量检索的混合检索。 -- 简单易用:原生 SQL 支持,兼容 MySQL 方言。 -- 多模态:提供时序、关系、流计算、日志等引擎,快速集成向量检索至任何业务场景。 -- 存算分离:计算和存储节点解耦,均可无限水平扩展,支持海量向量数据的存储和搜索。 -- 分布式:采用分布式架构,提供完备的容灾、备份、恢复策略。 -- 数据安全:支持高性能、强隐私的数据加密。 +## Datalayers 向量检索优势 + +| 特性 | 说明 | +| ------------- | ------------------------------------------------------------------- | +| 原生向量类型 | 原生提供向量类型,支持高压缩率向量存储、高性能向量检索 | +| 丰富的索引 | 丰富的索引类型,以满足各种应用场景 | +| 混合检索 | 支持向量检索、以及向量检索与标量检索的混合检索 | +| 简单易用 | 原生 SQL 支持,兼容 MySQL 方言 | +| 多模态 | 提供时序、关系、流计算、日志等引擎,快速集成向量检索至任何业务场景 | +| 存算分离 | 计算和存储节点解耦,均可无限水平扩展,支持海量向量数据的存储和搜索 | +| 分布式 | 采用分布式架构,提供完备的容灾、备份、恢复策略 | ## 核心概念 diff --git a/zh_CN/vector-search/quick-start.md b/zh_CN/vector-search/quick-start.md index a12f3469..94d4dd00 100644 --- a/zh_CN/vector-search/quick-start.md +++ b/zh_CN/vector-search/quick-start.md @@ -1,9 +1,10 @@ -# 快速开始 +# 快速开始 -本教程介绍如何使用 Datalayers 数据库执行向量存储和向量检索。 +本文档介绍如何在 Datalayers 数据库中进行向量数据的存储和检索操作。 -我们创建一个含有向量列的表。 +## 创建向量表 +首先创建一个包含向量列的数据表: ```sql CREATE TABLE t( ts TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, @@ -18,8 +19,9 @@ ENGINE=TimeSeries 其中,`embed VECTOR(3)` 表示创建一个名为 `embed` 的向量列,该列中每个向量的维度为 3。 -向该表写入一些数据: +## 插入向量数据 +向表中插入示例数据: ```sql INSERT INTO t (id, tag, embed) VALUES (1, 'cat', [1.0, 1.1, 1.2]), @@ -27,8 +29,9 @@ INSERT INTO t (id, tag, embed) VALUES (3, 'mouse', [6.4, 9.1, 7.8]); ``` -查询该表,应该得到如下数据: +## 查询数据 +查看表中所有数据: ```sql > SELECT * FROM t ORDER BY id; +---------------------------+----+-------+------------------+ @@ -40,6 +43,7 @@ INSERT INTO t (id, tag, embed) VALUES +---------------------------+----+-------+------------------+ ``` +## 向量相似度检索 使用 ORDER BY + LIMIT 语句,构造出向量检索所对应的 SQL。例如搜索与目标向量最近的一个向量所对应的 tag: ```sql diff --git a/zh_CN/vector-search/vector-index.md b/zh_CN/vector-search/vector-index.md index bb43c49f..8eb48199 100644 --- a/zh_CN/vector-search/vector-index.md +++ b/zh_CN/vector-search/vector-index.md @@ -1,7 +1,7 @@ -# 向量索引 - -向量索引用于加速向量检索,适合针对大规模向量数据集的快速查询。Datalayers 目前支持 FLAT、IVF_FLAT、IVF_PQ 等索引,IVF_SQ、HNSW 等更多索引正在开发中。 +# 向量索引技术指南 +## 概述 +向量索引是加速大规模向量数据集检索的关键技术。Datalayers 支持多种向量索引类型,通过三层式架构实现高效的近似最近邻搜索。 使用向量索引会带来额外的构建索引开销、检索开销,同时可能会降低召回率(recall),因此需要根据具体场景选择合适的索引、以及配置合适的参数。 ## 向量索引模型 From c208c60fd30fb88fa776afcedea7ddfd04d498c3 Mon Sep 17 00:00:00 2001 From: YinBo Date: Mon, 3 Nov 2025 03:41:26 +0000 Subject: [PATCH 5/5] fix --- zh_CN/vector-search/quick-start.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zh_CN/vector-search/quick-start.md b/zh_CN/vector-search/quick-start.md index 94d4dd00..fbbd4bcc 100644 --- a/zh_CN/vector-search/quick-start.md +++ b/zh_CN/vector-search/quick-start.md @@ -1,4 +1,4 @@ -# 快速开始 +# 快速开始 本文档介绍如何在 Datalayers 数据库中进行向量数据的存储和检索操作。