•
일반적인 인덱스와는 달리 문서의 전체 내용을 인덱스화해서 특정 키워드가 포함된 문서를 검색하는 전문 검색에는 B-Tree 인덱스를 사용할 수 없다.
1. 인덱스 알고리즘
•
전문 검색에서는 문서 본문의 내용에서 사용자가 검색하게 될 키워드를 분석해 내고 빠른 검색용으로 사용할 수 있게 인덱스를 구축함
•
키워드를 인덱싱하는 방법에 따라 어근 분석과 n-gram 분석 알고리즘으로 분류할 수 있음
1.
어근 분석 알고리즘
•
MySQL 서버의 전문 검색 인덱스는 다음의 두 가지 과정을 거쳐서 색인 작업이 수행된다.
◦
불용어 처리
⇒ 검색에서 별 가치가 없는 단어들을 필터링하여 제거하는 작업, 유연성을 위해 사용자가 추가, 삭제할 수 있게끔 구현하는 경우도 정의되어 있다.
◦
어근 분석
⇒ 검색어로 선정된 단어의 뿌리인 원형을 찾는 작업, MeCab을 플러그인 형태로 사용할 수 있으므로 해당 형태소 분석 라이브러리를 사용한다. MeCab은 일본어를 위한 형태소 분석기로 서구권 언어는 Snowball이라는 오픈소스를 주로 사용한다.
2.
n-gram 알고리즘
•
형태소 분석이 문장을 이해하는 알고리즘이라면 n-gram은 단순히 키워드를 검색해내기 위한 인덱싱 알고리즘이라고 할 수 있다.
•
본문을 무조건 몇 글자씩 잘라서 인덱싱하는 방법으로 형태소 분석보단 알고리즘이 단순하고 이해와 준비 작업이 덜 한 반면 만들어진 인덱스의 크기가 크다.
◦
일반적으로 2글자 단위로 키워드를 쪼개서 인덱싱하는 2-gram 방식이 많이 사용
3.
불용어 변경 및 삭제
•
앞서 살펴본 n-gram의 토픈 파싱 및 불용어 처리 예시에서 ‘ti’, ‘at’, ‘ha’와 같은 토큰들은 a, i 철자가 불용어로 등록되어 있으므로 버려진다.
◦
실제로 이처럼 불용어 처리는 사용자에게 도움이 되기보다 더 혼란스럽게하는 기능일 수 있다. 일반적으로는 처리 자체를 무시하거나 직접 등록을 권함
•
전문 검색 인덱스의 불용어 처리 무시
◦
불용어 처리를 무시하는 방법은 2가지가 존재
1.
스토리지 엔진에 관계없이 MySQL 서버의 모든 전문 검색 인덱스에 대해 불용어를 완전히 제거하는 것
2.
InnoDB 스토리지 엔진을 사용하는 테이블의 전문 검색 인덱스에 대해서만 불용어 처리를 무시하는 것
•
사용자 정의 불용어 사용
◦
사용자 정의 불용어를 사용하는 방법은 2가지가 존재
1.
불용어 목록을 파일로 저장하고 이를 MySQL 서버 설정 파일에서 경로 지정
2.
InnoDB 스토리지 엔진을 사용하는 테이블의 전문 검색 엔진에서만 사용할 수 있는 불용어의 목록을 ‘테이블’로 저장하는 방식
2. 전문 검색 인덱스의 가용성
•
전문 검색 인덱스를 사용하려면 다음 두 가지 조건을 갖춰야 한다.
◦
쿼리 문장이 전문 검색을 위한 문법을 사용
◦
테이블이 전문 검색 대상 칼럼에 대해서 전문 인덱스 보유
CREATE TABLE tb_test {
doc_id INT,
doc_body TEXT,
PRIMARY KEY (doc_id),
FULLTEXT KEY fx_docbody (doc_body) WITH PARSER ngram
) ENGINE = InnoDB;
SQL
복사
•
위와 같은 테이블을 만들었다고 했을 때
•
전문 검색 인덱스를 사용하지 않는 쿼리
SELECT * FROM tb_test WHERE doc_body LIKE '%애플%';
SQL
복사
•
전문 인덱스 검색을 사용하는 쿼리
SELECT * FROM tb_test
WHERE MATCH(doc_body) AGAINST('애플' IN BOOLEAN MODE);
SQL
복사
◦
전문 검색 인덱스를 사용하려면 반드시 다음 예제와 같이 MATCH (…) AGAINST (…) 구문으로 검색 쿼리를 작성해야 하며 전문 검색 인덱스를 구성하는 컬럼들은 MATCH 절의 괄호 안에 모두 명시되어야 한다.