|
| 1 | + |
| 2 | + |
| 3 | +<h1 align="center">Telegram Search</h1> |
| 4 | + |
| 5 | +<p align="center"> |
| 6 | + [<a href="https://discord.gg/NzYsmJSgCT">Discordサーバーに参加</a>] [<a href="../README.md">English</a>] [<a href="./README_CN.md">简体中文</a>] |
| 7 | +</p> |
| 8 | + |
| 9 | +<p align="center"> |
| 10 | + <a href="https://deepwiki.com/GramSearch/telegram-search"><img src="https://deepwiki.com/badge.svg"></a> |
| 11 | + <a href="https://github.com/GramSearch/telegram-search/blob/main/LICENSE"><img src="https://img.shields.io/github/license/GramSearch/telegram-search.svg?style=flat&colorA=080f12&colorB=1fa669"></a> |
| 12 | + <a href="https://discord.gg/NzYsmJSgCT"><img src="https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fdiscord.com%2Fapi%2Finvites%2FNzYsmJSgCT%3Fwith_counts%3Dtrue&query=%24.approximate_member_count&suffix=%20members&logo=discord&logoColor=white&label=%20&color=7389D8&labelColor=6A7EC2"></a> |
| 13 | + <a href="https://t.me/+Gs3SH2qAPeFhYmU9"><img src="https://img.shields.io/badge/Telegram-%235AA9E6?logo=telegram&labelColor=FFFFFF"></a> |
| 14 | +</p> |
| 15 | + |
| 16 | +> 公式ウェブサイトは `intentchat.app` のみです。他のウェブサイトはすべて詐欺です。 |
| 17 | +> |
| 18 | +> 仮想通貨は一切発行していません。詐欺にご注意ください。 |
| 19 | +> |
| 20 | +> このソフトウェアは自分のチャット履歴をエクスポートして検索するためのものです。違法な目的で使用しないでください。 |
| 21 | +
|
| 22 | +<a href="https://trendshift.io/repositories/13868" target="_blank"><img src="https://trendshift.io/api/badge/repositories/13868" alt="groupultra%2Ftelegram-search | Trendshift" style="width: 250px; height: 55px;" width="250" height="55"/></a> |
| 23 | + |
| 24 | +ベクトル検索とセマンティックマッチングをサポートする強力なTelegramチャット履歴検索ツール。OpenAIのセマンティックベクトル技術に基づいて、Telegramメッセージの検索をよりスマートで正確にします。 |
| 25 | + |
| 26 | +## 💖 スポンサー |
| 27 | + |
| 28 | + |
| 29 | + |
| 30 | +## 🚀 クイックスタート |
| 31 | + |
| 32 | +1. リポジトリをクローン: |
| 33 | + |
| 34 | +```bash |
| 35 | +git clone https://github.com/GramSearch/telegram-search.git |
| 36 | +cd telegram-search |
| 37 | + |
| 38 | +# リリースブランチに切り替え |
| 39 | +git switch release |
| 40 | +``` |
| 41 | + |
| 42 | +2. 設定を構成: |
| 43 | + |
| 44 | +```bash |
| 45 | +# 必要に応じて config/config.yaml の設定を変更します。 |
| 46 | +# 設定の database.host の値を "pgvector" に変更してください。 |
| 47 | + |
| 48 | +cp config/config.example.yaml config/config.yaml |
| 49 | +``` |
| 50 | + |
| 51 | +3. サービスを起動: |
| 52 | + |
| 53 | +```bash |
| 54 | +docker compose up -d |
| 55 | +``` |
| 56 | + |
| 57 | +http://localhost:3333 にアクセスして検索インターフェースを開きます。 |
| 58 | + |
| 59 | +## 💻 開発ガイド |
| 60 | + |
| 61 | +1. リポジトリをクローン |
| 62 | + |
| 63 | +2. 依存関係をインストール |
| 64 | + |
| 65 | +```bash |
| 66 | +pnpm install |
| 67 | +``` |
| 68 | + |
| 69 | +3. 環境を設定 |
| 70 | + |
| 71 | +4. データベースコンテナを起動: |
| 72 | + |
| 73 | +```bash |
| 74 | +# ローカル開発では、Dockerはデータベースコンテナのみに使用されます。 |
| 75 | +docker compose up -d pgvector |
| 76 | +``` |
| 77 | + |
| 78 | +5. データベーススキーマを同期: |
| 79 | + |
| 80 | +```bash |
| 81 | +pnpm run db:migrate |
| 82 | +``` |
| 83 | + |
| 84 | +6. サービスを起動: |
| 85 | + |
| 86 | +```bash |
| 87 | +# バックエンドを起動 |
| 88 | +pnpm run dev:server |
| 89 | + |
| 90 | +# フロントエンドを起動 |
| 91 | +pnpm run dev:frontend |
| 92 | +``` |
| 93 | + |
| 94 | +## 🏗️ アーキテクチャ |
| 95 | + |
| 96 | +```mermaid |
| 97 | +graph TB |
| 98 | + subgraph "🖥️ フロントエンドレイヤー" |
| 99 | + Frontend["Webフロントエンド<br/>(Vue 3 + Pinia)"] |
| 100 | + Electron["Electronデスクトップ"] |
| 101 | + |
| 102 | + subgraph "クライアントイベントハンドラー" |
| 103 | + ClientAuth["認証ハンドラー"] |
| 104 | + ClientMessage["メッセージハンドラー"] |
| 105 | + ClientStorage["ストレージハンドラー"] |
| 106 | + ClientEntity["エンティティハンドラー"] |
| 107 | + ClientServer["サーバーハンドラー"] |
| 108 | + end |
| 109 | + end |
| 110 | +
|
| 111 | + subgraph "🌐 通信レイヤー" |
| 112 | + WS["WebSocketイベントブリッジ<br/>リアルタイム双方向通信<br/>• イベント登録<br/>• イベント転送<br/>• セッション管理"] |
| 113 | + end |
| 114 | +
|
| 115 | + subgraph "🚀 バックエンドサービスレイヤー" |
| 116 | + Server["バックエンドサーバー<br/>(REST API)"] |
| 117 | + |
| 118 | + subgraph "セッション管理" |
| 119 | + SessionMgr["セッションマネージャー<br/>• クライアント状態<br/>• CoreContextインスタンス<br/>• イベントリスナー"] |
| 120 | + end |
| 121 | + end |
| 122 | +
|
| 123 | + subgraph "🎯 コアイベントシステム" |
| 124 | + Context["CoreContext<br/>🔥 中央イベントバス<br/>(EventEmitter3)<br/>• ToCoreEvent<br/>• FromCoreEvent<br/>• イベントラッパー<br/>• エラーハンドリング"] |
| 125 | + |
| 126 | + subgraph "コアイベントハンドラー" |
| 127 | + AuthHandler["🔐 認証ハンドラー"] |
| 128 | + MessageHandler["📝 メッセージハンドラー"] |
| 129 | + DialogHandler["💬 ダイアログハンドラー"] |
| 130 | + StorageHandler["📦 ストレージハンドラー"] |
| 131 | + ConfigHandler["⚙️ 設定ハンドラー"] |
| 132 | + EntityHandler["👤 エンティティハンドラー"] |
| 133 | + GramEventsHandler["📡 Gramイベントハンドラー"] |
| 134 | + MessageResolverHandler["🔄 メッセージリゾルバーハンドラー"] |
| 135 | + end |
| 136 | + end |
| 137 | +
|
| 138 | + subgraph "🔧 ビジネスサービスレイヤー" |
| 139 | + subgraph "サービス" |
| 140 | + AuthService["認証<br/>サービス"] |
| 141 | + MessageService["メッセージ<br/>サービス"] |
| 142 | + DialogService["ダイアログ<br/>サービス"] |
| 143 | + StorageService["ストレージ<br/>サービス"] |
| 144 | + ConfigService["設定<br/>サービス"] |
| 145 | + EntityService["エンティティ<br/>サービス"] |
| 146 | + ConnectionService["接続<br/>サービス"] |
| 147 | + TakeoutService["テイクアウト<br/>サービス"] |
| 148 | + end |
| 149 | + |
| 150 | + subgraph "メッセージ処理パイプライン" |
| 151 | + MsgResolverService["メッセージリゾルバー<br/>サービス"] |
| 152 | + |
| 153 | + subgraph "メッセージリゾルバー" |
| 154 | + EmbeddingResolver["🤖 埋め込み<br/>リゾルバー<br/>(OpenAI)"] |
| 155 | + JiebaResolver["📚 Jieba<br/>リゾルバー<br/>(中国語分割)"] |
| 156 | + LinkResolver["🔗 リンク<br/>リゾルバー"] |
| 157 | + MediaResolver["📸 メディア<br/>リゾルバー"] |
| 158 | + UserResolver["👤 ユーザー<br/>リゾルバー"] |
| 159 | + end |
| 160 | + end |
| 161 | + end |
| 162 | +
|
| 163 | + subgraph "🗄️ データレイヤー" |
| 164 | + DB["PostgreSQL<br/>+ pgvector"] |
| 165 | + Drizzle["Drizzle ORM"] |
| 166 | + end |
| 167 | +
|
| 168 | + subgraph "📡 外部API" |
| 169 | + TelegramAPI["Telegram API<br/>(gram.js)"] |
| 170 | + OpenAI["OpenAI API<br/>ベクトル埋め込み"] |
| 171 | + end |
| 172 | +
|
| 173 | + %% WebSocketイベントフロー |
| 174 | + Frontend -.->|"WsEventToServer<br/>• auth:login<br/>• message:query<br/>• dialog:fetch"| WS |
| 175 | + WS -.->|"WsEventToClient<br/>• message:data<br/>• auth:status<br/>• storage:progress"| Frontend |
| 176 | + |
| 177 | + Electron -.->|"WebSocketイベント"| WS |
| 178 | + WS -.->|"リアルタイム更新"| Electron |
| 179 | +
|
| 180 | + %% サーバーレイヤー |
| 181 | + WS <--> Server |
| 182 | + Server --> SessionMgr |
| 183 | + SessionMgr --> Context |
| 184 | +
|
| 185 | + %% コアイベントシステム(アーキテクチャの要点) |
| 186 | + Context <==> AuthHandler |
| 187 | + Context <==> MessageHandler |
| 188 | + Context <==> DialogHandler |
| 189 | + Context <==> StorageHandler |
| 190 | + Context <==> ConfigHandler |
| 191 | + Context <==> EntityHandler |
| 192 | + Context <==> GramEventsHandler |
| 193 | + Context <==> MessageResolverHandler |
| 194 | +
|
| 195 | + %% イベントハンドラーからサービスへ |
| 196 | + AuthHandler --> AuthService |
| 197 | + MessageHandler --> MessageService |
| 198 | + DialogHandler --> DialogService |
| 199 | + StorageHandler --> StorageService |
| 200 | + ConfigHandler --> ConfigService |
| 201 | + EntityHandler --> EntityService |
| 202 | + GramEventsHandler --> ConnectionService |
| 203 | + MessageResolverHandler --> MsgResolverService |
| 204 | +
|
| 205 | + %% メッセージ処理パイプライン |
| 206 | + MessageService --> MsgResolverService |
| 207 | + MsgResolverService --> EmbeddingResolver |
| 208 | + MsgResolverService --> JiebaResolver |
| 209 | + MsgResolverService --> LinkResolver |
| 210 | + MsgResolverService --> MediaResolver |
| 211 | + MsgResolverService --> UserResolver |
| 212 | +
|
| 213 | + %% データレイヤー |
| 214 | + StorageService --> Drizzle |
| 215 | + Drizzle --> DB |
| 216 | +
|
| 217 | + %% 外部API |
| 218 | + AuthService --> TelegramAPI |
| 219 | + MessageService --> TelegramAPI |
| 220 | + DialogService --> TelegramAPI |
| 221 | + EntityService --> TelegramAPI |
| 222 | + EmbeddingResolver --> OpenAI |
| 223 | +
|
| 224 | + %% クライアントイベントシステム |
| 225 | + Frontend --> ClientAuth |
| 226 | + Frontend --> ClientMessage |
| 227 | + Frontend --> ClientStorage |
| 228 | + Frontend --> ClientEntity |
| 229 | + Frontend --> ClientServer |
| 230 | +
|
| 231 | + %% スタイリング |
| 232 | + classDef frontend fill:#4CAF50,stroke:#2E7D32,color:#fff,stroke-width:2px |
| 233 | + classDef websocket fill:#FF9800,stroke:#E65100,color:#fff,stroke-width:3px |
| 234 | + classDef server fill:#2196F3,stroke:#1565C0,color:#fff,stroke-width:2px |
| 235 | + classDef context fill:#E91E63,stroke:#AD1457,color:#fff,stroke-width:4px |
| 236 | + classDef handler fill:#9C27B0,stroke:#6A1B9A,color:#fff,stroke-width:2px |
| 237 | + classDef service fill:#607D8B,stroke:#37474F,color:#fff,stroke-width:2px |
| 238 | + classDef resolver fill:#795548,stroke:#3E2723,color:#fff,stroke-width:2px |
| 239 | + classDef data fill:#3F51B5,stroke:#1A237E,color:#fff,stroke-width:2px |
| 240 | + classDef external fill:#F44336,stroke:#C62828,color:#fff,stroke-width:2px |
| 241 | +
|
| 242 | + class Frontend,Electron,ClientAuth,ClientMessage,ClientStorage,ClientEntity,ClientServer frontend |
| 243 | + class WS websocket |
| 244 | + class Server,SessionMgr server |
| 245 | + class Context context |
| 246 | + class AuthHandler,MessageHandler,DialogHandler,StorageHandler,ConfigHandler,EntityHandler,GramEventsHandler,MessageResolverHandler handler |
| 247 | + class AuthService,MessageService,DialogService,StorageService,ConfigService,EntityService,ConnectionService,TakeoutService,MsgResolverService service |
| 248 | + class EmbeddingResolver,JiebaResolver,LinkResolver,MediaResolver,UserResolver resolver |
| 249 | + class DB,Drizzle data |
| 250 | + class TelegramAPI,OpenAI external |
| 251 | +``` |
| 252 | + |
| 253 | +### イベント駆動アーキテクチャの概要 |
| 254 | + |
| 255 | +- **🎯 CoreContext - 中央イベントバス**: EventEmitter3を使用してすべてのイベントを管理するシステムの中心 |
| 256 | + - **ToCoreEvent**: コアシステムに送信されるイベント(auth:login、message:queryなど) |
| 257 | + - **FromCoreEvent**: コアシステムから発行されるイベント(message:data、auth:statusなど) |
| 258 | + - **イベントラッピング**: すべてのイベントの自動エラー処理とロギング |
| 259 | + - **セッション管理**: 各クライアントセッションに独自のCoreContextインスタンス |
| 260 | + |
| 261 | +- **🌐 WebSocketイベントブリッジ**: リアルタイム双方向通信レイヤー |
| 262 | + - **イベント登録**: クライアントが受信したい特定のイベントを登録 |
| 263 | + - **イベント転送**: フロントエンドとCoreContext間でイベントをシームレスに転送 |
| 264 | + - **セッション永続性**: 接続全体でクライアント状態とイベントリスナーを維持 |
| 265 | + |
| 266 | +- **🔄 メッセージ処理パイプライン**: 複数のリゾルバーを通じたストリームベースのメッセージ処理 |
| 267 | + - **埋め込みリゾルバー**: セマンティック検索のためにOpenAIを使用してベクトル埋め込みを生成 |
| 268 | + - **Jiebaリゾルバー**: より良い検索機能のための中国語単語分割 |
| 269 | + - **リンク/メディア/ユーザーリゾルバー**: さまざまなメッセージコンテンツタイプを抽出して処理 |
| 270 | + |
| 271 | +- **📡 イベントフロー**: |
| 272 | + 1. フロントエンドがWebSocket経由でイベントを発行(例: `auth:login`、`message:query`) |
| 273 | + 2. サーバーが適切なCoreContextインスタンスにイベントを転送 |
| 274 | + 3. イベントハンドラーがイベントを処理し、対応するサービスを呼び出す |
| 275 | + 4. サービスがCoreContext経由で結果イベントを発行 |
| 276 | + 5. WebSocketがリアルタイム更新のためにフロントエンドにイベントを転送 |
| 277 | + |
| 278 | +## 🚀 アクティビティ |
| 279 | + |
| 280 | +[](https://star-history.com/#luoling8192/telegram-search&Date) |
0 commit comments