有时候折腾东西的起因特别随意。比如我这次,就是从一个“带点颜色”的小说网站开始的。网站里全是几万字的短文,看着还不错,但限制也不少:每天只能看几篇,而且没有任何搜索功能。

于是我写了个爬虫,把所有小说都抓了下来。数据一下子堆到本地,看似自由了,但新的麻烦随之而来——几万篇文章放在那里,如果想找某个题材、某种情节,几乎不可能。用关键词搜索顶多能凑合,但语义差一点就找不到,体验并不好。

这时我想到了向量数据库。

为什么用 Milvus

我的服务器规格很小,只有 2 核 2G,根本跑不动本地的 Milvus,更别说大规模向量化了。好在 Milvus 有托管服务,而且带免费额度。这样我就能换个思路:

  • Mac 本地:用开源模型先做文本向量化,把长篇小说切分成小段(比如 200 个汉字一块),再计算对应的向量。
  • Milvus 云端:专门存储和管理这些向量,负责后续的相似度检索。
  • 查询时:把搜索词同样向量化,发到 Milvus 去比对,得到语义上更接近的内容。

另外,向量化这一步我用的是 SiliconFlow 提供的模型,免费额度足够支撑实验,算是“白嫖”资源也能玩得转。

为什么要写 PHP 库

可能有人会问:Milvus 不是有 Python、Go SDK 吗?为什么非要用 PHP?

原因其实很简单:我的整个小说爬虫和阅读项目,本身就是用 PHP 写的。再硬插一门语言进去,工程会很乱。于是干脆自己写了一个 PHP 库,把常见的操作封装起来:

  • 创建集合(类似于建表)
  • 插入数据(上传向量和原文片段)
  • 向量检索(传入一个向量,返回相似度最高的结果)
  • 删除集合、清理数据

这样一来,整个流程都能在 PHP 项目里顺利跑通。

怎么用

举个简单的例子。假设我有一段文本 "这是一个测试文本",先在本地算好向量(这里假设是 [0.12, 0.85, ...]),然后通过库上传:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
use Hejunjie\Milvus;

$baseUrl = "http://your-milvus-host"
$apiKey = "your-apikey"

$client = new Milvus\Client($baseUrl, $apiKey);

// 插入数据
$client->entities()->insert("novels", [
'article_id' => 14271
'title' => '测试小说',
'content' => '这是一个测试文本',
'vector' => [0.12, 0.85, ...]
]);

// 搜索
$results = $client->entities()->search("novels", [
[0.11, 0.80, ...], // 搜索内容,通过 SiliconFlow 转换为向量
[0.11, 0.80, ...], // 支持多个数据查询
[0.11, 0.80, ...]
], 10);
print_r($results);

这样就能查到与输入向量最接近的 10 段文本。通过查询到的 id 就可以在本地数据库中查询对应的小说。
对我来说,只要输入大概的剧情方向,Milvus就能把拥有相似片段的小说找出来,比传统关键字搜索好用太多。

支持的方法

这个小库目前支持 Milvus 的常见操作,大致分成几类:

  • 集合(Collections) :创建、删除、重命名、加载/释放、获取状态、设置属性等。
  • 分区(Partitions) :创建、删除、加载/释放、查看列表、检查是否存在。
  • 索引(Indexes) :创建、删除、查看详情,或者列出所有索引。
  • 别名(Aliases) :创建、修改、删除别名,也可以查看现有别名。
  • 向量数据(Entities) :插入、更新(upsert)、删除、查询、向量搜索。
  • 其它:比如自定义请求、获取集合的统计信息等等。

简单来说,该有的基本操作都覆盖了,足够支撑一个小型项目的使用。

我的收获

这个库严格来说不算“生产级”,但它让我有一些新的体会:

  • 向量数据库没那么遥远。不一定要做推荐系统或大模型项目,哪怕只是个人的小需求,也能用上。
  • PHP 也能玩。虽然传统上大家都觉得 PHP 跟 AI 没关系,但只要敢接 API,就能接上去。
  • 动手才有意思。一开始只是因为“不爽”写了个爬虫,后来一步步衍生到向量搜索,最后顺手写了个小库。整个过程不算严肃,但很有乐趣。

所以说,整个过程严格意义上没什么“高大上”的地方,就是一个普通人遇到小问题,忍不住折腾了一下,最后顺手造了个小轮子。

现在呢,我终于可以随心所欲地在几万篇小说里搜索想要的片段了,再也不用翻到眼花还找不到 😂

项目地址 👉 zxc7563598/php-milvusr