尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

LanceDB Node.js 多向量搜索:理解 MultiVector 类型别名与多向量查询实战

发布时间:2026/9/24 8:41:53

资讯中心
01
ARTICLE

LanceDB Node.js 多向量搜索:理解 MultiVector 类型别名与多向量查询实战

LanceDB Node.js 多向量搜索:理解 MultiVector 类型别名与多向量查询实战
向量数据库数据库人工智能后端【免费下载链接】lancedbDeveloper-friendly OSS embedded retrieval library for multimodal AI. Search More; Manage Less.项目地址https://gitcode.com/gh_mirrors/la/lancedb点击查看免费下载MultiVector是 lancedb/lancedb 中定义的多向量MultiVector类型别名由多个单向量元素组成的数组用于表示一个文档/对象对应的多条向量表示。本篇文章以该类型为切入点结合仓库源码与测试用例讲解如何在 Node.js 中创建多向量表、构建多向量查询以及理解 LanceDB 多向量搜索与多查询向量Multi-Query Vector的底层机制。MultiVector 类型定义根据 MultiVector 类型别名文档其完整定义如下type MultiVector: IntoVector[];即MultiVector是一个IntoVector类型的数组。它没有额外字段唯一的约束就是数组中的每一个元素都必须是一个合法的IntoVector。这意味着一个MultiVector可以是一个包含若干Float32Array的数组也可以是一个混合了普通number[]与 TypedArray 的数组。在 类型别名索引 中MultiVector与IntoVector一同被导出供Table、Query等核心 API 使用。IntoVectorMultiVector 的元素类型MultiVector的每个元素都必须是IntoVector。IntoVector的定义见 IntoVector 类型别名type IntoVector: | Float32Array | Float64Array | Uint8Array | number[] | PromiseFloat32Array | Float64Array | Uint8Array | number[];从定义可以看出IntoVector支持以下形式类型说明Float32Array32 位浮点向量最常用的向量表示Float64Array64 位浮点向量Uint8Array8 位无符号整型向量常见于二进制向量number[]普通 JS 数组Promise...以上任意类型的异步包装便于与嵌入模型等异步调用衔接相应地一个合法的MultiVector示例const multiVector: MultiVector [ new Float32Array([0.1, 0.2, 0.3]), [0.4, 0.5, 0.6], // number[] 也合法 Promise.resolve(new Float32Array([0.7, 0.8, 0.9])), ];源码中的类型定义与运行时类型守卫在 nodejs/lancedb/arrow.ts 中可以同时看到IntoVector、MultiVector的类型定义以及配套的运行时类型守卫函数export type IntoVector | Float32Array | Float64Array | Uint8Array | number[] | PromiseFloat32Array | Float64Array | Uint8Array | number[]; export type MultiVector IntoVector[]; export function isMultiVector(value: unknown): value is MultiVector { return Array.isArray(value) isIntoVector(value[0]); } export function isIntoVector(value: unknown): value is IntoVector { return ( value instanceof Float32Array || value instanceof Float64Array || value instanceof Uint8Array || (float16ArrayCtor ! undefined value instanceof float16ArrayCtor) || (Array.isArray(value) !Array.isArray(value[0])) ); }这里有几点值得注意的实现细节isMultiVector的判定逻辑是“数组且第一个元素是合法向量”这是 LanceDB 区分单向量与多向量的关键判据见 nodejs/lancedb/arrow.ts。isIntoVector额外通过动态获取的Float16Array构造器支持了Float16Array 半精度向量见 nodejs/lancedb/arrow.ts因为Float16Array尚未进入 TypeScript 标准库源码通过globalThis动态探测其是否存在兼容性好。两个类型守卫同时以 TypeScript 类型谓词value is ...形式导出可同时用于运行时校验与类型收窄。此外MultiVector与IntoVector均通过 nodejs/lancedb/index.ts 从包入口统一导出因此可以直接从lancedb/lancedb导入import { MultiVector, IntoVector, isMultiVector } from lancedb/lancedb;使用 MultiVector 进行多向量搜索通过 table.search 自动识别多向量在 nodejs/lancedb/table.ts 中search()方法接受string | IntoVector | MultiVector | FullTextQuery作为查询参数。当传入MultiVector时会自动将所有子向量作为查询向量执行向量搜索const results await table.search(multiVector).limit(10).toArray();该路径的完整调用链为search(multiVector)内部将查询向量交给nearestTonearestTo构造底层的 ANN 搜索结果通过toArray()/toArrow()返回。通过 table.vectorSearch 显式传入多向量Table还提供了专门的方法vectorSearch(vector: IntoVector | MultiVector)见 nodejs/lancedb/table.ts其实现体现了多向量处理的核心逻辑vectorSearch(vector: IntoVector | MultiVector): VectorQuery { if (isMultiVector(vector)) { const query this.query().nearestTo(vector[0]); for (const v of vector.slice(1)) { query.addQueryVector(v); } return query; } return this.query().nearestTo(vector); }可以看到多向量查询本质上等价于以vector[0]作为主查询向量调用nearestTo对剩余的每个子向量调用addQueryVector追加为附加查询向量。多查询向量与 query_index 列addQueryVector的语义在 nodejs/lancedb/query.ts 中有详细注释它可以被多次调用以追加多个查询向量搜索结果中会增加一个query_index列用于标识每条结果是由哪个查询向量产生的。其底层实现要点见 nodejs/lancedb/query.tsFlat 搜索多个查询向量共享一次表扫描避免并发执行多个查询带来的扫描与内存放大开销索引搜索每个查询向量仍各自执行索引检索Promise 处理当传入的查询向量是Promise时会立即观察settle该 Promise 以避免“未处理的拒绝”unhandled rejection并在底层查询就绪后写入向量这是源码中对异步向量输入的特殊优化见 nodejs/lancedb/query.ts。一个完整的多查询向量示例import { connect } from lancedb/lancedb; const db await connect(./data/multivector_demo); const table await db.openTable(multivectors); const query table.vectorSearch([ new Float32Array([0.1, 0.2]), new Float32Array([0.3, 0.4]), new Float32Array([0.5, 0.6]), ]).limit(10); const results await query.toArray(); // 每条结果带有 query_index 字段标识来自哪个查询向量 console.log(results.map((r) r.query_index));多向量表的创建与索引多向量数据的表结构与普通向量表不同每个字段对应一个“向量列表”list of vectors。仓库测试 nodejs/test/table.test.ts 中的 “index and search multivectors” 用例给出了完整的建表与检索范式const data []; // 生成 256 条记录每条包含 10 个二维向量 for (let i 0; i 256; i) { data.push({ multivector: Array.from({ length: 10 }, () Array(2).fill(Math.random()), ), }); } const table await db.createTable(multivectors, data, { schema: new Schema([ new Field( multivector, new List( new Field( item, new FixedSizeList(2, new Field(item, new Float32())), ), ), ), ]), }); // 先执行一次 flat 搜索 const results await table.search(data[0].multivector).limit(10).toArray(); // 为多向量列创建 IVF-PQ 索引 await table.createIndex(multivector, { config: Index.ivfPq({ numPartitions: 2, distanceType: cosine }), }); // 建索引后再搜索 const results2 await table .search(data[0].multivector) .limit(10) .toArray();关键要点多向量列的 Arrow schema 采用ListFixedSizeList...嵌套结构外层List表示多个向量内层FixedSizeList表示每个向量的定长维度该测试同时验证了 flat 搜索与 IVF-PQ 索引搜索两条路径见 nodejs/test/table.test.ts索引配置通过Index.ivfPq(...)构造核心参数为numPartitions分区数与distanceType距离度量。注意事项与使用约束结合源码与测试使用MultiVector时需要注意距离度量限制LanceDB 的多向量索引目前仅支持余弦相似度cosine。这一点在 Python 端文档测试 python/python/tests/docs/test_multivector.py 中有明确注释only cosine similarity is supported for multi-vectors建索引时distanceType应使用cosine。数组判定的边界isMultiVector只检查数组第一个元素是否为向量。因此传入空数组[]时会被判定为false请确保至少包含一个子向量。异步向量支持MultiVector的元素允许是Promise适合直接传入嵌入模型的异步调用结果无需提前await。多向量与多查询向量的区别一个MultiVector的多个子向量是对同一条数据的多个表示如多个 embedding 模型的输出而search/vectorSearch传入多向量后结果中的query_index列用于区分结果来自哪个子向量。小结MultiVector虽只是一个IntoVector[]的类型别名但它承载了 LanceDB Node.js SDK 中完整的多向量搜索能力既可通过table.search(multiVector)自动识别也可通过table.vectorSearch(multiVector)显式调用底层由nearestTo与addQueryVector协同实现多查询向量的批量化检索并在结果中附加query_index列。理解这一类型是使用 LanceDB 处理多模态 Embedding、多向量索引与多查询向量场景的基础。进一步阅读IntoVector 类型别名、VectorQuery 接口、Query 类、Table 类。赞分享向量数据库数据库人工智能后端【免费下载链接】lancedbDeveloper-friendly OSS embedded retrieval library for multimodal AI. Search More; Manage Less.项目地址https://gitcode.com/gh_mirrors/la/lancedb点击查看免费下载相关推荐突破向量搜索瓶颈pgVector多向量类型实战指南突破向量搜索瓶颈pgVector多向量类型实战指南 你是否在处理海量向量数据时遇到存储成本高、查询速度慢的问题是否在高维向量与搜索性能之间难以抉择本文将系数据库向量数据库多表向量搜索新范式pgvector连接查询实战指南多表向量搜索新范式pgvector连接查询实战指南 你是否在处理多表数据时为如何高效结合结构化查询与向量相似度搜索而苦恼当用户画像分布在用户表、商品特征存数据库向量数据库LanceDB Node.js SDK 向量列类型配置指南深入理解 VectorColumnOptionsLanceDB Node.js SDK 向量列类型配置指南深入理解 VectorColumnOptions VectorColumnOptions 是 Lan向量数据库数据库人工智能后端创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。