MySQL의 B-Tree 인덱스는 실제 컬럼의 값이 1MB라 하더라도 1MB 전체의 값을 인덱스로 사용하는 것이 아니라, 1,000바이트(MyISAM) 또는 767바이트(InnoDB)까지만 잘라서 인덱스 키로 사용한다. 또하나 B-Tree 인덱스의 특성에서도 알아봤듯이 전체 일치 또는 좌측 일부 일치와 같은 검색만 가능하다.

문서의 내용 전체를 인덱스화해서 특정 키워드가 포함된 문서를 검색하는 전문검색에는 InooDB나 MyISAM 스토리지 엔진에서 제공하는 일반적인 용도의 B-Tree 인덱스를 사용할 수 없다. 문서 전체에 대한 분석과 검색을 위한 이러한 인덱싱 알고리즘이라 함. 전문 검색 인덱스는 일반화된 기능의 명칭이지 전문 검색 알고리즘의 이름을 지칭하는 것은 아니다. 전문 검색 인덱스에는 문서의 키워드의 분석 및 인덱스 구축에는 여러가지 방법이 있을수 있다.

구분자(stopword) 기법

전문의 내용을 공백이나 탭(띄어쓰기) 또는 마침표와 같은 문장 기호, 그리고 사용자가 정의한 문자열을 구분자로 등록한다. 구분자 기법은 이처럼 등록된 구분자를 이용해 키워드를 분석해내고, 결과 단어를 인덱스로 생성해두고 검색에 이용하는 방법을 말한다. MySQL의 내장 전문 검색 엔진은 구분자 방식만으로 인덱싱할 수 있다.

구분자 기법은 문서의 본문으로부터 키워드를 추출해 내는 작업이 추가로 필요할 뿐, 내부적으로는 B-Tree 인덱스를 그대로 사용한다. 전문 검색 인덱스의 많은 부분은 B-tree 의 특성을 따르지만 전문 검색 엔진을 통해 조회되는 레코드는 검색어나 본문 내용으로 정렬되어 조회되지는 않는다. 전문 검색에서 결과의 정렬은 일치율이 높은 순으로 출력되는 것이 일반적이다.

N-Gram 기법

하지만 각 국가의 언어는 띄어쓰기가 전혀 없다거나 문장 기호가 전혀 다른 경우가 허다하다. 이런 다양한 언어에 대해 하나의 규칙을 적용해 키워드를 추출해내기란 쉽지 않다. 또한 구분자 방식은 추출된 키워드의 일부(키워드의 뒷부분)만 검색하는 것은 불가능하다는 단점도 있다.

N-그램이란 본문을 무조건적으로 몇글자씩 잘라서 인덱싱하는 방법이다. 구분자에 의한 방법보다는 인덱싱 알고리즘이 복잡하고, 만들어진 인덱스의 크기도 상당히 큰 편이다. 트리톤이나 스핑크스에서는 다른 인덱싱 방법도 제공하지만, 이 알고리즘이 주로 사용된다.

N-그램에서 n은 인덱싱할 키워드의 최소 글자(또는 바이트) 수를 의미하는데, 일반적으로 2글자 단위로 키워드를 쪼개서 인덱싱하는 2-Gram(or Bi-Gram)방식이 많이 사용된다. 여기서도 2글자 키워드 방식의 2-Gram 위주로 알아보곘다.

2-Gram 인덱싱 기법은 2글자 단위의 최소 키워드에 대한 키를 관리하는 프론트엔트 인덱스와 2글자 이상의 키워드 묶음을 관리하는 백엔드 인덱스 2개로 구성된다. 인덱스의 생성 과정은 아래와 같이 , 2가지 단계로 나눠서 처리된다.