システム構成図
旅行ポータル全文検索システム - 詳細アーキテクチャ設計書
[1] システムアーキテクチャ
[User]
エンドユーザー
Webブラウザ
HTTPS (Port 443)
[Net]
ngrok / Cloudflare Tunnel
パブリックアクセス用トンネル
HTTP (Port 8000)
Docker Compose
sphinx-web コンテナ
[Init]
init_data.py
起動時データ生成 (100K件)
↓ 起動後
[API]
FastAPI + Uvicorn
Python 3.12-slim
app.py (Webアプリ)
:8000
SphinxQL
PyMySQL
sphinx-search コンテナ
[Search]
Sphinx 3.4.1
macbre/sphinxsearch
searchd デーモン
:9306
[DB]
testrt
履歴書索引
[DB]
travel
旅行データ索引
[Vol]
sphinx_data
永続化ボリューム
[Cfg]
sphinx.conf
インデックス設定
[2] プロジェクト構成
sphinx/ ├── docker-compose.yml # コンテナオーケストレーション定義 ├── Dockerfile # Webコンテナビルド設定 ├── sphinx.conf # Sphinx検索エンジン設定 │ ├── app.py # FastAPI Webアプリケーション (メイン) │ ├── GET / # 検索UI (HTML) │ ├── GET /api/search # 検索API (JSON) │ ├── GET /api/stats # 統計API │ └── GET /architecture # 本ページ │ ├── init_data.py # 起動時データ生成スクリプト │ ├── 6都市の座標データ # 東京, 大阪, 京都, 札幌, 那覇, 富士山 │ ├── カテゴリ別タグ # ホテル/観光地/レストラン │ └── 100,000件生成 # ~5,500 docs/sec │ ├── travel_search_test.py # 検索機能テストスクリプト ├── resume_search.py # 履歴書検索テスト └── poc_report.html # PoC検証レポート
[3] コンポーネント詳細
FastAPI Webアプリ
- ベースイメージpython:3.12-slim
- フレームワークFastAPI + Uvicorn
- DB接続PyMySQL
- テンプレートJinja2
- ポート8000
- コンテナ名sphinx-web
Sphinx検索エンジン
- バージョン3.4.1
- イメージmacbre/sphinxsearch
- プロトコルSphinxQL (MySQL互換)
- リスンポート9306 (mysql41)
- インデックスRT (リアルタイム)
- コンテナ名sphinx-search
Docker環境
- オーケストレーションDocker Compose
- コンテナ数2
- ネットワークsphinx_default
- ボリュームsphinx_data
- 再起動ポリシーunless-stopped
- ヘルスチェック10秒間隔
パフォーマンス実測
- データ量100,000件
- 平均応答時間2.69 ms
- QPS (単一)372 q/s
- 書き込み速度5,500 docs/s
- 初期化時間~18秒
- Geo-Search対応済
多言語対応
- 日本語U+3040..U+30FF
- 中国語U+4E00..U+9FFF
- 韓国語U+AC00..U+D7AF
- 分割方式N-gram (1文字)
- min_word_len1
- ngram_len1
[4] 検索処理フロー
1
リクエスト受信
ユーザーがキーワード入力
GET /?keyword=温泉
GET /?keyword=温泉
2
クエリ構築
FastAPIでSphinxQL生成
MATCH('温泉')
MATCH('温泉')
3
Sphinx検索
転置インデックス照合
スコア計算 (WEIGHT)
スコア計算 (WEIGHT)
4
結果加工
カテゴリ情報付与
Jinja2でHTML生成
Jinja2でHTML生成
5
レスポンス
検索結果表示
~3ms応答
~3ms応答
[5] travelインデックス スキーマ設計
| フィールド名 | 型 | 用途 | 例 |
|---|---|---|---|
name |
rt_field | 施設名 (全文検索) | 東京のホテル123 |
description |
rt_field | 説明文 (全文検索) | 東京にある素敵な場所です |
address |
rt_field | 住所 (全文検索) | 東京市中心部 |
tags |
rt_field | タグ (全文検索) | 温泉 WiFi 朝食付き |
category_id |
rt_attr_uint | カテゴリ フィルタ | 1=ホテル, 2=観光地, 3=レストラン |
price |
rt_attr_uint | 価格 範囲検索 | 3000 ~ 50000 |
rating |
rt_attr_uint | 評価 ソート | 50 ~ 100 |
review_count |
rt_attr_uint | レビュー数 | 10 ~ 5000 |
lat |
rt_attr_float | 緯度 Geo-Search | 35.6812 |
lon |
rt_attr_float | 経度 Geo-Search | 139.7671 |
created_at |
rt_attr_uint | 作成日時 (UNIX) | 1703145600 |
[6] API エンドポイント
| メソッド | パス | 説明 | パラメータ |
|---|---|---|---|
| GET | / |
検索UI (HTMLページ) | keyword, category, min_price, max_price, min_rating |
| GET | /api/search |
検索API (JSON) | keyword, category, min_price, max_price, min_rating, limit |
| GET | /api/stats |
統計情報API | - |
| GET | /architecture |
システム構成図 (本ページ) | - |
| GET | /docs |
Swagger UI (自動生成) | - |