全文搜索
LanBuffer 的 Table API 基于 Lance 格式支持全文搜索(Full-Text Search, FTS),可对文本列创建倒排索引并执行关键词检索。
创建全文索引
在执行全文搜索前,需要先对目标文本列创建 FTS 索引:
import * as lancedb from "@lancedb/lancedb";
const db = await lancedb.connect("lanbuff://127.0.0.1:7001");
// 创建包含文本数据的表
const tbl = await db.createTable("articles", [
{ vector: [0.1, 0.2], title: "Rust 异步编程指南", content: "Tokio 是 Rust 生态中最流行的异步运行时" },
{ vector: [0.3, 0.4], title: "向量数据库入门", content: "向量数据库用于存储和检索高维向量数据" },
{ vector: [0.5, 0.6], title: "对象存储最佳实践", content: "S3 兼容的对象存储是云原生应用的基础设施" },
{ vector: [0.7, 0.8], title: "LanBuffer 架构解析", content: "LanBuffer 基于 SlateDB 和对象存储构建高性能检索引擎" },
]);
// 对 content 列创建全文索引
await tbl.createIndex("content", {
config: lancedb.Index.fts(),
});
HTTP 请求:
curl -X POST http://127.0.0.1:7001/v1/table/articles/create_index/ \
-H "Content-Type: application/json" \
-d '{
"column": "content",
"index_type": "FTS"
}'
执行全文搜索
全文搜索通过查询端点实现,使用 full_text_query 参数:
// 搜索包含"对象存储"的文档
const results = await tbl
.search("对象存储", { queryType: "fts" })
.limit(10)
.toArray();
console.log(results);
带过滤的全文搜索
结合 SQL 过滤表达式缩小搜索范围:
const results = await tbl
.search("Rust", { queryType: "fts" })
.where("title LIKE '%指南%'")
.limit(10)
.toArray();
选择返回列
只返回需要的列以减少数据传输:
const results = await tbl
.search("向量数据库", { queryType: "fts" })
.select(["title", "content"])
.limit(5)
.toArray();
注意事项
- 全文索引需要在查询前创建,否则搜索将回退到暴力扫描。
- 新插入的数据在索引重建前可能不会被全文搜索命中(未索引行)。可通过
index/stats端点查看num_unindexed_rows。 - 全文搜索可与向量搜索组合使用,参见 混合搜索。