
用 PHP 玩向量数据库:一个从小说网站开始的小尝试
有时候折腾东西的起因特别随意。比如我这次,就是从一个“带点颜色”的小说网站开始的。网站里全是几万字的短文,看着还不错,但限制也不少:每天只能看几篇,而且没有任何搜索功能。
于是我写了个爬虫,把所有小说都抓了下来。数据一下子堆到本地,看似自由了,但新的麻烦随之而来——几万篇文章放在那里,如果想找某个题材、某种情节,几乎不可能。用关键词搜索顶多能凑合,但语义差一点就找不到,体验并不好。
这时我想到了向量数据库。
为什么用 Milvus
我的服务器规格很小,只有 2 核 2G,根本跑不动本地的 Milvus,更别说大规模向量化了。好在 Milvus 有托管服务,而且带免费额度。这样我就能换个思路:
- Mac 本地:用开源模型先做文本向量化,把长篇小说切分成小段(比如 200 个汉字一块),再计算对应的向量。
- Milvus 云端:专门存储和管理这些向量,负责后续的相似度检索。
- 查询时:把搜索词同样向量化,发到 Milvus 去比对,得到语义上更接近的内容。
另外,向量化这一步我用的是 SiliconFlow 提供的模型,免费额度足够支撑实验,算是“白嫖”资源也能玩得转。
为什么要写 PHP 库
可能有人会问:Milvus 不是有 Python、Go SDK 吗?为什么非要用 PHP?
原因其实很简单:我的整个小说爬虫和阅读项目,本身就是用 PHP 写的。再硬插一门语言进去,工程会很乱。于是干脆自己写了一个 PHP 库,把常见的操作封装起来:
- 创建集合(类似于建表)
- 插入数据(上传向量和原文片段)
- 向量检索(传入一个向量,返回相似度最高的结果)
- 删除集合、清理数据
这样一来,整个流程都能在 PHP 项目里顺利跑通。
怎么用
举个简单的例子。假设我有一段文本 "这是一个测试文本"
,先在本地算好向量(这里假设是 [0.12, 0.85, ...]
),然后通过库上传:
1 | use Hejunjie\Milvus; |
这样就能查到与输入向量最接近的 10 段文本。通过查询到的 id 就可以在本地数据库中查询对应的小说。
对我来说,只要输入大概的剧情方向,Milvus就能把拥有相似片段的小说找出来,比传统关键字搜索好用太多。
支持的方法
这个小库目前支持 Milvus 的常见操作,大致分成几类:
- 集合(Collections) :创建、删除、重命名、加载/释放、获取状态、设置属性等。
- 分区(Partitions) :创建、删除、加载/释放、查看列表、检查是否存在。
- 索引(Indexes) :创建、删除、查看详情,或者列出所有索引。
- 别名(Aliases) :创建、修改、删除别名,也可以查看现有别名。
- 向量数据(Entities) :插入、更新(upsert)、删除、查询、向量搜索。
- 其它:比如自定义请求、获取集合的统计信息等等。
简单来说,该有的基本操作都覆盖了,足够支撑一个小型项目的使用。
我的收获
这个库严格来说不算“生产级”,但它让我有一些新的体会:
- 向量数据库没那么遥远。不一定要做推荐系统或大模型项目,哪怕只是个人的小需求,也能用上。
- PHP 也能玩。虽然传统上大家都觉得 PHP 跟 AI 没关系,但只要敢接 API,就能接上去。
- 动手才有意思。一开始只是因为“不爽”写了个爬虫,后来一步步衍生到向量搜索,最后顺手写了个小库。整个过程不算严肃,但很有乐趣。
所以说,整个过程严格意义上没什么“高大上”的地方,就是一个普通人遇到小问题,忍不住折腾了一下,最后顺手造了个小轮子。
现在呢,我终于可以随心所欲地在几万篇小说里搜索想要的片段了,再也不用翻到眼花还找不到 😂
项目地址 👉 zxc7563598/php-milvusr
- 感谢您的赞赏