Search
Duplicate
5️⃣

전문 검색 인덱스

일반적인 인덱스와는 달리 문서의 전체 내용을 인덱스화해서 특정 키워드가 포함된 문서를 검색하는 전문 검색에는 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 절의 괄호 안에 모두 명시되어야 한다.