mirror of
https://github.com/kuaifan/dootask.git
synced 2025-12-12 19:35:50 +00:00
perf: 优化全文搜索
This commit is contained in:
parent
e9e9bab479
commit
7a7cd72db9
90
app/Console/Commands/SyncUserMsgToSearch.php
Normal file
90
app/Console/Commands/SyncUserMsgToSearch.php
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Console\Commands;
|
||||||
|
|
||||||
|
use App\Models\WebSocketDialogMsg;
|
||||||
|
use App\Module\ZincSearch\ZincSearchKeyValue;
|
||||||
|
use App\Module\ZincSearch\ZincSearchUserMsg;
|
||||||
|
use Illuminate\Console\Command;
|
||||||
|
|
||||||
|
class SyncUserMsgToSearch extends Command
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* 更新数据
|
||||||
|
* --f: 全量更新 (默认)
|
||||||
|
* --i: 增量更新(从上次更新的最后一个ID接上)
|
||||||
|
*
|
||||||
|
* 清理数据
|
||||||
|
* --c: 清除索引
|
||||||
|
*/
|
||||||
|
|
||||||
|
protected $signature = 'search:sync-user-msg {--f} {--i} {--c} {--batch=1000}';
|
||||||
|
protected $description = '同步聊天会话用户和消息到 ZincSearch';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
public function handle(): int
|
||||||
|
{
|
||||||
|
// 清除索引
|
||||||
|
if ($this->option('c')) {
|
||||||
|
$this->info('清除索引...');
|
||||||
|
ZincSearchKeyValue::clear();
|
||||||
|
ZincSearchUserMsg::clear();
|
||||||
|
$this->info("索引删除成功");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->info('开始同步聊天数据...');
|
||||||
|
|
||||||
|
// 同步消息数据
|
||||||
|
$this->syncDialogMsgs();
|
||||||
|
|
||||||
|
// 完成
|
||||||
|
$this->info("\n同步完成");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 同步消息数据
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
private function syncDialogMsgs(): void
|
||||||
|
{
|
||||||
|
$this->info("\n同步消息数据...");
|
||||||
|
|
||||||
|
// 获取上次同步的最后ID
|
||||||
|
$lastKey = "sync:userMsgLastId";
|
||||||
|
$lastId = $this->option('i') ? intval(ZincSearchKeyValue::get($lastKey, 0)) : 0;
|
||||||
|
|
||||||
|
$num = 0;
|
||||||
|
$count = WebSocketDialogMsg::where('id', '>', $lastId)->count();
|
||||||
|
$batchSize = $this->option('batch');
|
||||||
|
|
||||||
|
do {
|
||||||
|
// 获取一批消息
|
||||||
|
$dialogMsgs = WebSocketDialogMsg::where('id', '>', $lastId)
|
||||||
|
->orderBy('id')
|
||||||
|
->limit($batchSize)
|
||||||
|
->get();
|
||||||
|
|
||||||
|
if ($dialogMsgs->isEmpty()) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
$num += count($dialogMsgs);
|
||||||
|
$progress = round($num / $count * 100, 2);
|
||||||
|
$this->info("{$num}/{$count} ({$progress}%) 正在同步消息ID {$lastId} ~ {$dialogMsgs->last()->id}");
|
||||||
|
|
||||||
|
// 批量索引数据
|
||||||
|
ZincSearchUserMsg::batchSyncMsgs($dialogMsgs);
|
||||||
|
|
||||||
|
// 更新最后ID
|
||||||
|
$lastId = $dialogMsgs->last()->id;
|
||||||
|
ZincSearchKeyValue::set($lastKey, $lastId);
|
||||||
|
} while (count($dialogMsgs) == $batchSize);
|
||||||
|
|
||||||
|
$this->info("同步消息结束 - 最后ID {$lastId}");
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -2,28 +2,26 @@
|
|||||||
|
|
||||||
namespace App\Module\ZincSearch;
|
namespace App\Module\ZincSearch;
|
||||||
|
|
||||||
use App\Module\Base;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ZincSearch 键值存储类
|
* ZincSearch 键值存储类
|
||||||
*
|
*
|
||||||
* 使用方法:
|
* 使用方法:
|
||||||
*
|
*
|
||||||
* 1. 基础方法
|
* 1. 基础方法
|
||||||
* - 确保索引存在: ZincSearchKeyValue::ensureIndex();
|
* - 确保索引存在: ensureIndex();
|
||||||
* - 清空所有数据: ZincSearchKeyValue::clear();
|
* - 清空所有数据: clear();
|
||||||
*
|
*
|
||||||
* 2. 基本操作
|
* 2. 基本操作
|
||||||
* - 设置键值: ZincSearchKeyValue::set('site_name', '我的网站');
|
* - 设置键值: set('site_name', '我的网站');
|
||||||
* - 设置复杂数据: ZincSearchKeyValue::set('site_config', ['logo' => 'logo.png', 'theme' => 'dark']);
|
* - 设置复杂数据: set('site_config', ['logo' => 'logo.png', 'theme' => 'dark']);
|
||||||
* - 合并现有数据: ZincSearchKeyValue::set('site_config', ['footer' => '版权所有'], true);
|
* - 合并现有数据: set('site_config', ['footer' => '版权所有'], true);
|
||||||
* - 获取键值: $siteName = ZincSearchKeyValue::get('site_name');
|
* - 获取键值: $siteName = get('site_name');
|
||||||
* - 获取键值带默认值: $theme = ZincSearchKeyValue::get('theme', 'light');
|
* - 获取键值带默认值: $theme = get('theme', 'light');
|
||||||
* - 删除键值: ZincSearchKeyValue::delete('temporary_data');
|
* - 删除键值: delete('temporary_data');
|
||||||
*
|
*
|
||||||
* 3. 批量操作
|
* 3. 批量操作
|
||||||
* - 批量设置: ZincSearchKeyValue::batchSet(['user_count' => 100, 'active_users' => 50]);
|
* - 批量设置: batchSet(['user_count' => 100, 'active_users' => 50]);
|
||||||
* - 批量获取: $stats = ZincSearchKeyValue::batchGet(['user_count', 'active_users']);
|
* - 批量获取: $stats = batchGet(['user_count', 'active_users']);
|
||||||
*/
|
*/
|
||||||
class ZincSearchKeyValue
|
class ZincSearchKeyValue
|
||||||
{
|
{
|
||||||
|
|||||||
@ -12,21 +12,21 @@ use Illuminate\Support\Facades\Log;
|
|||||||
* 使用方法:
|
* 使用方法:
|
||||||
*
|
*
|
||||||
* 1. 基础方法
|
* 1. 基础方法
|
||||||
* - 确保索引存在: ZincSearchKeyValue::ensureIndex();
|
* - 确保索引存在: ensureIndex();
|
||||||
* - 清空所有数据: ZincSearchKeyValue::clear();
|
* - 清空所有数据: clear();
|
||||||
*
|
*
|
||||||
* 2. 搜索方法
|
* 2. 搜索方法
|
||||||
* - 关键词搜索: ZincSearchUserMsg::searchByKeyword('用户ID', '关键词');
|
* - 关键词搜索: searchByKeyword('用户ID', '关键词');
|
||||||
*
|
*
|
||||||
* 3. 基本方法
|
* 3. 基本方法
|
||||||
* - 单个同步: ZincSearchUserMsg::syncMsg($dialogMsg);
|
* - 单个同步: syncMsg($dialogMsg);
|
||||||
* - 批量同步: ZincSearchUserMsg::batchSyncMsgs($dialogMsgs);
|
* - 批量同步: batchSyncMsgs($dialogMsgs);
|
||||||
* - 删除消息: ZincSearchUserMsg::deleteMsg($dialogMsg);
|
* - 删除消息: deleteMsg($dialogMsg);
|
||||||
*
|
*
|
||||||
* 4. 用户方法
|
* 4. 用户方法
|
||||||
* - 单个同步: ZincSearchUserMsg::syncUser($dialogUser);
|
* - 单个同步: syncUser($dialogUser);
|
||||||
* - 批量同步: ZincSearchUserMsg::batchSyncUsers($dialogUsers);
|
* - 批量同步: batchSyncUsers($dialogUsers);
|
||||||
* - 删除消息: ZincSearchUserMsg::deleteUser($dialogUser);
|
* - 删除消息: deleteUser($dialogUser);
|
||||||
*/
|
*/
|
||||||
class ZincSearchUserMsg
|
class ZincSearchUserMsg
|
||||||
{
|
{
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user