feat: 集成 SeekDB AI 搜索引擎实现文件内容搜索

This commit is contained in:
kuaifan
2025-12-30 05:49:26 +00:00
parent a8d4f261a4
commit 23faf28f7f
15 changed files with 2249 additions and 10 deletions

View File

@@ -12,6 +12,7 @@ use App\Models\FileLink;
use App\Models\FileUser;
use App\Models\User;
use App\Models\UserRecentItem;
use App\Module\Apps;
use App\Module\Base;
use App\Module\Down;
use App\Module\Timer;
@@ -122,9 +123,11 @@ class FileController extends AbstractController
* @apiGroup file
* @apiName search
*
* @apiParam {String} [link] 通过分享地址搜索(如:https://t.hitosea.com/single/file/ODcwOCwzOSxpa0JBS2lmVQ==)
* @apiParam {String} [key] 关键词
* @apiParam {Number} [take] 获取数量(默认:50,最大:100)
* @apiParam {String} [link] 通过分享地址搜索(如:https://t.hitosea.com/single/file/ODcwOCwzOSxpa0JBS2lmVQ==)
* @apiParam {String} [key] 关键词
* @apiParam {Number} [take] 获取数量(默认:50,最大:100)
* @apiParam {String} [search_content] 是否搜索文件内容(yes/no,默认:no)
* @apiParam {String} [search_type] 搜索类型(text/vector/hybrid,默认:hybrid,仅 search_content=yes 时有效)
*
* @apiSuccess {Number} ret 返回状态码(1正确、0错误)
* @apiSuccess {String} msg 返回信息(错误描述)
@@ -136,6 +139,8 @@ class FileController extends AbstractController
//
$link = trim(Request::input('link'));
$key = trim(Request::input('key'));
$searchContent = Request::input('search_content', 'no') === 'yes';
$searchType = Request::input('search_type', 'hybrid');
$id = 0;
$take = Base::getPaginate(100, 50, 'take');
if (preg_match("/\/single\/file\/(.*?)$/i", $link, $match)) {
@@ -145,6 +150,35 @@ class FileController extends AbstractController
return Base::retSuccess('success', []);
}
}
// 如果需要搜索文件内容且有关键词
if ($searchContent && $key && !$id && Apps::isInstalled('seekdb')) {
$results = \App\Module\SeekDB\SeekDBFile::search(
$user->userid,
$key,
$searchType,
0,
$take
);
// 获取完整的文件信息
if (!empty($results)) {
$fileIds = array_column($results, 'file_id');
$files = File::whereIn('id', $fileIds)->get()->keyBy('id');
$array = [];
foreach ($results as $result) {
$file = $files->get($result['file_id']);
if ($file) {
$temp = $file->toArray();
$temp['content_preview'] = $result['content_preview'] ?? null;
$temp['relevance'] = $result['relevance'] ?? 0;
$array[] = $temp;
}
}
return Base::retSuccess('success', $array);
}
return Base::retSuccess('success', []);
}
// 搜索自己的
$builder = File::whereUserid($user->userid);
if ($id) {