📖
PHP에서 FULLTEXT 인덱스를 적용한 검색 구현 (MATCH() AGAINST())

페이지 정보

본문

[code]$search_condition ="WHERE MATCH(wr_subject) AGAINST('$search_normalized' IN BOOLEAN MODE)"; [/code]$search_condition 을 WHERE 절에 적용하여 MySQL의 FULLTEXT 인덱스를 활용한 검색을 수행합니다.

📌 1️⃣ FULLTEXT 인덱스 적용
FULLTEXT 인덱스를 사용하려면 대상 컬럼(wr_subject)에 인덱스를 추가해야 합니다.[code]ALTER TABLE posts ADD FULLTEXT(wr_subject);[/code]✅ posts 테이블의 wr_subject 컬럼에 FULLTEXT 인덱스를 추가함.

📌 2️⃣ PHP 코드 적용
다음은 사용자가 입력한 검색어를 MATCH() AGAINST()로 검색하는 예제입니다.
🔹 기본 검색 (BOOLEAN MODE 적용)[code]<?php
// 데이터베이스 연결 (MySQLi)
$mysqli = new mysqli("localhost", "user", "password", "database");

// 검색어 받기 (SQL Injection 방지)
$search_normalized = $mysqli->real_escape_string($_GET['query']);

// FULLTEXT 검색 조건 적용
$search_condition = "WHERE MATCH(wr_subject) AGAINST('$search_normalized' IN BOOLEAN MODE)";

// SQL 실행
$sql = "SELECT * FROM posts $search_condition";
$result = $mysqli->query($sql);

// 결과 출력
while ($row = $result->fetch_assoc()) {
    echo "<p>" . htmlspecialchars($row['wr_subject']) . "</p>";
}

$mysqli->close();
?>[/code]✅ real_escape_string() 사용하여 SQL Injection 방지
✅ 사용자가 입력한 $search_normalized를 MATCH() AGAINST()에서 검색

📌 3️⃣ BOOLEAN MODE 검색 연산자 활용
IN BOOLEAN MODE를 사용하면 더 강력한 검색 연산자를 사용할 수 있습니다.
+ 반드시 포함          +MySQL +검색
- 제외해야 함         MySQL -Oracle
* 와일드카드 검색  MyS* (MySQL, MySoft 등 검색)
" 정확한 문장 검색  "MySQL 검색"
~ 중요도 낮춤            ~MySQL (MySQL 포함 가능하지만 우선순위 낮음)

🔹 예제: 연산자를 활용한 검색[code]$search_normalized = "+MySQL -Oracle"; // 'MySQL' 포함, 'Oracle' 제외
$search_condition = "WHERE MATCH(wr_subject) AGAINST('$search_normalized' IN BOOLEAN MODE)";[/code]

📌 4️⃣ PDO로 보안 강화 (SQL Injection 방지)
MySQLi 대신 PDO를 사용하여 더 안전한 방식으로 구현할 수도 있습니다.[code]<?php
// PDO 연결
$pdo = new PDO("mysql:host=localhost;dbname=database;charset=utf8", "user", "password");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

// 검색어 받기
$search_normalized = $_GET['query'];

// SQL 준비 및 실행 (프리페어드 스테이트먼트 사용)
$stmt = $pdo->prepare("SELECT * FROM posts WHERE MATCH(wr_subject) AGAINST(:search IN BOOLEAN MODE)");
$stmt->bindValue(":search", $search_normalized);
$stmt->execute();

// 결과 출력
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
    echo "<p>" . htmlspecialchars($row['wr_subject']) . "</p>";
}

?>[/code]✅ bindValue()를 사용하여 SQL Injection 방지
✅ PDO로 보안성과 유지보수성을 향상

📌 5️⃣ FULLTEXT 검색 최적화 팁
1️⃣ 3자 이하 검색어가 안될 경우 (ft_min_word_len)[code]ft_min_word_len = 3[/code]→ my.cnf 파일을 수정 후, 인덱스 재생성[code]REPAIR TABLE posts QUICK;[/code]2️⃣ 불용어(Stopwords) 문제 해결

기본적으로 MySQL은 일반적인 단어들(예: "the", "is")을 무시함.
IN BOOLEAN MODE를 사용하면 불용어 적용을 우회 가능.

📌 최종 정리
✅ FULLTEXT 인덱스 적용
✅ MATCH() AGAINST() 활용
✅ IN BOOLEAN MODE로 강력한 검색
✅ real_escape_string() 또는 PDO로 SQL Injection 방지

이제 FULLTEXT 검색을 안전하고 최적화된 방식으로 구현할 수 있습니다!

댓글목록

등록된 댓글이 없습니다.


🔍 검색

회사소개 개인정보처리방침 서비스이용약관
Copyright © rainbowgarden.shop All rights reserved.