FullText Index (풀텍스트 인덱스)는 텍스트 검색을 효율적으로 수행하기 위해 사용하는 Index입니다.
일반적으로 대량의 Text Data가 포함된 Column에 적용되며,
자연어 검색 기능을 제공하여 사용자가 입력한 Keyword와 관련된 Data를 빠르게 검색하도록 돕습니다.
FullText Index는 단어 단위로 텍스트를 indexing 하여,
특정 단어가 포함된 레코드를 쉽게 찾을 수 있습니다.
여러 언어의 불용어 (stop words) 및 형태소 분석을 통해 검색어의 정확성을 높입니다.
(※ 불용어 : 자연어 처리(NLP)에서 큰 의미를 가지지 않는 단어. [ex. "the", "is", "at", "which" ....])
AND, OR, NOT과 같은 논리 연산자를 사용해 복잡한 검색 쿼리를 구성할 수 있습니다.
또한, 와일드카드 검색과 근접 검색도 지원합니다.
(※ 와일드카드 검색 : 특정 문자열의 일부를 대체할 수 있는 특수 문자 (*, ?))
(※ 근접 검색 : 특정 단어들이 서로 가까이 위치해 있는지를 기준으로 검색하는 방법)
검색 결과를 관련성에 따라 정렬하여 가장 관련성이 높은 결과를 먼저 보여줍니다.
지원 타입 : CHAR, VARCHAR, TEXT
FullText Index는 테이블 생성 시 또는 기존 테이블에 추가할 수 있습니다.
CREATE TABLE articles (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255),
content TEXT,
FULLTEXT(title, content)
);
ALTER TABLE articles ADD FULLTEXT (title, content);
Match와 Against 함수를 사용하여 FullText Index 검색을 수행합니다.
이 때 불용어는 MySQL에 기본적으로 리스트가 있고 이는 설정 파일을 통해 수정할 수 있습니다.
또한 기본적으로 Index에 포함되는 단어는 4자 이상이며, 이 역시 조정할 수 있습니다.
기본적인 자연어 검색모드로, 단어의 중요도에 따라 결과를 반영합니다.
SELECT * FROM articles
WHERE MATCH(title, content) AGAINST('검색어' IN NATURAL LANGUAGE MODE);
검색할 단어에 대해 AND, OR, NOT 등의 논리 연산자를 사용합니다.
SELECT * FROM articles
WHERE MATCH(title, content) AGAINST('+MySQL -SQLite' IN BOOLEAN MODE);
논리 연산자 in BOOLEAN MODE
- + (AND) : 해당 단어가 반드시 포함되어야 함.
- - (NOT) : 해당 단어는 제외되어야 함.
- | (OR) : 해당 단어 중 하나라도 포함되어야 함.
- * (Wildcard) : 해당 단어로 시작하는 모든 단어를 포함해야함.
Oracle Text는 비정형 데이터에서 텍스트 검색을 지원하는 기능으로,
정형 데이터베이스의 SQL 쿼리와 함께 사용할 수 있습니다.
Oracle Text가 설치되어있어야 FullText Index를 생성할 수 있습니다.
CREATE INDEX articles_idx ON articles(content) INDEXTYPE IS CTXSYS.CONTEXT;
articles
: 테이블 이름
content
: 인덱스를 생성할 텍스트 필드
CTXSYS.CONTEXT
: Oracle Text의 인덱스 타입
CONTAINS
함수를 사용해 검색을 수행합니다.
SELECT * FROM articles
WHERE CONTAINS(content, 'MySQL') > 0;
"MySQL" 단어가 포함된 모든 레코드 반환
AND, OR, NOT, 와일드카드(*) 사용
SELECT * FROM articles
WHERE CONTAINS(content, 'MySQL AND Fulltext') > 0;
두 단어가 가까이 있는 경우 검색
SELECT * FROM articles
WHERE CONTAINS(content, 'MySQL AND Fulltext') > 0;
"MySQL"과 "Fulltext"라는 단어가 서로 가까운 위치에 있는 레코드를 반환
Oracle Text 역시 불용어와 최소 길이 제한이 있습니다.
이는 ctx_ddl.create_preprocess
프로시저를 통해 조정할 수 있습니다.