当前位置: 首页 > news >正文

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

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

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

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

为什么用 Milvus

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

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

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

为什么要写 PHP 库

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

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

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

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

怎么用

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

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

http://www.xdnf.cn/news/1479799.html

相关文章:

  • 多维度数据统一线性处理的常见方案
  • 鸿蒙libxm2交叉编译
  • (2)桌面云、并行计算、分布式、网格计算
  • LeetCode5最长回文子串
  • 基于Spark的中文文本情感分析系统研究
  • 空间配置器
  • 【STM32HAL-----NRF24L01】
  • leetcode LCR 159 库存管理III
  • Qt网络通信服务端与客户端学习
  • 第5章递归:分治法
  • Qt文字滚动效果学习
  • MySQL 高可用方案之 MHA 架构搭建与实践
  • 常用配置文件
  • 去中心化投票系统开发教程 第三章:智能合约设计与开发
  • [网络入侵AI检测] docs | 任务二分类与多分类
  • 算法题-链表03
  • react native 出现 FATAL EXCEPTION: OkHttp Dispatcher
  • LeetCode 2841.几乎唯一子数组的最大和
  • AI智能体架构全流程全解析
  • [光学原理与应用-432]:非线性光学 - 既然光也是电磁波,为什么不能直接通过电生成特定频率的光波?
  • 打造一款高稳定、低延迟、跨平台RTSP播放器的技术实践
  • 基于FPGA的电梯控制系统设计(论文+源码)
  • 动态内存分配
  • DeepSeek辅助在64位Linux中编译运行32位的asm-xml-1.4程序
  • Day22_【机器学习—集成学习(1)—基本思想、分类】
  • leetcode 215 数组中的第K个最大元素
  • Jupyter Notebook与cpolar:构建跨地域数据科学协作平台
  • 正态分布 - 计算 Z-Score 的 无偏估计
  • 计算机主板上的那颗纽扣电池的作用是什么?
  • OSG中TerrainManipulator(地形适配操纵器)