全文搜索

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
  • 全文搜索可与向量搜索组合使用,参见 混合搜索