找回密码
 立即注册
首页 业界区 科技 基于seekdb,教你从零开始构建智能搜书应用 ...

基于seekdb,教你从零开始构建智能搜书应用

萧海芷 昨天 18:25

seekdb 是什么样的数据库?

最近体验了一下 seekdb,先说几点感受。

第一,是单节点轻量化设计,在我的 macbook 上通过 docker 桌面端部署可以轻松跑起来,在 Linux 环境下直接用 pip 安装,据说不久就会支持 macOS/windows 系统,连 docker 都省了,直接通过命令安装。

第二,它是一体化设计,原生融合关系型、向量、全文、JSON、GIS 五种类型的数据,所有索引在同一事务内原子更新,这意味着 Zero Data Lag 和严格的 ACID,彻底规避传统 CDC 同步导致的延迟与不一致问题。

第三,它是一个 AI-Native 数据库,体现在它内置有 embedding 模型和 AI Function,单条 SQL 实现向量 + 全文 + 标量过滤的联合查询,不需要再写大量的复杂的胶水层逻辑拼合各种技术栈,直接驱动 RAG 流程(如图)。

第四,它的 API 是 Schema-free 的设计,也就是直接写入,不要求预先定义严格的表结构。

第五,它完全兼容 MySQL,意味着传统数据库可以轻松进行 AI 化升级。

第六点同样很重要,它是在 Apache 2.0 协议许可下开源,同时它有 OceaBase 的基因。长期发展有保障,只会越来越成熟。

1.png

教程:基于seekdbb实现智能搜书应用

本教程将带你从零开始,基于 seekdb 实现一个「智能搜书」的程序,演示如何实现语义搜索和混合搜索等 seekdb 的主要能力。

教程具体做的事情包括:

  1. 数据导入
  • 从 csv 文件导入 seekdb
  • 支持数据分批导入
  • 自动将书籍的文本信息转换为 384 维向量嵌入
  1. 用到三种搜索能力
  • 语义搜索:基于向量相似度,用自然语言查询找到语义相关的书籍。
  • 元数据过滤:按评分、类型、年份、价格等字段精确过滤。
  • 混合搜索:结合语义搜索 + 元数据过滤,使用 RRF 算法融合排序。
  1. 索引优化
  • 创建 HNSW 向量索引提升语义搜索性能。
  • 元数据生成列索引(从 JSON 提取字段创建索引)
  1. 技术栈
  • 数据库: seekdb,pyseekdb(seekdb 的 Python SDK),pymysql
  • 数据处理工具:pandas

三、准备工作

1. 安装 OrbStack

OrbStack 是一个轻量级的 Docker 替代品,专为 Mac 优化,启动速度快且资源占用低。用它本地部署 seekdb。

第一步,使用 Homebrew 安装(推荐):

  1. brew install orbstack
复制代码

或从官网下载:访问 https://orbstack.dev 下载安装包。

第二步,启动 OrbStack:

  1. # 启动 OrbStack
  2. open -a OrbStack
  3. # 验证安装
  4. orb version
复制代码

2. 部署 seekdb 镜像

如果卡住,先去 orbstack 配置 docker 国内镜像源(链接)。

  1. # 拉取 SeekDB 镜像
  2. docker pull oceanbase/seekdb:latest
  3. # 启动 SeekDB 容器
  4. docker run -d \
  5. --name seekdb \
  6. -p 2881:2881 \
  7. -e MODE=slim \
  8. oceanbase/seekdb:latest
  9. # 查看容器状态
  10. docker ps | grep seekdb
  11. # 查看日志(确保服务启动成功)
  12. docker logs seekdb
复制代码

等待约 30 秒让 seekdb 完全启动。你可以通过 docker logs -f seekdb 查看启动日志,看到 "boot success" 表示启动完成。

3. 下载数据集

下载数据集:https://www.kaggle.com/datasets/sootersaalu/amazon-top-50-bestselling-books-2009-2019

将数据集命名为: bestsellers_with_categories.csv,有 550 条 amazon 历史畅销书的记录,内容如图:

2.png

4. 下载教程代码

  1. git clone https://github.com/kejun/demo-seekdb-hybridsearch.git
复制代码

项目结构:

  1. demo-seekdb-books-hybrid-search/
  2. ├── database/
  3. │ ├── db_client.py # 数据库客户端封装
  4. │ └── index_manager.py # 索引管理器
  5. ├── data/
  6. │ └── processor.py # 数据处理器
  7. ├── models/
  8. │ └── book_metadata.py # 书籍元数据模型
  9. ├── utils/
  10. │ └── text_utils.py # 文本处理工具
  11. ├── import_data.py # 数据导入脚本
  12. ├── hybrid_search.py # 混合搜索演示
  13. └── bestsellers_with_categories.csv # 数据文件
复制代码

创建 Python 虚拟环境:

  1. # 创建虚拟环境
  2. python3 -m venv venv
  3. # 激活虚拟环境
  4. source venv/bin/activate # macOS/Linux
  5. # 或
  6. .\venv\Scripts\activate # Windows
复制代码

