./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
```