ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

使用 LanceDB JavaScript SDK 构建向量检索应用:安装、连接、建表与向量搜索实战

2026/9/23 17:42:28 拓冰建站 浏览量
使用 LanceDB JavaScript SDK 构建向量检索应用:安装、连接、建表与向量搜索实战 向量数据库数据库人工智能后端【免费下载链接】lancedbDeveloper-friendly OSS embedded retrieval library for multimodal AI. Search More; Manage Less.项目地址https://gitcode.com/gh_mirrors/la/lancedb点击查看免费下载本篇文章以 LanceDB 官方 JavaScript SDKlancedb/lancedb为主线系统讲解如何在 Node.js 应用中完成安装、建立连接、创建/写入数据表、执行向量检索与全文搜索并结合仓库源码剖析connect、createTable、vectorSearch等核心 API 的底层实现与调用链。读完本文你将能够从零搭建一个可运行的嵌入式向量检索应用并具备深入阅读 SDK 源码、二次开发与调试的能力。LanceDB JavaScript SDK 概览LanceDB 是一个面向多模态 AI 场景的开发者友好型开源嵌入式向量数据库其核心价值在于少管理、多检索Search More; Manage Less无需独立部署数据库服务直接在应用进程内以库的形式运行。JavaScript SDK 则是 LanceDB 在 Node.js/TypeScript 生态中的官方接入层包名为lancedb/lancedb见 nodejs/package.json。从源码结构看该 SDK 采用Rust 核心 napi-rs 绑定的架构nodejs/src/Rust 绑定层源码负责与 LanceDB 核心库交互nodejs/lancedb/TypeScript 包源码面向开发者的公开 API 全部从这里导出nodejs/__test__/单元测试基于 Jestnodejs/examples/文档配套的可运行示例pnpm workspace。这一架构意味着所有重计算索引构建、向量距离计算、列式存储读写都发生在原生层而 JS 层负责提供类型安全的、Promise 化的开发体验。入口文件 nodejs/lancedb/index.ts 一次性导出了连接、表、查询、索引、嵌入函数、重排序rerankers、物化视图等全部公开类型与函数是理解整个 SDK 能力边界的起点。环境要求与安装安装命令npm install lancedb/lancedb安装时 npm 会自动下载与你当前平台匹配的原生库每个平台发布为独立的 npm 包见 nodejs/npm/ 下的darwin-arm64、linux-x64-gnu、win32-x64-msvc等目录。当前仓库支持的平台包括Linuxx86_64 与 aarch64同时支持 glibc 与 muslmacOSIntelx86_64与 Apple SiliconARM/M1/M2aarch64Windowsx86_64 与 aarch64。与 nodejs/package.json 中napi.targets声明的编译目标一一对应即aarch64-apple-darwin、x86_64-unknown-linux-gnu、aarch64-unknown-linux-gnu、x86_64-unknown-linux-musl、aarch64-unknown-linux-musl、x86_64-pc-windows-msvc、aarch64-pc-windows-msvc。运行环境约束根据 nodejs/package.json 中的声明使用时还需注意Node.js 版本engines.node 22Apache Arrow作为 peerDependency要求apache-arrow 15.0.0 且 18.1.0SDK 与 Arrow 数据格式深度耦合Arrow 数据、Schema、RecordBatch 都直接来自该库可选依赖openaiOpenAI 嵌入函数与huggingface/transformers本地 Transformers 嵌入函数按需安装即可包管理器在仓库内使用 pnpm 11packageManager: pnpm11.1.1发布版本为0.40.0-beta.5License 为 Apache-2.0。快速上手从连接到向量搜索nodejs/README.md 给出了一个最小可运行的完整示例这是理解 SDK 用法的最佳起点import * as lancedb from lancedb/lancedb; // 1. 连接创建或打开本地数据库目录 const db await lancedb.connect(data/sample-lancedb); // 2. 建表用普通 JS 对象数组初始化一张表自动推导 schema const table await db.createTable(my_table, [ { id: 1, vector: [0.1, 1.0], item: foo, price: 10.0 }, { id: 2, vector: [3.9, 0.5], item: bar, price: 20.0 }, ]); // 3. 向量搜索返回与查询向量最相似的 20 条记录 const results await table.vectorSearch([0.1, 0.3]).limit(20).toArray(); console.log(results);这个例子覆盖了 SDK 的三个核心动作connect(uri)—— 建立数据库连接。传入本地目录路径时即创建嵌入式数据库createTable(name, data)—— 以普通对象数组建表。SDK 会将数据转换为 Arrow IPC 格式交给原生层parseTableData与fromTableToBuffer见 nodejs/lancedb/connection.ts字段vector会被识别为向量列vectorSearch(vector)—— 发起近似最近邻ANN检索返回包含原始字段与距离的匹配行。源码视角vectorSearch 到底做了什么vectorSearch是Table上的便捷方法其实现位于 nodejs/lancedb/table.tsvectorSearch(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); }可以看到它内部委托给query().nearestTo(vector)构建一个VectorQuery查询构建器见 nodejs/lancedb/query.ts。VectorQuery支持链式调用.limit()、.select()、.offset()、.filter()、.distanceType()等最后通过.toArray()或.toArrow()、异步迭代RecordBatch触发执行。测试用例 nodejs/test/query.test.ts 验证了向量搜索返回的 schema 中除所选列外还会追加一个_distance字段Float32 类型用于表示每条结果与查询向量的距离同时验证了offset是在limit之后应用的可据此实现稳定的分页// 第二页先取前 4 条再跳过 2 条 const secondPage await table .vectorSearch([0, 0]) .select([id]) .limit(2) .offset(2) .toArray();连接管理URI 格式、选项与多种连接方式connect的完整签名与实现位于 nodejs/lancedb/index.ts。它支持两种调用形式// 形式一connect(uri, options?, session?, headerProvider?) const conn await lancedb.connect(/path/to/database); const conn2 await lancedb.connect(s3://bucket/path/to/database, { storageOptions: { timeout: 60s }, }); // 形式二connect(options { uri }) const conn3 await lancedb.connect({ uri: /path/to/database, session: Session.default(), });支持的 URI 格式/path/to/database—— 本地文件系统数据库s3://bucket/path或gs://bucket/path—— 云对象存储上的数据库通过storageOptions传入访问凭证、超时等配置db://host:port—— 远程数据库LanceDB Cloud此时可配合headerProvider做每请求鉴权例如StaticHeaderProvider注入X-API-Key。内部实现上connect会通过LanceDbConnection.new(uri, finalOptions, nativeProvider)创建原生连接再包装成LocalConnection返回见 nodejs/lancedb/connection.ts。storageOptions 的规范化传入的存储选项会经过cleanseStorageOptions处理nodejs/lancedb/connection.ts所有键会被统一转换为 snake_case后再传给原生层。因此你既可以用{ timeout: 60s }也可以用{ timeout: 60s }SDK 会保证兼容。connectNamespace目录 / REST 命名空间 / 自定义实现除按 URI scheme 路由的connect外SDK 还提供connectNamespace(implName, config, options?)nodejs/lancedb/index.ts用于通过命名空间实现连接dir—— 目录命名空间配置{ root: /path/to/db, manifestEnabled?, extraProperties? }所有表存放于单一根路径下rest—— REST 目录服务配置{ uri: https://catalog.example.com, headers?, extraProperties? }通过 HTTP 访问远端 catalog其他字符串 —— 自定义命名空间实现的完整模块路径配置为自由格式的properties字符串映射。连接生命周期Connection是一个长生命周期对象可能持有 HTTP 连接池等资源官方建议在多次使用中共享同一个连接。完成使用后可调用close()主动释放资源不关闭也会在垃圾回收时自动清理。连接关闭后再调用其方法会直接报错。此外已创建的表是独立对象即使底层连接被关闭表仍可继续工作见 nodejs/lancedb/connection.ts 中Connection类文档。建表与数据写入createTable 的多种重载与选项createTable支持多种重载形式名称数据、options 对象、命名空间路径公共选项见CreateTableOptionsnodejs/lancedb/connection.ts选项类型说明modecreate \| overwritecreate时若表已存在则报错除非existOk为 trueoverwrite直接替换已有表existOkboolean表已存在且 mode 为create时不报错内部转换为exist_okschemaSchemaLike显式指定 schema替代自动推导embeddingFunctionEmbeddingFunctionConfig配置自动嵌入函数写入时自动生成向量storageOptionsRecordstring, string对象存储配置继承连接配置但可覆盖dataStorageVersion/enableV2ManifestPaths已废弃分别迁移到newTableDataStorageVersion与newTableEnableV2ManifestPaths存储选项值得注意的实现细节在LocalConnection.createTable_createTableImpl中dataStorageVersion与enableV2ManifestPaths这两个已废弃字段会被自动改写进 storageOptions见 nodejs/lancedb/connection.ts保证向后兼容。创建空表与增量写入// 创建空表需要显式 schema await db.createEmptyTable(empty_table, schema); // 增量写入追加 or 覆盖 const result await table.add(newRows); // 默认 append const result2 await table.add(newRows, { mode: overwrite }); // 监听写入进度 await table.add(data, { progress: (p) { console.log(${p.outputRows}/${p.totalRows ?? ?} rows); }, });AddDataOptions的progress回调nodejs/lancedb/table.ts会按批次触发并在结束时以done: true回调一次回调异常只会console.warn记录而不会中断写入。add返回的AddResult包含新的表版本号。此外Table还提供update支持 SQL 条件where、values与valuesSql、delete、mergeInsertMergeInsertBuilder等数据变更能力均返回包含影响行数与版本号的 Result 对象。表管理打开、列举、删除与命名空间打开与分页列举// 打开表可选 branch分支与 version版本钉定 const table await db.openTable(my_table, { branch: feature-branch, version: 42, // 只读视图配合 checkoutLatest 恢复可写 }); // 分页列举表pageToken 为不透明令牌 const names: string[] []; let pageToken undefined; do { const page await conn.listTables({ pageToken, limit: 100 }); names.push(...page.tables); pageToken page.pageToken; } while (pageToken);openTable的实现nodejs/lancedb/connection.ts会先打开表再根据branch/version选项自动执行分支检出或版本钉定main被视为默认分支从而跳过额外操作。删除与清理dropTable(name)同步删除dropTableAsync(name)返回Job可等待物理文件清理完成表可能在清理完成前就已不可用dropAllTables()清空数据库。Job是 SDK 中异步后台任务的一等公民Connection还提供openJob(jobId)、listJobs()、cancelJob(jobId)来追踪服务端任务状态。命名空间Namespace命名空间用于对表进行层级组织相关 API 全部在Connection上createNamespace(path, { mode: create | exist_ok | overwrite, properties })listNamespaces(path?, { pageToken, limit })、describeNamespace(path)dropNamespace(path, { mode: skip | fail, behavior: restrict | cascade })——restrict拒绝删除非空命名空间cascade递归删除其中所有内容。克隆与重命名cloneTable(targetName, sourceUri, options)支持浅克隆默认isShallow: true新表与源表共享底层数据文件但拥有独立 manifest可各自演进。renameTable则目前仅 LanceDB Cloud 支持本地连接与命名空间连接会返回 not supported 错误见Connection类文档。检索向量搜索、全文搜索与查询构建器查询构建器通用能力QueryBasenodejs/lancedb/query.ts是所有查询Query/VectorQuery/TakeQuery的公共基类提供select(...)投影所需列显著降低列式存储的 I/O 延迟也支持动态列如new Map([[combined, a b]])SQL 表达式——这是官方建议的实践limit(n)/offset(n)分页注意 offset 在 limit 之后应用见测试用例orderBy(...)按列排序支持升降序与 null 优先级filter(expr)SQL 过滤表达式distanceType(type)向量距离度量默认l2nodejs/lancedb/indices.ts 中特别强调索引训练时使用的距离类型必须与检索时一致否则结果不准确终端操作.toArray()返回行对象数组查询对象本身也是AsyncIterableRecordBatch可用for await逐批消费并通过QueryExecutionOptionsmaxBatchLength、timeoutMs控制执行。向量检索与全文检索// 向量检索自动追加 _distance 列 await table.vectorSearch([0.1, 0.3]).limit(20).toArray(); // 全文检索先创建 FTS 索引 await table.createIndex(text, { config: Index.fts() }); await table.search(foo, fts).select([id]).limit(10).toArray();全文检索结果会附带_score字段由 nodejs/test/query.test.ts 的 schema 断言确认。FTS 索引支持 tokenizer 配置simple等基础分词器、语言、停用词、词干化、ngram 等Table还导出tokenize函数可在不建索引的情况下直接分词见 nodejs/lancedb/index.ts 的TokenizeOptions。search() 的自动路由Table.search(query, queryType auto)nodejs/lancedb/table.ts会根据参数自动路由传入向量 → 走vectorSearchqueryType: fts→ 走全文搜索queryType: auto且表配置了嵌入函数 → 由嵌入函数计算查询向量后执行向量检索computeQueryEmbeddings。对于多向量混合检索SDK 还提供了rerankers模块如RRFReranker见 nodejs/lancedb/rerankers/rrf.ts用于融合多路检索结果。索引让检索从暴力扫描走向 ANNTable.createIndex配合Index工厂nodejs/lancedb/indices.ts可创建多种索引Index.ivfPq(options)IVF 乘积量化最常用的 ANN 索引关键参数numPartitionsIVF 分区数默认取行数的平方根过大则选分区慢过小则分区内搜索慢numSubVectorsPQ 子向量数控制压缩率默认dim / 16不可整除时dim / 8以便利用 SIMD 指令numBits每个子向量的量化位数必须为 4 或 8默认 8distanceType距离度量默认l2必须与检索一致Index.hnswSq(options)/Index.hnswPq(options)基于 HNSW 的图索引Index.fts(options)全文索引支持 tokenizer 与语言配置Index.ivfFlat/Index.ivfRq其他向量索引变体。索引构建是异步任务可用Job追踪进度。数据集较大时合理选择numPartitions与量化位数是在召回率与延迟之间做权衡的关键索引配置的完整类型见 nodejs/lancedb/indices.ts 的IvfPqOptions等接口。自动嵌入Embedding 注册表与内置嵌入函数SDK 提供了一等公民的嵌入函数体系让写入时自动生成向量、检索时自动嵌入查询成为可能nodejs/lancedb/embedding/目录下内置了openai.tsOpenAI 嵌入模型与transformers.ts本地 HuggingFace Transformers 模型所有嵌入函数继承自抽象的EmbeddingFunctionnodejs/lancedb/embedding/embedding_function.ts实现computeQueryEmbeddings/ 文本编码等接口通过EmbeddingFunctionRegistry注册/查找函数注册信息含函数配置会序列化到表元数据中检索时可自动解析并路由。使用方式是在建表时声明embeddingFunctionimport * as lancedb from lancedb/lancedb; import { getRegistry } from lancedb/lancedb/embedding; // 或使用内置的 openai / transformers 嵌入函数 const db await lancedb.connect(data/sample-lancedb); const table await db.createTable(documents, [ { text: hello world, category: greeting }, ], { embeddingFunction: /* 注册表返回的嵌入函数配置 */, }); // 之后 table.search(任意文本) 会自动完成嵌入与检索从createEmptyTable的实现可以看到embeddingFunction会通过registry.getTableMetadata生成表元数据nodejs/lancedb/connection.ts而search(..., auto)则通过registry.parseFunctions从元数据还原嵌入函数并计算查询向量——正是这两段代码构成了自动嵌入的闭环。本地开发与测试如果你想在仓库内对 SDK 进行二次开发或运行测试nodejs/CONTRIBUTING.md 说明了完整流程。前置条件Node.js 22、pnpm 11或corepack enable、Rust 工具链rustup 安装 Cargo、以及 protocProtocol Buffers 编译器。pnpm install # 安装依赖 pnpm build # 构建原生绑定 编译 TypeScript pnpm lint # Biome 检查与格式化 pnpm test # 运行全部 Jest 测试 # 运行单个测试文件 pnpm test -- table.test.ts # 按名称过滤用例 pnpm test -- table.test.ts --testNamePatternmerge\ insert构建脚本见 nodejs/package.json 的scripts使用napi build产出平台原生.node文件并生成native.d.ts/native.jsTypeScript 层通过lancedb/native.js与原生模块桥接——这也是理解JS 方法 → 原生调用链路的关键入口。总结LanceDB JavaScript SDK 以嵌入式、零运维的方式把向量数据库能力带入了 Node.js 生态connect一行完成连接、createTable用普通对象数组建表、vectorSearch链式调用完成 ANN 检索全程无需管理任何服务进程。在此基础上本文进一步结合仓库源码剖析了connect的 URI 路由与 options 规范化、vectorSearch到nearestTo的委托链路、createTable的多种模式与选项、分页/命名空间/物化视图等表管理能力以及索引参数与自动嵌入函数的底层机制。若需查看更多完整示例可继续阅读 nodejs/README.md、docs/src/js/README.md 与 nodejs/examples/ 中的可运行代码或直接阅读 nodejs/test/ 下的测试用例验证各 API 的实际行为。赞分享向量数据库数据库人工智能后端【免费下载链接】lancedbDeveloper-friendly OSS embedded retrieval library for multimodal AI. Search More; Manage Less.项目地址https://gitcode.com/gh_mirrors/la/lancedb点击查看免费下载相关推荐LanceDB JavaScript SDK 完整使用指南安装、向量检索与表管理实战LanceDB JavaScript SDK 完整使用指南安装、向量检索与表管理实战 本篇技术指南以仓库文档 docs/src/js/README.md ht向量数据库数据库人工智能后端LLM Zoomcamp 向量搜索实战使用 minsearch 构建内存向量索引与语义检索LLM Zoomcamp 向量搜索实战使用 minsearch 构建内存向量索引与语义检索 在本篇技术指南中我们将围绕 LLM Zoomcamp2026示例工程教程人工智能大模型LanceDB Rust SDK 实战指南用 Rust 构建嵌入式向量检索与多模态 AI 应用LanceDB Rust SDK 实战指南用 Rust 构建嵌入式向量检索与多模态 AI 应用 LanceDB Rust SDKcrate 名为 lance向量数据库数据库人工智能后端创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考