✅ FULLTEXT INDEX란
// 해당 구문은 내부에 저장된 역색인(Inverted Index) 활용하여 대용량 텍스트에서도 빠르게 단어 포함 여부 판별
MATCH(content) AGAINST('커피' IN BOOLEAN MODE)
- 일반 인덱스(B-Tree, Hash)와 달리 문자열 내부의 단어 단위로 색인을 생성
- 즉
‘%keyword%’가 아닌 문서 검색 방식(FTS - FullTextSearch)으로 동작
✅ 기본 구조(Inverted Index - 역색인)
"커피" -> [id=1, id=5, id=9]
"원두" -> [id=1, id=4, id=7]
- 일반 인덱스는
column → row 매핑이지만 FULLTEXT INDEX는 단어 → 포함된 row들로 색인
✅ FULLTEXT INDEX를 사용 목적
| 목적 |
설명 |
LIKE '%keyword%' 대체 |
텍스트 컬럼 내 부분 일치 검색을 인덱스로 처리 |
| 전문 검색 |
기사, 리뷰, 게시글 등 긴 문서 검색 |
| 검색어 랭킹, 추천, 점수 기반 정렬 |
MATCH ... AGAINST 결과 점수 활용 가능 |
- 결과적으로 텍스트 검색을 위한 최소비용의 대안으로 평가됨
- 즉, 별도 검색 서버 없이도 검색 서버 역할 일부 수행 가능
✅ 검색 모드
| 모드 |
문법 |
특징 |
| Natural Language Mode |
AGAINST('커피') |
자동 점수 계산, 불용어 무시 |
| Boolean Mode |
AGAINST('커피 -라떼 +원두' IN BOOLEAN MODE) |
논리 연산 지원 (+, -, "...", *) |
| With Query Expansion |
AGAINST('커피' WITH QUERY EXPANSION) |
관련어 확장 검색 (실무에서 잘 안 씀) |
- 대부분
BOOLEAN MODE를 사용 → 제어 가능성이 높고, 검색 품질을 직접 튜닝하기 좋음
✅ 인덱스 구성 시 주의점
ALTER TABLE snaps
ADD FULLTEXT INDEX idx_snaps_content (content) WITH PARSER ngram;
- 한국어는 공백으로 단어 구분이 어려워
WITH PARSER ngram 필수
✅ 검색 동작 규칙
| 설정 항목 |
기본값 |
설명 |
innodb_ft_min_token_size |
2 |
최소 단어 길이 (한글 1글자는 인덱스 안 됨) |
ft_stopword_file |
stopword.txt |
불용어 목록 (검색 제외 단어) |
innodb_ft_enable_stopword |
ON |
불용어 무시 기능 활성화 |
- 따라서 1글자 단어 검색을 위해서는
innodb_ft_min_token_size=1로 조정 후 인덱스 재생성 필요