いきなりshelf.privateに格納している全PDFのインデックスを付けようとして破綻したので、 「PDFファイル名のハッシュ値で分割して」と伝え、 Claude Codeさんに実装してもらいました。 以下の文章は Claude が作成したものです。
shelf.privateのPDFインデックス分割設計とコンテンツ検索機能強化 by Claude
2025年6月21日
はじめに
今回のセッションでは、shelf.privateプロジェクトのPDFテキストインデックス機能の改善に取り組みました。従来の単一ファイル形式の制約を解決し、大量PDFファイルの効率的な処理と検索機能の向上を目指しました。
これまでのshelf.private
今回達成したこと・主な成果
- 分割インデックス形式の実装: 単一JSONファイルから個別ファイル(storage/index/XXXXXXXX.json)への移行
- インクリメンタル更新対応: PDFファイルごとの独立したインデックス管理
- OCR誤認識対応: 空白・改行を無視した柔軟な検索機能
- 検索結果表示の最適化: 1PDFあたり3件まで詳細表示、残りは件数表示
- ソート機能の追加: マッチ数順・新しい順・古い順の選択可能
- 除外パターン機能: 特定文字列を含むPDFの自動除外
- 旧インデックス自動移行: 既存データの seamless な移行処理
- 検索フォームデザイン統一: 全ページで一貫したUI
- 実インデックス数表示: 検索対象の正確な情報提供
セッションの主な流れとAIの貢献
分割インデックス設計
結城浩さんからPDFファイル数の増加による処理時間の課題を解決するため、個別ファイル管理方式を提案いただいたので、SHA256ハッシュを使って実装を行いました。originalFilenameフィールドによる検証機能も併せて設計し、データ整合性を確保しました。
OCR誤認識問題の解決
実際の検索テストで空白や改行が多数含まれるOCRテキストの課題が判明した際、normalizeTextForSearch関数を設計し、検索キーワードは保持しつつ対象テキストのみ正規化する手法を実装しました。
検索結果表示の改善
大量マッチによる画面占有の問題に対し、1PDFあたり3件までの詳細表示と残り件数表示の仕組みを提案・実装しました。同時にソート機能も追加し、ユーザビリティを向上させました。
除外パターンの実装
検索対象としないPDFの除外要求に対し、EXCLUDE_PATTERNS
配列による柔軟な管理システムを設計しました。
今後の拡張
- インデックス作成完了後の性能評価とさらなる最適化
- 検索結果のキャッシュ機構の検討
- より高度な検索機能(フレーズ検索、近接検索等)の実装
- インデックス統計情報の可視化
おわりに
分割インデックス設計により、大規模PDFコレクションでも快適に動作する基盤ができましたね。次回はインデックス完成後の実際の利用体験を一緒に確認させていただければと思います。
(2025年6月21日)