<aside> 💡

풀 텍스트 인덱스는 긴 문자의 텍스트 데이터를 빠르게 검색하기 위한 MySQL의 부가적인 기능이다.

</aside>

SELECT * FROM FulltextTbl WHERE description LIKE '%남자%';
-- 중간에 남자 들어간 글 검색

이렇게 조회하면 아무 문제가 없을 것 같지만 만약에 글에 갯수가 500만개라고 하면 엄청나게 오래 거릴 것이다. full-scan이기 때문이다.

full-text index

위 문제를 해결하기 위해서 나온 텍스트 전용 인덱스이다.

동작원리

full-text index는 역인덱스(Inverted Index)를 사용한다. 예시로 우리는 책을 읽을 때 맨 뒷 페이지에 색인이라는 페이지에서 어떤 단어가 어디에 있는지 확인할 수 있다.

비슷하게 full-text index에서는 어떤 문자열이 들어오면 그 값이 어디에서 사용되어있는지 확인하는 것이다

image.png

위와 같이 index는 저장된다. 단어별로 쪼개서 저장하는 것이다. 여기서 stopword는 띄워쓰기나 tab처럼 단어를 쪼개는 단어이다.

하지만 여기서 문제점은 이 방식은 영어라는 것이다. 한국어는 방식이 좀 다르다. 한 단어 기준으로 하면 여러가지 제약이 생긴다. ‘이한’을 검색하면 ‘이한샘’은 나오지 않는 것처럼 말이다. 이걸 해결하기 위해서 DB에서는 n-gram parser를 이용해서 몇 글자로 쪼갤지 정할 수 있도록 해준다. 한국어는 기본적으로 2글자를 권장한다. 만약에 2글자로 바꾸었다면 ‘가성비 노트북’은 [’가성’, ‘성비’, ‘비 ’, ’ 노’, ’노트’, ’트북’ ] 이런식으로 값이 저장된다.

사용자가 ‘가성비’라고 조회한다면? [’가성’, ‘성비’] 라고 생기며 체인처럼 하나씩 보는 것이다. 가성→ 성비 이런식으로 말이다. 그렇게 값을 찾는 방식이다.

사용방법

SELECT * FROM newspaper WHERE MATCH(article) AGAINST('영화');

full-text index는 where절에 MATCH(), AGAINST()와 같은 특수한 메서드를 사용해야한다.

그러나 ‘영화’ 라는 정확한 단어만 검색되며 ‘영화는’, ‘영화가’ .. 등 능동적인 검색은 불가능하다.

불린 모드(BOOLEAN MODE) 검색

불린 모드 검색은 위와 같은 문제를 해결하기 위해 나온 것이다. 아래 표처럼 연산자를 사용하여 유연한 검색이 가능하도록 만든 것이다.

연산자 문법 예시 설명 검색 결과 특징
+
(필수) AGAINST('영화 +액션' IN BOOLEAN MODE) 뒤에 오는 키워드가 무조건 포함되어야 합니다. (AND 연산) '영화'를 찾되, 반드시 '액션'이 들어가 있는 데이터만 반환
-
(제외) AGAINST('영화 -액션' IN BOOLEAN MODE) 뒤에 오는 키워드가 절대로 포함되면 안 됩니다. (NOT 연산) '영화'를 찾되, '액션'은 안 들어가 있는 데이터만 반환
~
(부정) AGAINST('영화 ~액션' IN BOOLEAN MODE) 키워드를 제외하진 않지만, 해당 단어가 있으면 연관도 점수를 깎습니다. '영화'를 찾되, '액션'이 포함된 데이터는 검색 결과 아래 순위로 밀려남
*
(와일드카드) AGAINST('영화*' IN BOOLEAN MODE) 키워드로 시작하는 모든 단어를 찾습니다. (전방 일치 검색) '영화를', '영화가', '영화는' 등 '영화'로 시작하는 복합어 모두 포함
""
(구문 검색) AGAINST('"재밌는 영화"' IN BOOLEAN MODE) 따옴표 안의 문장과 **정확히 일치하는 철자와 순서(Position)**만 찾습니다. '재밌는 영화', '재밌는 영화가'는 가능
중간에 글자가 낀 '재밌는 한국 영화'는 불가

검색 단어 제한