用 PHP 玩向量数据库:一个从小说网站开始的小尝试

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

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

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

为什么用 Milvus

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

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

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

为什么要写 PHP 库

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

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

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

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

怎么用

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

php 复制代码
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

相关推荐
ServBay9 小时前
垃圾堆里编码?真的不要怪 PHP 不行
后端·php
用户9623779544812 小时前
CTF 伪协议
php
BingoGo3 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php
JaguarJack3 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php·服务端
BingoGo4 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php
JaguarJack4 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php·服务端
JaguarJack5 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
后端·php·服务端
BingoGo5 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
php
JaguarJack6 天前
告别 Laravel 缓慢的 Blade!Livewire Blaze 来了,为你的 Laravel 性能提速
后端·php·laravel
郑州光合科技余经理6 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php