安装依赖:

  1. pip install -r requirements.txt
复制代码

执行效果

执行python import_data.py导入数据。可以看到整个过程:加载数据文件 → 连接数据库 → 创建数据库 → 创建集合 → 分批导入数据 → 创建元数据索引(注:seekdb 目前只支持对 embedding 列创建 HNSW 索引,对 document 列创建全文索引,对元数据字段创建暂不支持,据介绍在计划中)。

3.png

seekdb 采用的是 schema-free 的接口设计,比如在data/processor.py中,调用collection.add()时直接传入任意字典:

  1. collection.add(
  2. ids=valid_ids,
  3. documents=valid_documents,
  4. metadatas=valid_metadatas # 直接传入字典列表,无需预定义 schema
  5. )
复制代码

完整结果(有所精简)如下:

  1. 正在加载数据文件: bestsellers_with_categories.csv
  2. 数据加载完成!
  3. - 总行数: 550
  4. - 总列数: 7
  5. - 列名: Name, Author, User Rating, Reviews, Price, Year, Genre
  6. - 加载耗时: 0.01 秒
  7. 正在连接数据库...
  8. 主机: 127.0.0.1:2881
  9. 数据库: demo_books
  10. 集合: book_info
  11. 数据库已就绪
  12. 数据库连接成功
  13. 正在创建/重建集合...
  14. 集合名称: book_info
  15. 向量维度: 384
  16. 距离度量: cosine
  17. 集合创建成功
  18. 正在处理数据...
  19. 数据预处理完成!
  20. - 总记录数: 550
  21. - 验证错误数: 0
  22. - 处理耗时: 0.05 秒
  23. 正在导入数据到集合...
  24. - 批次大小: 100
  25. - 总批次数: 6
  26. - 开始导入...
  27. 导入进度: 100%|█████████████████████████████████████| 6/6 [00:53<00:00, 8.97s/批次]
  28. 数据导入完成!
  29. - 导入耗时: 53.83 秒
  30. - 平均速度: 10 条/秒
  31. 正在创建元数据索引...
  32. - 索引字段: genre, year, user_rating, author, reviews, price
  33. 索引创建完成!
  34. - 创建耗时: 3.81 秒
  35. 数据导入流程完成!
  36. 总耗时: 59.64 秒
  37. 导入记录数: 550
  38. 数据库: demo_books
  39. 集合: book_info
复制代码

导完数据,可以直接用 mysql client 或安装 obclient(链接) 在终端上查询数据库。

  1. # 进入 SeekDB 容器
  2. docker exec -it seekdb bash
  3. # 使用 MySQL 客户端连接(SeekDB 兼容 MySQL 协议)
  4. mysql -h127.0.0.1 -P2881 -uroot
复制代码

book_info是 seekdb 的 collection,对应底层的表名是c$v1$book_info

  1. -- 查看所有数据库
  2. SHOW DATABASES;
  3. -- 切换到 demo 数据库
  4. USE demo;
  5. -- 查看所有表(集合)
  6. SHOW TABLES;
  7. -- 查看集合结构
  8. DESC c$v1$articles;
  9. -- 查询集合数据
  10. SELECT * FROM c$v1$articles LIMIT 10;
  11. -- 统计记录数
  12. SELECT COUNT(*) FROM c$v1$articles;
  13. -- 退出
  14. EXIT;
复制代码

看一下表结构DESC c$v1$book_info

4.png

看一下创建的索引:

(注意:pyseekdb 目前不直接支持对元数据列创建索引,所以项目通过 pymysql + SQL DDL 来实现元数据索引功能。据说在下个 pyseekdb 版本中将会支持自动对元数据字段进行索引)

5.png

接一下,执行搜索python hybrid_search.py。 seekdb 内置的 embedding 模型是sentence-transformers/all-MiniLM-L6-v2,向量维度最大 384,要想获得更好的效果还是要配置外部的模型服务。

混合搜索是 seekdb 的 killer feature。它同时执行全文检索和向量检索,然后使用 RRF (倒数排名融合) 算法合并。

6.png

看具体代码示例,query_params定义的是全文搜索“励志”(“inspirational”),同时用元数据中的用户评分(user_rating)过滤(评分大于等于 4.5)。knn_params是语义搜索,query_texts是句鸡汤“励志人生忠告”("inspirational life advice"),用同样的用户评分做过滤。

代码片断:

  1. query_params = {
  2. "where_document": {"$contains": "inspirational"},
  3. "where": {"user_rating": {"$gte": 4.5}},
  4. "n_results": 5
  5. }
  6. knn_params = {
  7. "query_texts": ["inspirational life advice"],
  8. "where": {"user_rating": {"$gte": 4.5}},
  9. "n_results": 5
  10. }
  11. results = collection.hybrid_search(
  12. query=query_params,
  13. knn=knn_params,
  14. rank={"rrf": {}},
  15. n_results=5,
  16. include=["metadatas", "documents", "distances"]
  17. )
复制代码

