DB/MYSQL

Full Text Index

창욱씨 2023. 9. 30. 00:26
728x90

Full Text Index 배경

일반적으로 mysql에서 문자열을 검색할 때, 텍스트 내용이 어마어마한 경우에는 성능이 저하됩니다. 이를 해결하기 위해 Full Text Index가 만들어졌습니다. Full Text Index은 첫 글자 뿐 아니라 중간의 단어나 문자응로도 인덱스를 생성해 주기 때문에 순식간에 검색 결과를 얻을 수 있습니다.

Full Text Index 인덱싱

Stop-word parser

공백이나 Tab, 문장 기호 또는 사용자가 정의한 문자열을 기준으로 토큰을 나누는 기법입니다.
ex) 아빠가 방에 들어갔다. -> 아빠가/방에/들어갔다

N-gram parser

n-gram 기법을 이용하여 할당한 토큰의 크기 n만큼씩 데이터를 인덱스로 파싱해두었다가 사용하는 기법입니다.
ex) 아빠가 방에 들어갔다. -> 아빠/빠가/방에/들어/어갔/갔다

Full Text Index 생성

Full Text Index의 디폴트는 stop-word 파싱으로 ngram 파싱을 하려면 뒤에 with parser ngram 을 붙여주어야 합니다.

Full Text Index 특징

  • char, varchar, text 타입의 문자열만 인덱싱 가능
  • InnoDB와 MyISAM 타입만 지원

Full Text Index를 이용한 검색 방법

자연어 검색

자연어 검색은 단어가 정확한 것을 검색해줍니다.

SELECT * FROM newspaper WHERE MATCH(article) AGAINST('영화' in natural language mode);

불린 모드 검색

불린 모드 검색은 단어나 문장이 정확히 일치하지 않는 것도 검색하는 것을 의미합니다. 불린 모드 검색은 필수인 +, 제외하기 위한 -, 부분 검색을 위한 * 등의 다양한 연산자를 제공합니다.

-- ex) 영화가 영화는 영화를
select * from newspaper
where match(article) against ('영화*' in boolean mode);


-- 정확히 '영화 배우' 단어가 들어있는 기사 내용 검색
select * from newspaper
where match(article) against('영화 배우' in boolean mode);


-- '영화 배우' 단어가 들어 있는 기사 중에서 '공포' 내용이 들어간 결과
select * from newspaper
where match(article) against('영화 배우 +공포' in boolean mode);


-- '영화 배우' 단어가 들어 있는 기사 중에서 '남자' 내용은 검색에서 제외
select * from newspaper
where match(article) against('영화 배우 -남자' in boolean mode);

쿼리 확장 검색

총 2단계에 걸쳐 검색을 수행합니다 첫 단계에서는 자연어 검색을 수행한 후, 첫 번째 검색의 결과에 매칭된 행을 기반으로 검색 문자열을 재구성하여 두 번째 검색을 수행합니다.

select * from tbl_full where match(content) against('내용*' WITH QUERY EXPANSION);

https://inpa.tistory.com/entry/MYSQL-%F0%9F%93%9A-%ED%92%80%ED%85%8D%EC%8A%A4%ED%8A%B8-%EC%9D%B8%EB%8D%B1%EC%8A%A4Full-Text-Index-%EC%82%AC%EC%9A%A9%EB%B2%95
https://scarelt.tistory.com/10

728x90