MySQL의 B-Tree인덱스는 실제 칼럼의 값이 1MB더라도 전체를 다 사용하는게 아니라 3072바이트(InnoDB의 로우 포맷에 따라 다르지만, 일반적으로 그렇다)까지만 잘라내서 인덱스 키로 사용한다.

그러나 문서 내용 전체를 인덱스화해서 특정 키워드가 포함된 문서를 검색하는 전문 검색(Full Text)에는 일반적인 용도의 B-Tree인덱스는 별 도움이 안된다.

인덱스 알고리즘

전문 검색에서는 문서 본문의 내용에서 사용자가 검색하게 될 키워드(ES의 Term)를 분석해내고, 이러한 키워드로 인덱스를 구축한다.

키워드를 인덱싱하는 기법에 따라 단어의 어근 분석, 또는 n-gram 분석 알고리즘으로 구분할 수 있다. 예전에는 구분자 기반으로 term을 뽑아내는 것도 하나의 인덱싱 알고리즘으로 여겨졌지만, MySQL 8.0부터는 어근 분석과 n-gram 알고리즘에 포함되기 때문에 별도로 언급하지는 않겠음.

어근분석 알고리즘

MySQL의 전문검색 인덱스는 다음의 두 가지 과정을 거쳐 색인 작업을 수행한다.

불용어는 검색에서 별 가치가 없는 단어를 필터링 해서 제거하는 작업을 의미한다. 불용어의 개수는 많지 않기 때문에 알고리즘을 구현한 코드에 모두 상수로 정의해서 사용하는 경우가 많고, 유연성을 위해 불용어 자체를 DB화해서 사용할 수 있도록 구현하기도 한다. 현재 MySQL 서버는 사용자가 별도로 불용어를 정의할 수 있는 기능을 제공한다.

어근 분석은 검색어로 선정된 단어의 원형을 찾는 작업이다. MySQL서버에서는 오픈소스 형태소 분석 라이브러리인 MeCab을 플러그인 형태로 사용할 수 있게 지원한다.

한글이나 일본어의 경우에는 사실 어근 분석보다, 문장의 형태소를 분석해서 명사와 조사를 구분하는 기능이 더 중요한 편이다. 사실 MeCab은 일본어를 위한 형태소 분석 프로그램이고, 서구권 언어를 위한 형태소 분석기는 MongoDB에서 사용되는 SnowBall이라는 오픈소스가 있다. 한국어는 일본어와 많이 비슷하기 때문에 MeCab을 이용해 한글 분석이 가능하다.

MeCab가 제대로 동작하려면 단어 사전이 필요하고, 문장의 품사를 식별할 수 있는 문장 구조 인식이 필요하다. 이를 위해선 실제 언어 샘플을 위해 언어를 학습하는 과정이 필요하고 상당히 시간이 필요한 작업임.

n-gram 알고리즘

MeCab를 이용한 형태소 분석은 만족할만한 결과를 내기 위해 많은 시간과 노력이 필요하다. 하지만 전문적인 검색 엔진을 만드는게 아니라면 범용적으로 사용할만한 알고리즘이 있다. 형태소 분석이 문장을 이해하는 알고리즘이라면, n-gram은 단순히 키워드를 검색해내기 위한 인덱싱 알고리즘이다.

이 알고리즘은 본문을 무조건 정해진 몇 글자씩 잘라서 인덱싱 한다. n-gram에서 n이 인덱싱할 키워드의 최소 글자수를 의미함. 일반적으로는 2-gram을 사용한다.

전문 검색 인덱스의 가용성

전문 검색 인덱스를 사용하려면 다음 두 조건을 반드시 갖춰야 한다.