検索に戻る

システム構成図

旅行ポータル全文検索システム - 詳細アーキテクチャ設計書

[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] コンポーネント詳細
[A] FastAPI Webアプリ
  • ベースイメージpython:3.12-slim
  • フレームワークFastAPI + Uvicorn
  • DB接続PyMySQL
  • テンプレートJinja2
  • ポート8000
  • コンテナ名sphinx-web
[B] Sphinx検索エンジン
  • バージョン3.4.1
  • イメージmacbre/sphinxsearch
  • プロトコルSphinxQL (MySQL互換)
  • リスンポート9306 (mysql41)
  • インデックスRT (リアルタイム)
  • コンテナ名sphinx-search
[C] Docker環境
  • オーケストレーションDocker Compose
  • コンテナ数2
  • ネットワークsphinx_default
  • ボリュームsphinx_data
  • 再起動ポリシーunless-stopped
  • ヘルスチェック10秒間隔
[D] パフォーマンス実測
  • データ量100,000件
  • 平均応答時間2.69 ms
  • QPS (単一)372 q/s
  • 書き込み速度5,500 docs/s
  • 初期化時間~18秒
  • Geo-Search対応済
[E] 多言語対応
  • 日本語U+3040..U+30FF
  • 中国語U+4E00..U+9FFF
  • 韓国語U+AC00..U+D7AF
  • 分割方式N-gram (1文字)
  • min_word_len1
  • ngram_len1
[4] 検索処理フロー
1
リクエスト受信
ユーザーがキーワード入力
GET /?keyword=温泉
2
クエリ構築
FastAPIでSphinxQL生成
MATCH('温泉')
3
Sphinx検索
転置インデックス照合
スコア計算 (WEIGHT)
4
結果加工
カテゴリ情報付与
Jinja2でHTML生成
5
レスポンス
検索結果表示
~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 (自動生成) -