<aside> 💡
풀 텍스트 인덱스는 긴 문자의 텍스트 데이터를 빠르게 검색하기 위한 MySQL의 부가적인 기능이다.
</aside>
SELECT * FROM FulltextTbl WHERE description LIKE '%남자%';
-- 중간에 남자 들어간 글 검색
이렇게 조회하면 아무 문제가 없을 것 같지만 만약에 글에 갯수가 500만개라고 하면 엄청나게 오래 거릴 것이다. full-scan이기 때문이다.
위 문제를 해결하기 위해서 나온 텍스트 전용 인덱스이다.
full-text index는 역인덱스(Inverted Index)를 사용한다. 예시로 우리는 책을 읽을 때 맨 뒷 페이지에 색인이라는 페이지에서 어떤 단어가 어디에 있는지 확인할 수 있다.
비슷하게 full-text index에서는 어떤 문자열이 들어오면 그 값이 어디에서 사용되어있는지 확인하는 것이다

위와 같이 index는 저장된다. 단어별로 쪼개서 저장하는 것이다. 여기서 stopword는 띄워쓰기나 tab처럼 단어를 쪼개는 단어이다.
하지만 여기서 문제점은 이 방식은 영어라는 것이다. 한국어는 방식이 좀 다르다. 한 단어 기준으로 하면 여러가지 제약이 생긴다. ‘이한’을 검색하면 ‘이한샘’은 나오지 않는 것처럼 말이다. 이걸 해결하기 위해서 DB에서는 n-gram parser를 이용해서 몇 글자로 쪼갤지 정할 수 있도록 해준다. 한국어는 기본적으로 2글자를 권장한다. 만약에 2글자로 바꾸었다면 ‘가성비 노트북’은 [’가성’, ‘성비’, ‘비 ’, ’ 노’, ’노트’, ’트북’ ] 이런식으로 값이 저장된다.
사용자가 ‘가성비’라고 조회한다면? [’가성’, ‘성비’] 라고 생기며 체인처럼 하나씩 보는 것이다. 가성→ 성비 이런식으로 말이다. 그렇게 값을 찾는 방식이다.
SELECT * FROM newspaper WHERE MATCH(article) AGAINST('영화');
full-text index는 where절에 MATCH(), AGAINST()와 같은 특수한 메서드를 사용해야한다.
그러나 ‘영화’ 라는 정확한 단어만 검색되며 ‘영화는’, ‘영화가’ .. 등 능동적인 검색은 불가능하다.
불린 모드 검색은 위와 같은 문제를 해결하기 위해 나온 것이다. 아래 표처럼 연산자를 사용하여 유연한 검색이 가능하도록 만든 것이다.
| 연산자 | 문법 예시 | 설명 | 검색 결과 특징 |
|---|---|---|---|
+ |
|||
| (필수) | AGAINST('영화 +액션' IN BOOLEAN MODE) |
뒤에 오는 키워드가 무조건 포함되어야 합니다. (AND 연산) | '영화'를 찾되, 반드시 '액션'이 들어가 있는 데이터만 반환 |
- |
|||
| (제외) | AGAINST('영화 -액션' IN BOOLEAN MODE) |
뒤에 오는 키워드가 절대로 포함되면 안 됩니다. (NOT 연산) | '영화'를 찾되, '액션'은 안 들어가 있는 데이터만 반환 |
~ |
|||
| (부정) | AGAINST('영화 ~액션' IN BOOLEAN MODE) |
키워드를 제외하진 않지만, 해당 단어가 있으면 연관도 점수를 깎습니다. | '영화'를 찾되, '액션'이 포함된 데이터는 검색 결과 아래 순위로 밀려남 |
* |
|||
| (와일드카드) | AGAINST('영화*' IN BOOLEAN MODE) |
키워드로 시작하는 모든 단어를 찾습니다. (전방 일치 검색) | '영화를', '영화가', '영화는' 등 '영화'로 시작하는 복합어 모두 포함 |
"" |
|||
| (구문 검색) | AGAINST('"재밌는 영화"' IN BOOLEAN MODE) |
따옴표 안의 문장과 **정확히 일치하는 철자와 순서(Position)**만 찾습니다. | '재밌는 영화', '재밌는 영화가'는 가능 |
| 중간에 글자가 낀 '재밌는 한국 영화'는 불가 |