MySQL FULLTEXT 검색
컨텐츠 정보
- 22,140 조회
- 0 추천
- 목록
본문
MySQL은 % 연산자를 사용하여 패턴연산을 하는 대신, 단어 또는 구문에 대한 검색을 지원하며 FULLTEXT 검색이라고 부른다. MySQL은 3가지 종류의 FULLTEXT 검색 방식을 지원한다.
FULLTEXT 검색 방식
- 자연어 검색
검색 문자열을 단어 단위로 분리한 후, 해당 단어 중 하나라도 포함되는 행을 찾는다. - 불린 모드 검색
검색 문자열을 단어 단위로 분리한 후, 해당 단어가 포함되는 행을 찾는 규칙을 추가적으로 사용할 수 있다. - 쿼리 확장 검색
2단계에 걸쳐서 검색을 수행한다. 첫 단계에서는 자연어 검색을 수행한 후, 첫 번쨰 검색의 결과에 매칭된 행을 기반으로 검색 문자열을 재구성하여 두 번째 검색을 수행한다. 이는 1단계 검색에서 사용한 단어와 연관성이 있는 단어가 1단계 검색에 매칭된 결과에 나타난다는 가정을 전제로 한다.
보는 바와 같이 검색의 정확도(score)에 따라 내림차순 정렬되어 결과가 표시됨을 알 수 있다. 물론 1단어뿐만 아니라 여러 단어로도 검색이 가능하다.
select P.gtitle, P.gdesc, match(gtitle, gdesc) against('귀여운 로고') as score from posts P where match(gtitle, gdesc) against('귀여운 로고') limit 10;
자연어 검색은 구문을 단어 단위로 분할한 후, 해당 단어 중 1개라도 포함된 행을 검색한다. 따라서 6번째 결과와 같이 "예쁜 팔찌 만들어"와 같이 관련성이 낮은 게시글도 검색되게 된다.
불린 모드 검색
이제 불린 모드 검색을 이용하여 자연어 검색에서 부딪혔던 문제를 완화해 보자. 불린 검색이 자연어 검색와 크게 차이나는 점은
- 검색의 정확도에 따라 결과가 정렬되지 않는다.
- 구문 검색이 가능하다
- 필수(+), 예외(-), 부분(*) 연산자를 사용할 수 있다
등이다.
앞서 "귀여운 로고"를 단어 검색이 아닌 구문 검색, 즉 "귀여운 로고"가 그대로 포함된 게시글을 검색하고자 한다면,
select P.gtitle, P.gdesc from posts P where match(gtitle, gdesc) against('"귀여운 로고"' in boolean mode);
구문을 쌍따옴펴(" ")로 묶은 후, 불린 모드(boolean mode)로 검색을 실행한다.
만약 맨 마지막의 여행영상 게시글은 검색에서 제외하려면 예외 연산자(-)를 사용할 수 있다.
select P.gtitle, P.gdesc from posts P where match(gtitle, gdesc) against('"귀여운 로고" -여행영상' in boolean mode);
이제 부분 연산자(*)를 살펴보자. 앞서 자연어 검색 첫 번째 예제에서 "로고"를 검색한 결과를 보면, 모두 "로고" 단어가 독립적으로 존재한다. 다시 말해 "로고를", "로고와" 등과 같은 단어는 검색되지 않는다. 이처럼 한글에서 형태소를 잘라야만 제대로 인덱스가 구성되지만 쉬운일이 아니다. 따라서 검색할 때 "로고로 시작하는 모든 단어"와 같은 패턴을 사용할 수 있다. 명확한 예를 위해 게시글 제목(gtitle)에 대해서만 FULLTEXT 검색을 실행해 보자. 먼저 자연어 검색은 다음과 같다.
select P.id, P.gtitle from posts P where match(gtitle) against('로고를') limit 10;
위와 같이 검색하면
와 같이 "로고를"이 포함된 행이 매칭된다. 하지만 자연어 검색에서 아래와 같이 '로고'를 사용하면 해당 행이 검색되지 않는다.
select P.id, P.gtitle from posts P where match(gtitle) against('로고') and id = 911 limit 10;
그러나 불린 검색을 이용하여 부분 검색 연산자를 사용하면 검색이 가능하다.
select P.id as id, P.gtitle from posts P where match(gtitle) against('로고*' in boolean mode) and id = 911 limit 10;
[참고자료]
관련자료
-
링크