可以 vibe-eval 一下结果,感觉是挺准的。完整执行结果(有所精简)如下:

  1. === 语义搜索 ===
  2. Query: ['self improvement motivation success']
  3. 语义搜索 - 找到 5 条结果:
  4. [1] The 7 Habits of Highly Effective People: Powerful Lessons in Personal Change
  5. 作者: Stephen R. Covey
  6. 评分: 4.6
  7. 评论数: 9325
  8. 价格: $24.0
  9. 年份: 2011
  10. 类型: Non Fiction
  11. 相似度距离: 0.5358
  12. 相似度: 0.4642
  13. (省略其它......)
  14. === 混合搜索 (评分≥4.5) ===
  15. Query: {'where_document': {'$contains': 'inspirational'}, 'where': {'user_rating': {'$gte': 4.5}}, 'n_results': 5}
  16. KNN Query Texts: ['inspirational life advice']
  17. 混合搜索 (评分≥4.5) - 找到 5 条结果:
  18. [1] Mindset: The New Psychology of Success
  19. 作者: Carol S. Dweck
  20. 评分: 4.6
  21. 评论数: 5542
  22. 价格: $10.0
  23. 年份: 2014
  24. 类型: Non Fiction
  25. 相似度距离: 0.0159
  26. 相似度: 0.9841
  27. (省略其它......)
  28. === 混合搜索 (Non Fiction) ===
  29. Query: {'where_document': {'$contains': 'business'}, 'where': {'genre': 'Non Fiction'}, 'n_results': 5}
  30. KNN Query Texts: ['business entrepreneurship leadership']
  31. 混合搜索 (Non Fiction) - 找到 5 条结果:
  32. [1] The Five Dysfunctions of a Team: A Leadership Fable
  33. 作者: Patrick Lencioni
  34. 评分: 4.6
  35. 评论数: 3207
  36. 价格: $6.0
  37. 年份: 2009
  38. 类型: Non Fiction
  39. 相似度距离: 0.0164
  40. 相似度: 0.9836
  41. (省略其它......)
  42. === 混合搜索 (Fiction, 2015年后, 评分≥4.0) ===
  43. Query: {'where_document': {'$contains': 'fiction'}, 'where': {'$and': [{'year': {'$gte': 2015}}, {'user_rating': {'$gte': 4.0}}, {'genre': 'Fiction'}]}, 'n_results': 5}
  44. KNN Query Texts: ['fiction story novel']
  45. 混合搜索 (Fiction, 2015年后, 评分≥4.0) - 找到 5 条结果:
  46. [1] A Gentleman in Moscow: A Novel
  47. 作者: Amor Towles
  48. 评分: 4.7
  49. 评论数: 19699
  50. 价格: $15.0
  51. 年份: 2017
  52. 类型: Fiction
  53. 相似度距离: 0.0154
  54. 相似度: 0.9846
  55. (省略其它......)
  56. === 混合搜索 (评论数≥10000) ===
  57. Query: {'where_document': {'$contains': 'popular'}, 'where': {'reviews': {'$gte': 10000}}, 'n_results': 10}
  58. KNN Query Texts: ['popular bestseller']
  59. 混合搜索 (评论数≥10000) - 找到 10 条结果:
  60. [1] Twilight (The Twilight Saga, Book 1)
  61. 作者: Stephenie Meyer
  62. 评分: 4.7
  63. 评论数: 11676
  64. 价格: $9.0
  65. 年份: 2009
  66. 类型: Fiction
  67. 相似度距离: 0.0143
  68. 相似度: 0.9857
  69. [2] 1984 (Signet Classics)
  70. 作者: George Orwell
  71. 评分: 4.7
  72. 评论数: 21424
  73. 价格: $6.0
  74. 年份: 2017
  75. 类型: Fiction
  76. 相似度距离: 0.0145
  77. 相似度: 0.9855
  78. [3] Last Week Tonight with John Oliver Presents A Day in the Life of Marlon Bundo (Better Bundo Book, LGBT Childrens Book)
  79. 作者: Jill Twiss
  80. 评分: 4.9
  81. 评论数: 11881
  82. 价格: $13.0
  83. 年份: 2018
  84. 类型: Fiction
  85. 相似度距离: 0.0147
  86. 相似度: 0.9853
  87. (省略其它......)
复制代码

Vibe Coding 友好

如果你用 Cursor 或 Claude Code 开发一定装了 context7-mcp,它会查询最新的 API 文档、代码示例等,是#Vibecoding 的最佳伴侣。我看到 seekdb 也被添加到 Context7 中:

  • seekdb:https://context7.com/oceanbase/seekdb
  • pyseekdb: https://context7.com/oceanbase/pyseekdb 如果还没装墙裂推荐安装:
  1. {
  2. "mcpServers": {
  3. "context7": {
  4. "command": "npx",
  5. "args": [
  6. "-y",
  7. "@upstash/context7-mcp",
  8. "--api-key",
  9. "<你在context7上创建的apiKey>"
  10. ]
  11. },
  12. (...)
  13. }
  14. }
复制代码

装完之后,你就可以边学边用了。

希望这篇教程有助于你更顺利的上手#seekdb。Enjoy!


来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册