CMS(コンテンツ管理システム)において、サイト内検索機能はユーザーが求める情報に素早くアクセスするために不可欠です。検索性能が優れていれば、ユーザーの利便性が向上し、サイトの滞在時間や再訪率の向上にもつながります。本記事では、PHPとPostgreSQLを活用し、効率的な検索機能を実装する方法を詳しく解説します。
解説
1. サイト内検索機能の概要
サイト内検索機能には、以下の要素が求められます。
- 投稿のタイトル・内容を検索
- 検索結果のランキング
- ページネーションの実装
- 高速な検索性能
2. 開発環境
- バックエンド:PHP(Laravel)
- データベース:PostgreSQL
- フロントエンド:HTML/CSS/JavaScript(Vue.jsまたはReact)
- サーバー環境:Linux(Ubuntu / CentOS)
- Webサーバー:Apache
3. サイト内検索機能の実装
(1)データベース設計
CREATE INDEX idx_posts_title_content ON posts USING gin (to_tsvector('japanese', title || ' ' || content));
PostgreSQLのto_tsvector
を利用し、全文検索用のインデックスを作成します。
(2)検索クエリの作成
if (isset($_GET['query'])) {
$query = $_GET['query'];
$stmt = $pdo->prepare("SELECT id, title, content, created_at FROM posts WHERE to_tsvector('japanese', title || ' ' || content) @@ plainto_tsquery('japanese', ?) ORDER BY created_at DESC");
$stmt->execute([$query]);
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
}
ユーザーの入力を受け取り、全文検索を行います。
(3)検索結果の表示
if (!empty($results)) {
foreach ($results as $post) {
echo "<h2><a href='post.php?id=" . $post['id'] . "'>" . htmlspecialchars($post['title']) . "</a></h2>";
echo "<p>" . nl2br(htmlspecialchars(substr($post['content'], 0, 100))) . "...</p>";
echo "<small>投稿日: " . htmlspecialchars($post['created_at']) . "</small>";
echo "<hr>";
}
} else {
echo "<p>該当する記事が見つかりません。</p>";
}
検索結果を一覧として表示します。
注意点
- セキュリティ対策
- SQLインジェクションを防ぐため、プリペアドステートメントを使用する。
- XSS対策として、出力時に
htmlspecialchars()
を適用する。
- パフォーマンスの最適化
to_tsvector
とplainto_tsquery
を活用し、高速な全文検索を実現する。- 検索対象のデータが増えた場合、適切なインデックスを設定する。
- ユーザーエクスペリエンスの向上
- 検索キーワードのハイライト表示を実装する。
- 検索候補のサジェスト機能を追加する。
結論
サイト内検索機能は、CMSにおいて重要な役割を果たします。適切なデータベース設計と効率的な検索クエリを用いることで、高速かつ精度の高い検索を実現できます。本記事を参考に、実際に開発を進めてみてください。
コメント