逆引き検索・レコメンド
概要
目的地が決まっていないユーザー向けに、所持マイルと予算から「お得に行ける旅行先」を逆引き検索・レコメンドする機能。
ユースケース
UC1: 所持マイルから行ける場所を探す
入力:
- 所持マイル: 15,000 (ANA)
- 出発空港: HND(羽田)
- 希望日程: 2024-07-20 〜 2024-07-22
処理:
1. mile_charts から ANA + HND 出発 + 15,000マイル以下の路線を抽出
2. 日程からシーズン判定(7月 → R)
3. 各目的地の宿泊情報を並行取得
出力:
┌─────────┬────────┬──────────┬────────────┐
│ 目的地 │ マイル │ 宿泊最安 │ 総コスト概算 │
├─────────┼────────┼──────────┼────────────┤
│ 福岡 │ 7,500 │ ¥3,900 │ ¥7,800 │
│ 札幌 │ 7,500 │ ¥4,800 │ ¥9,600 │
│ 沖縄 │ 9,000 │ ¥5,200 │ ¥10,400 │
│ 広島 │ 6,000 │ ¥4,200 │ ¥8,400 │
└─────────┴────────┴──────────┴────────────┘UC2: マイル + 宿泊費の総コストでお得順検索
入力:
- 所持マイル: 20,000 (ANA)
- 出発空港: HND
- 宿泊予算上限: ¥30,000(2泊分)
- 日程: 2泊3日
処理:
1. 行ける路線を抽出
2. 各目的地で宿泊予算以内のホテルを検索
3. マイル効率 + 宿泊コスパでスコアリング
出力: スコア順のランキングUC3: シーズン別お得度ヒートマップ
入力:
- 出発空港: HND
- 目的地: OKA(那覇)
- 期間: 2024年全体
出力:
月別ヒートマップ:
1月 [■■□□□] マイル: 7,000(L) 宿泊平均: ¥4,500
2月 [■■□□□] マイル: 7,000(L) 宿泊平均: ¥4,200
3月 [■■■□□] マイル: 9,000(R) 宿泊平均: ¥5,800
...
7月 [■■■■□] マイル: 9,000(R) 宿泊平均: ¥8,500
8月 [■■■■■] マイル: 10,500(H) 宿泊平均: ¥12,000
...スコアリングアルゴリズム
マイル効率(Mile Value)
1マイルあたりの円換算価値を算出する。
javascript
function calculateMileValue(normalAirfare, milesRequired) {
// 通常航空券価格 ÷ 必要マイル数 = 1マイルの価値(円)
return normalAirfare / milesRequired;
}
// 例: 羽田→那覇 通常 ¥25,000 / 9,000マイル = 2.78円/マイル宿泊コスパ(Accommodation Value)
javascript
function calculateAccommodationValue(pricePerNight, rating) {
// 評価あたりの料金(低いほどコスパ良い)
return pricePerNight / rating;
}総合スコア
javascript
function calculateTotalScore(destination) {
const mileValue = calculateMileValue(
destination.normalAirfare,
destination.milesRequired
);
const accommodationValue = calculateAccommodationValue(
destination.bestAccommodation.pricePerNight,
destination.bestAccommodation.rating
);
// マイル効率を重視(重み 0.6)、宿泊コスパ(重み 0.4)
const normalizedMileValue = mileValue / MAX_MILE_VALUE;
const normalizedAccomValue = 1 - (accommodationValue / MAX_ACCOM_VALUE);
return normalizedMileValue * 0.6 + normalizedAccomValue * 0.4;
}スコアリングの重み調整
ユーザーが検索時に重みを調整できるようにする。
| プリセット | マイル効率 | 宿泊コスパ | 説明 |
|---|---|---|---|
| マイル重視 | 0.8 | 0.2 | マイルの価値を最大化したい |
| バランス | 0.5 | 0.5 | 総合的にお得な旅行先 |
| コスパ重視 | 0.3 | 0.7 | 宿泊費を抑えたい |
| 総額最安 | 0.4 | 0.6 | 全体の出費を最小化 |
検索フロー
1. ユーザー入力を受信
│
2. マイルチャートDBからフィルタリング
│ (所持マイル ≥ 必要マイル, 出発空港一致)
│
3. シーズン判定
│ (日程 → L/R/H シーズン)
│
4. 候補目的地リスト生成
│
5. 各目的地に対して並行処理:
│ ├── 宿泊検索 (4社API → キャッシュ優先)
│ ├── 通常航空券価格取得 (キャッシュ)
│ └── スコア計算
│
6. スコア順にソート
│
7. レスポンス返却
│ (上位N件 + 地図データ)パフォーマンス最適化
| 対策 | 詳細 |
|---|---|
| APIキャッシュ | 宿泊検索結果を1時間キャッシュ |
| 並行リクエスト | Promise.allSettled で4社同時取得 |
| 段階的表示 | マイル情報は即座に表示、宿泊情報は非同期で追加 |
| ページネーション | 検索結果は20件ずつ表示 |
| プリフェッチ | 人気目的地の宿泊情報を定期的にプリフェッチ |
UI表示
地図ベース表示
日本地図上に行ける目的地をマーカーで表示。
- マーカーの色: スコアに応じて緑(お得)→ 黄 → 赤(高い)
- マーカーのサイズ: マイル効率に比例
- クリックでポップアップ: 必要マイル + 宿泊最安値 + 予約リンク
カードリスト表示
┌────────────────────────────────────┐
│ 📍 福岡 ★ 4.2 │
│ ✈️ ANA 7,500マイル (L) │
│ 🏨 最安 ¥3,900/泊 (楽天トラベル) │
│ 💰 総コスト概算: ¥7,800 (2泊) │
│ 📊 マイル効率: 2.1円/マイル │
│ [詳細を見る] [プランに追加] │
└────────────────────────────────────┘