형태소분석기를 만들어 FullText 서치에 응용할 수 있다.

하지만 아직 형태소분석기의 기능 및 성능이 좋지 않은 것이 문제.

형태소분석을 필요로 하지 않는 간단한 Fulltext 검색을 위한 인덱서의 도입이 필요

Tokenizer

문장을 각 token으로 분리해야 한다. 한글의 경우는 조사를 분리해야 하기때문에 형태소분석기가 필요하지만, 형태소분석기 없이도 다음과 같은 방식으로 검색효율을 높일 수 있다.

문장 분리

영문에 대해서는 공백 혹은 부호를 경계로 문장을 잘라낸다.
많은이들은 영화를 보고 감동하지만 =>

많은이들은
영화를
보고
감동하지만

이것은 tokenizer의 가장 기본적인 단계이다. 매우 간단하며 빠른 단계이다.하지만 이 단계만으로는 한글의 조사처리가 되어있지 않은 상태라서 직접적인 검색에 대한 결과는 좋지 않게 된다.

즉, 검색어 영화를 입력하더라도 조사처리되지 않은 영화를은 찾지 못한다.


조사처리

한글의 경우 tokenizer에서 간단한 형태소분석 및 조사처리를 해야 검색이 제대로 이루어 질 수 있다.그러나 다음과 같은 가짜 조사처리 방식으로도 검색효율을 높일 수 있다.

많은이들은 영화를 보고 감동하지만 =>

많은이들은 => 많+많은+많은이+많은이들+많은이들은
영화를 => 영+영화+영화를
보고 => 보+보고
감동하지만 => 감+감동+감동하+감동하지+감동하지만

간단한 테스트해보니 인덱싱 파일의 크기가 약 3배까지 늘어나게 되지만, 검색효율은 훨씬 좋아지게 된다.

phpschool에서 서치해보니 이와 같은 방식을 이미 사용하고 있는 곳이 있었다.

그러나 이 방식을 사용하더라도 제대로 된 형태소 분석기를 통해 잘 분리된 인덱스가 아닌 경우에는 "감동받은영화"와 같이 띄어쓰기가 제대로 되지 않은 문장에서 영화를 검색하지 못한다.

preg_match*()

결국 제대로 조사처리되지 않은 인덱스에서 제대로 된 결과를 얻으려면 preg_match*()를 같이 사용할 수 밖에 없다.여기서 문제는 어떻게 해야 좀 더 효율적으로 preg_match*()를 수행할 수 있냐는 것이다.
  1. 모든 분리된 문장에 대해서 preg_match*() 검사
  2. 각 문장을 길이별로 분류해서 별도의 파일로 저장하여 단번에 preg_match_all() 검사

첫번째 방법은 매우 느리지만, 원하는 결과를 얻어내었다. 그래서 preg_match_all()을 사용하여 단 한번에 검사할 수 있도록, 인덱싱된 최소단위의 문장(혹은 단어)을 길이단위로 하나의 파일로 저장(혹은 하나의 key로 DB에 저장)하여 preg_match_all()을 수행해보니 훨씬 빠른 속도로 검색하는 것을 알게되었다.

dokuwiki의 방식

dokuwiki에서는 한글 및 동양권의 문자를 모두 낱자로 분리시켜 인덱싱하고있었다.

따라서 영화를 검색하게 되면 + 를 검색하게 된다.

이 경우 인덱싱 파일의 크기가 상당히 작은 장점이 있으나, 페이지의 개수가 많아질수록 검색속도가 꽤 느려지는 단점이 있으며,재발을 찾는 경우에 랄도 찾게 되므로 별도의 방법을 함께 써야 한다.

http://moniwiki.kldp.net/wiki.php/FullTextIndexer?action=show&redirect=FullText
http://opencode.co.kr/bbs/board.php?bo_table=mysql_tips&wr_id=65