검색 방식
- 자연어 검색
자연어 검색이란, 문자 그대로 검색어를 일반적으로 인간이 사용하는 문장이나 절로(자연스러운 문장의 구문) 가정하여 그대로 Matching해서 검색을 실행하는 방법을 의미한다. 별도의 연산자를 사용할 수 없으며, StopWord 가 적용되며, 50% 이상의 레코드에 존재하는 단어는 일반적인 단어로 간주하여 검색에서 배제한다. 또한, 검색 결과 Match율은 Percentage로 표시된다. MySQL에서는 별도의 옵션을 제공하지 않으면, 자연어 검색을 실행하게 된다.
(MySQL Built-in 전문 검색엔진을 포함한 대부분의 전문 검색 도구가 지원한다.)
- Boolean 검색
자연어와 달리 검색어의 단어 단위로 특별한 예약어 (+-* 등)를 사용하여 검색 방법을 지정할 수 있다. 검색 방식의 이름에서도 알 수 있듯이, 일부 일치(몇 Percentage 일치)와 같은 개념은 존재하지 않으며, Match율은 순수하게 0% 아니면, 100% 일치로 표기된다. 또한 검색 결과도 100% 일치건만 추출된다.
(MySQL Built-in 전문 검색엔진을 포함한 대부분의 전문 검색 도구가 지원한다.)
인덱싱 방식
- 구분자 또는 불용어 (Delimiter, StopWord)
Full Text search에서는 전문 (Text)의 내용의 빠른 검색을 위해서 Index Building이 중요한데, 전문의 내용을 기 정의된 StopWord 목록을 이용하여 Parsing(분리)을 해서 결과 단어들의 목록을 인덱스로 생성해 두고 검색에 이용하는 방법을 말한다. 일반적으로 구분자는 공백이나 쉼표 또는 한국어의 조사 등을 구분자로 많이 사용하게 되며, 특정 시스템별로 아주 자주 사용되는 단어들도 검색의 의미가 없기 때문에 구분자로 등록하는 경우도 많다. (예를 들어 MySQL 홈페이지에서 MySQL 이라는 단어는 검색의 의미가 없기 때문에 구분자로 등록하는 것이 효율적일 수 있다) MySQL의 Built-in 전문 검색 엔진 (FullText search)은 이 방식만으로 인덱싱을 할 수 있다.
- N-Gram
지정된 구분자로 전 세계 모든 언어에서 단어를 구분해 낸다는 것은 쉽지 않을 것이다. 이러한 부분을 보완하기 위해서 지정된 규칙이 없는 전문도 분석 및 검색을 가능하도록 하는 방법이 N-Gram이라는 방식이다. N-Gram이란, 전문을 무조건적으로 몇 글자씩 잘라서 Indexing을 하는 방법이다. 구분자에 의한 방법보다는 Indexing이 복잡하고, 만들어진 Index의 Size도 상당히 큰 편이다. (Tritonn이나 Sphinx는 다른 인덱싱 방법들도 제공하지만 이 방법이 주로 사용된다.)
- 형태소 분석
국가별 언어에 대해서 각 문장 및 단어들의 문법 또는 의미적인 단위(형태소)로 쪼개어서 구분하고, 구문의 실제 의미를 인식할 수 있는 수준까지 분석하는 방법으로 주로 번역 시스템이나 검색 엔진들이 사용하는 방법이다. 이러한 방식은 상당히 복잡하기 때문에 일반적인 DBMS의 전문 검색 엔진에서는 쉽게 사용되진 않는 편이다. (Tritonn에서는 MeCab(일본어 형태소 분석기) 과 같은 형태소 분석기 라이브러리를 사용하여 적용할 수도 있다.)
Online / Offline 인덱싱
- Online 인덱싱
Full Text Search Engine 방식에 따라서, 대상 테이블에 데이터 레코드가 등록, 변경, 삭제되면서, Full Text Search Index에도 실시간으로 변경 분만 적용되는 형태를 의미한다. (MySQL Builtin Engine과 Tritonn Search Engine이 이와 같은 형태로 구현되어 있음)
- Offline 인덱싱
대상 테이블에 데이터 레코드가 등록, 변경, 삭제와는 무관하게 Full Text Search Index가 관리되면서, 실시간으로 Full Text Index에 반영되지 않고, 일정 주기로 수동 Batch 형태로 Full Text Index Building 작업을 해 주어야 하는 형태를 의미한다. (현재, Sphinx Engine이나 Lucene과 같은 소프트웨어가 이와 같은 형태로 구현되어 있음)
- 자연어 검색
자연어 검색이란, 문자 그대로 검색어를 일반적으로 인간이 사용하는 문장이나 절로(자연스러운 문장의 구문) 가정하여 그대로 Matching해서 검색을 실행하는 방법을 의미한다. 별도의 연산자를 사용할 수 없으며, StopWord 가 적용되며, 50% 이상의 레코드에 존재하는 단어는 일반적인 단어로 간주하여 검색에서 배제한다. 또한, 검색 결과 Match율은 Percentage로 표시된다. MySQL에서는 별도의 옵션을 제공하지 않으면, 자연어 검색을 실행하게 된다.
(MySQL Built-in 전문 검색엔진을 포함한 대부분의 전문 검색 도구가 지원한다.) - Boolean 검색
자연어와 달리 검색어의 단어 단위로 특별한 예약어 (+-* 등)를 사용하여 검색 방법을 지정할 수 있다. 검색 방식의 이름에서도 알 수 있듯이, 일부 일치(몇 Percentage 일치)와 같은 개념은 존재하지 않으며, Match율은 순수하게 0% 아니면, 100% 일치로 표기된다. 또한 검색 결과도 100% 일치건만 추출된다.
(MySQL Built-in 전문 검색엔진을 포함한 대부분의 전문 검색 도구가 지원한다.)
- 구분자 또는 불용어 (Delimiter, StopWord)
Full Text search에서는 전문 (Text)의 내용의 빠른 검색을 위해서 Index Building이 중요한데, 전문의 내용을 기 정의된 StopWord 목록을 이용하여 Parsing(분리)을 해서 결과 단어들의 목록을 인덱스로 생성해 두고 검색에 이용하는 방법을 말한다. 일반적으로 구분자는 공백이나 쉼표 또는 한국어의 조사 등을 구분자로 많이 사용하게 되며, 특정 시스템별로 아주 자주 사용되는 단어들도 검색의 의미가 없기 때문에 구분자로 등록하는 경우도 많다. (예를 들어 MySQL 홈페이지에서 MySQL 이라는 단어는 검색의 의미가 없기 때문에 구분자로 등록하는 것이 효율적일 수 있다) MySQL의 Built-in 전문 검색 엔진 (FullText search)은 이 방식만으로 인덱싱을 할 수 있다. - N-Gram
지정된 구분자로 전 세계 모든 언어에서 단어를 구분해 낸다는 것은 쉽지 않을 것이다. 이러한 부분을 보완하기 위해서 지정된 규칙이 없는 전문도 분석 및 검색을 가능하도록 하는 방법이 N-Gram이라는 방식이다. N-Gram이란, 전문을 무조건적으로 몇 글자씩 잘라서 Indexing을 하는 방법이다. 구분자에 의한 방법보다는 Indexing이 복잡하고, 만들어진 Index의 Size도 상당히 큰 편이다. (Tritonn이나 Sphinx는 다른 인덱싱 방법들도 제공하지만 이 방법이 주로 사용된다.) - 형태소 분석
국가별 언어에 대해서 각 문장 및 단어들의 문법 또는 의미적인 단위(형태소)로 쪼개어서 구분하고, 구문의 실제 의미를 인식할 수 있는 수준까지 분석하는 방법으로 주로 번역 시스템이나 검색 엔진들이 사용하는 방법이다. 이러한 방식은 상당히 복잡하기 때문에 일반적인 DBMS의 전문 검색 엔진에서는 쉽게 사용되진 않는 편이다. (Tritonn에서는 MeCab(일본어 형태소 분석기) 과 같은 형태소 분석기 라이브러리를 사용하여 적용할 수도 있다.)
- Online 인덱싱
Full Text Search Engine 방식에 따라서, 대상 테이블에 데이터 레코드가 등록, 변경, 삭제되면서, Full Text Search Index에도 실시간으로 변경 분만 적용되는 형태를 의미한다. (MySQL Builtin Engine과 Tritonn Search Engine이 이와 같은 형태로 구현되어 있음) - Offline 인덱싱
대상 테이블에 데이터 레코드가 등록, 변경, 삭제와는 무관하게 Full Text Search Index가 관리되면서, 실시간으로 Full Text Index에 반영되지 않고, 일정 주기로 수동 Batch 형태로 Full Text Index Building 작업을 해 주어야 하는 형태를 의미한다. (현재, Sphinx Engine이나 Lucene과 같은 소프트웨어가 이와 같은 형태로 구현되어 있음)
유용한 자료 감사합니다.
답글삭제수수마니님께서 처음으로 댓글을 달아주셨네요...
답글삭제무슨 선물이라도 하나 드려야 할 텐데... ㅋㅋ
혹시, 궁금하신 내용이나 잘못된 부분이 있으시면 코멘트 달아주시면
공부해서 블로그 작성하도록 할께요. ^^
감사합니다.