./knowledge-base/docs/改修要件定義書_ジャンル機能改修_v1.0.md
# 改修要件定義書:ジャンル機能改修 v1.0
**作成日**: 2026年4月7日
**対象モジュール**: `knowledge-base/frontend`, `knowledge-base/lambda`
---
## 1. 改修概要
| 要件番号 | 改修内容 | 影響範囲 |
| -------- | ------------------------------------------------ | -------------------------------------------- |
| 要件1 | 「ジャンルで検索」ブラウズボタンの新規追加 | フロントエンド |
| 要件2 | 「書籍タイトルで検索」の動作変更・ボタン位置変更 | フロントエンド |
| 要件3 | ページジャンルタグの完全削除 | フロントエンド・Lambda・DynamoDB・OpenSearch |
---
## 2. 用語整理
本システムには「ジャンル」と名の付くフィールドが2種類存在する。改修対象を明確にするため以下のとおり定義する。
| 用語 | フィールド名 | 粒度 | 選択肢例 | 今回の扱い |
| ------------------ | ----------------------------------- | ---------------- | -------------------------------------------- | ------------ |
| **資料ジャンル** | `document_genre` | 書籍(文献)単位 | 写真集, 辞書, 年表, ノンフィクション小説 等 | **維持** |
| **ページジャンル** | `genre` / `user_genre` / `ai_genre` | ページ単位 | 生活, 住宅, 食文化, 交通, 娯楽, 産業, その他 | **完全削除** |
---
## 3. 要件1:「ジャンルで検索」ブラウズボタンの新規追加
### 3.1 概要
「または一覧から探す」エリアに「ジャンルで検索」ボタンを新たに追加する。
### 3.2 動作仕様
- **現行の「書籍タイトルで検索」と全く同じ動作**にする
- ボタンをクリック → `DocumentGenreSelector`(資料ジャンル一覧グリッド)が表示される
- ジャンルを選択 → そのジャンルに絞り込んだ書籍タイトル一覧が表示される
- 書籍タイトルをクリック → 該当タイトルで検索が実行される
### 3.3 UI仕様
| 項目 | 値 |
| ----------------- | ----------------------- |
| ボタンラベル | ジャンルで検索 |
| アイコン画像 | `/img/trump.png` |
| `browseMode` の値 | `"genre"` |
| ボタン配置位置 | ボタン行の右端(4番目) |
### 3.4 変更ファイル
- `knowledge-base/frontend/src/pages/SearchPage.tsx`
- `browseMode` の型に `"genre"` を追加
- 「ジャンルで検索」ボタンを追加
- `browseMode === "genre"` のときに `BrowseBookTitleList` を表示(`browseBookGenre` state を共有)
- `knowledge-base/frontend/src/types/index.ts`
- 必要に応じて型定義を更新
---
## 4. 要件2:「書籍タイトルで検索」の動作変更・ボタン位置変更
### 4.1 動作変更
**変更前(現行)**:
1. 書籍タイトルボタンをクリック
2. `DocumentGenreSelector`(資料ジャンル選択画面)が表示される ← **廃止**
3. ジャンルを選択後、書籍一覧が表示される
**変更後**:
1. 書籍タイトルボタンをクリック
2. **全書籍タイトル一覧がすぐに表示される**(ジャンル選択ステップをスキップ)
- `browseBookGenre` state を使用せず、`documentList` を無絞り込みでそのまま表示する
- 「ジャンル選択に戻る」ボタン等は不要(書籍一覧のみ表示)
### 4.2 ボタン位置変更
**変更前の順序**: 時代で検索 → 番組名で検索 → 書籍タイトルで検索
**変更後の順序**: **書籍タイトルで検索** → 時代で検索 → 番組名で検索 → ジャンルで検索(新規)
### 4.3 変更ファイル
- `knowledge-base/frontend/src/pages/SearchPage.tsx`
- ボタン順序の変更
- `browseMode === "book"` のときの表示ロジック変更(`browseBookGenre` 不要化)
- `knowledge-base/frontend/src/components/BrowseLists.tsx`
- `BrowseBookTitleList` コンポーネントから「ジャンル選択ステップ(Step1)」を廃止
- 全書籍一覧を直接表示するシンプルなUIに変更
- 「ジャンル選択に戻る」ボタンを削除
---
## 5. 要件3:ページジャンルタグの完全削除
### 5.1 削除対象
| 対象 | 削除内容 |
| -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------ |
| フロントエンド | `genre` の表示・入力UI (`SearchResultCard`, `DetailDialog`) |
| フロントエンド | `GENRE_OPTIONS` 定数 |
| フロントエンド | 検索フォームの genre フィルタ(もし存在すれば) |
| search-api Lambda | レスポンスから `genre`, `ai_genre` フィールドを削除 |
| search-api Lambda | 検索フィルタ `filters.genre` の処理を削除 |
| maintenance-handler Lambda | `PUT /maintenance/pages/{page_id}/metadata` から `genre` フィールドの更新処理を削除 |
| maintenance-handler Lambda | `POST /maintenance/documents/{id}/reanalyze` の SQSメッセージから `genre` キーを削除 |
| image-analyzer Lambda | プロンプトから `{genre}` 変数の参照を削除 |
| image-analyzer Lambda | OpenSearch 保存ドキュメントから `user_genre`, `ai_genre` フィールドを削除 |
| DynamoDB | `historical-research-processing-status` テーブルの全レコードから `user_genre` 属性を削除(マイグレーションスクリプト) |
| OpenSearch | `historical-research-pages` インデックスの全ドキュメントから `user_genre`, `ai_genre` フィールドを削除(マイグレーションスクリプト) |
### 5.2 維持するもの(削除しないもの)
- `document_genre`(資料ジャンル)に関する一切の処理
- `user_document_genre`(OpenSearch上の資料ジャンル)に関する一切の処理
- `DocumentGenreSelector` コンポーネント(要件1・2で引き続き使用)
- `DOCUMENT_GENRE_OPTIONS` 定数
### 5.3 マイグレーションスクリプト仕様
スクリプトは `knowledge-base/scripts/` に配置する。
#### スクリプト①: `remove_page_genre_dynamodb.py`
- 対象テーブル: `historical-research-processing-status`
- 処理: 全レコードをスキャンし、`user_genre` 属性が存在するレコードから当該属性を削除(`REMOVE` 式による `update_item`)
- 実行環境: AWS CLI プロファイル設定済みの環境から実行
- 実行前確認: 削除件数を表示してユーザー確認を求める(`--dry-run` オプション対応)
#### スクリプト②: `remove_page_genre_opensearch.py`
- 対象インデックス: `historical-research-pages`
- 処理: `update_by_query` API を使用し `user_genre`, `ai_genre` フィールドを全ドキュメントから削除
- 実行環境: OpenSearch エンドポイントへのアクセス権が必要
- 実行前確認: 対象件数を表示してユーザー確認を求める(`--dry-run` オプション対応)
### 5.4 変更ファイル(Lambda)
- `knowledge-base/lambda/search-api/handler.py`
- `knowledge-base/lambda/maintenance-handler/handler.py`
- `knowledge-base/lambda/image-analyzer/handler.py`
### 5.5 変更ファイル(フロントエンド)
- `knowledge-base/frontend/src/components/SearchDialogs.tsx`(`GENRE_OPTIONS` 削除・DetailDialogの編集UI変更)
- `knowledge-base/frontend/src/components/SearchCards.tsx`(`result.genre` の表示削除)
- `knowledge-base/frontend/src/types/index.ts`(`SearchResultItem.genre` フィールド削除)
- `knowledge-base/frontend/src/api/client.ts`(必要に応じて)
---
## 6. デプロイ計画
### 6.1 デプロイ順序
```
① フロントエンド変更
② Lambda 変更(CDK deploy で一括)
③ マイグレーションスクリプト実行(DBデータ削除)← 実行前に再確認
```
### 6.2 CI/CD
- フロントエンド: `knowledge-base/frontend/` 配下の変更 → `deploy-frontend.yml` が自動実行
- Lambda: `knowledge-base/lambda/` / `knowledge-base/cdk/` 配下の変更 → `deploy-infrastructure.yml` が自動実行
- マイグレーションスクリプト: 自動実行しない(手動)
---
## 7. 影響範囲まとめ
```
フロントエンド
├── SearchPage.tsx ... ボタン追加・順序変更・browseMode型追加
├── BrowseLists.tsx ... BrowseBookTitleListのStep1廃止
├── SearchDialogs.tsx ... GENRE_OPTIONS削除・ページ編集UIからgenre削除
├── SearchCards.tsx ... result.genreの表示削除
└── types/index.ts ... SearchResultItem.genre削除
Lambda
├── search-api/handler.py ... genre フィルタ・レスポンス削除
├── maintenance-handler/handler.py ... genre 更新処理・SQSメッセージ削除
└── image-analyzer/handler.py ... プロンプト・保存ドキュメントから genre削除
マイグレーション(手動実行)
├── scripts/remove_page_genre_dynamodb.py
└── scripts/remove_page_genre_opensearch.py
```