전문검색 - MySQL 의 Full Text Search(이하 FTS)
- LIKE같은 패턴 검색은 인덱스를 사용하지 못함
- 또한 LIKE를 여러 필드 (예를 들어, title과 keyword 등)에 동시에 적용하면서 여러 단어를 검색어로 전달하면 쿼리가 복잡해지기도 한다.
- 정규표현식도 마찬가지로 인덱스를 거치지 않고 풀 스캔(Full Scan)이 일어나기 때문에 느리다.
- 이런 전문 검색은 일부만 검색하는 경우에도 전용 인덱스를 사용하기 때문에 빠른 검색이 가능
FULLTEXT 검색 방식
- **자연어 검색(natural search)**검색 문자열을 단어 단위로 분리한 후, 해당 단어 중 하나라도 포함되는 행을 찾는다.
- **불린 모드 검색(boolean mode search)**검색 문자열을 단어 단위로 분리한 후, 해당 단어가 포함되는 행을 찾는 규칙을 추가적으로 적용하여 해당 규칙에 매칭되는 행을 찾는다.
- **쿼리 확장 검색(query extension search)**2단계에 걸쳐서 검색을 수행한다. 첫 단계에서는 자연어 검색을 수행한 후, 첫 번째 검색의 결과에 매칭된 행을 기반으로 검색 문자열을 재구성하여 두 번째 검색을 수행한다. 이는 1단계 검색에서 사용한 단어와 연관성이 있는 단어가 1단계 검색에 매칭된 결과에 나타난다는 가정을 전제로 한다.
FULLTEXT 인덱스 생성 주의점
- FULLTEXT 검색을 하려는 컬럼에 대해 FULLTEXT 인덱스를 생성해야 한다.
- FULLTEXT 인덱스는 MyISAM 엔진을 사용하는 테이블에 대해서만 생성할 수 있다. 또한 컬럼 데이터 타입은 반드시 Text, Binary Char, Varchar 타입을 가져야 한다. 또한 한글 데이터를 검색하려면 테이블 인코딩으로 utf8을 사용해야 한다.
- FULL TEXT 인덱스는 테이블을 생성할 때 생성할 수도 있고, 또는 이미 만들어진 테이블에 대해서도 인덱스를 생성할 수 있다.
- FULLTEXT 검색 엔진 설정을 해줘야 한다.
Match ~ Against 를 활용한 전문 검색 (Full-Text Search)
- MySQL의 Full-Text Search는 자연어 처리 모드도 제공하고 있다.
# 자연어 검색
select B.title, B.description,
match(gtitle, gdesc) against('코딩') as score
from board B
where match(gtitle, gdesc) against('코딩')
limit 10;
# 불린 모드
select * from board
where match(title,body) against('+학교* +취업*' in boolean mode);
'책 > real mysql' 카테고리의 다른 글
11장 스토어드 프로그램 (0) | 2022.01.23 |
---|---|
10장 파티션 (0) | 2022.01.23 |
쿼리 작성 및 최적화 (3) (0) | 2022.01.12 |
쿼리 작성 및 최적화 (2) (0) | 2022.01.12 |
쿼리 작성 및 최적화 (1) (0) | 2022.01.12 |