티스토리 뷰
일반적으로 DB에서 특정 단어가 포함된 레코드를 찾기 위해서 LIKE 를 주로 사용한다.
그러나 LIKE는 '%단어%'와 같이 사용할 때, 인덱스를 사용하지 않기 때문에 속도가 느려진다.
또한 LIKE를 여러 필드 (예를 들어, title과 keyword 등)에 동시에 적용하면서 여러 단어를 검색어로 전달하면 쿼리가 복잡해지기도 한다.
> select * from board
> where (title like '%학교%' or body like '%학교%')
> and (title like '%취업%' or body like '%취업%');
이를 대체하기 위해서 정규표현식을 적용할 수도 있다.
그러나 정규표현식도 마찬가지로 인덱스를 거치지 않고 풀 스캔(Full Scan)이 일어나기 때문에 느리다.
> select * from board
> where (title REGEXP '학교' or body REGEXP '학교')
> and (title REGEXP '취업' or body REGEXP '취업');
Match ~ Against 를 활용한 전문 검색 (Full-Text Search)
이런 경우, 활용할 수 있는 것이 바로 MySQL의 전문 검색(Full-Text Search)이다.
위 예제는 다음과 같이 간단하게 쿼리할 수 있다.
> select * from board
> where match(title,body) against('+학교* +취업*' in boolean mode);
title과 body에 학교와 취업이 모두 포함된 레코드를 리턴해 주는 것이다.
+는 AND를 나타내고 -는 OR를 나타내므로, 더 많은 결과를 원할 경우, '+학교* - 취업*' 형태로 사용할 수도 있다.
MySQL의 Full-Text Search는 자연어 처리 모드도 제공하고 있다.
그래서 다음과 같은 쿼리도 가능하다.
> select * from board
> where match(title,body) against('대학생 취업 문제는 무엇일까요?')
Match ~ Against 활용을 위한 설정
Full-Text Search를 위해서 테이블 생성시나 alter table로 전문 검색할 필드를 지정해 줘야 한다.
crate table board (
id int not null primary key,
title varchar(200),
body text,
fulltext (title,body));
그리고 full-text search는 mysql 버전 5.5 이하는 MyISAM에서만 사용할 수 있다.
5.6 이상 버전은 InnoDB에서도 사용할 수 있다.
마지막으로 match against를 사용할 때, 처음에는 위와 같은 2글자 검색에 대한 결과는 나오지 않는다.
기본적으로 full-text search가 4글자 이상에서만 검색되도록 설정되어 있기 때문이다.
한글에서는 두글자 검색도 자주 일어나므로 위 설정을 2로 변경해야 보다 의미가 있다.
다음 명령어로 확인해 보자.
> show variables like 'ft_min_word_len';
이 값을 수정하기 위해서는 my.ini(윈도우), my.cnf(리눅스) 파일을 수정해야 한다.
[mysqld]
ft_min_word_len = 2
설정 파일을 수정한 후, mysql 서버를 재시작하고 ft_min_word_len 값을 확인하면 2로 수정되었을 것이다.
이상으로 mysql의 전문 검색 기능을 살펴봤다.
속도 측면에서는 분명히 장점이 있는 듯하다.
그리고 자연어 처리가 되는 것으로 봐서 내부적으로 형태소 분석이 포함되어 있는 것 같다.
다만 검색 품질이 얼마나 괜찮은지는 좀 더 테스트를 해봐야 할 것으로 보인다.
'프로그래밍 > MySQL' 카테고리의 다른 글
MAC에서 MySQL 삭제하기 (0) | 2015.05.07 |
---|---|
MySQL Workbench에서 safe mode 처리 (0) | 2012.09.21 |
MySQL에서 HINT를 사용해서 인덱스를 활용하기 (실행계획 explain 설명도 함께~) (0) | 2011.11.23 |
MySQL 세팅 정보 확인 명령어 (0) | 2011.11.21 |
MySQL 쿼리를 활용해 지도 위치간 거리 계산하기 (0) | 2011.11.08 |