[DB] MySQL 전체텍스트 검색 개념 실습

ho's·2022년 7월 19일
0

데이터 전체 텍스트 검색 방법

1. DB 및 테이블 만들기

CREATE DATABASE IF NOT EXISTS FulltextDB;
USE FulltextDB;
DROP TABLE IF EXISTS FulltextTbl;
CREATE TABLE FulltextTbl;
	id int AUTO_INCREMENT PRIMARY KEY, -- 고유 번호
    title VARCHAR(15) NOT NULL,   -- 영화 제목
    description VARCHAR(1000)     -- 영화 제목 요약 

2. 데이터 입력하기


INSERT INTO FulltextTbl(id,title,description) VALUES
(NULL, '광해, 왕이 된 남자','왕위를 둘러싼 권력 다툼과 당쟁으로 혼란이 극에 달한 광해군 8년'),
(NULL, '간첩','남한 내에 고장간첩 5만 명이 암약하고 있으며 특히 권력 핵심부에도 침투해있다.'),
(NULL, '남자가 사랑할 때', '대책 없는 한 남자이야기. 형 집에 얹혀 살며 조카한테 무시당하는 남자'),
(NULL, '레지던트 이블 5','인류 구원의 마지막 퍼즐, 이 여자가 모든 것을 끝낸다.'),
(NULL, '파괴자들','사랑은 모든 것을 파괴한다! 한 여자를 구하기 위한, 두 남자의 잔인한 액션 본능!'),
(NULL, '킹콩을 들다',' 역도에 목숨을 건 시골소녀들이 만드는 기적 같은 신화.'),
(NULL, '테드','지상최대 황금찾기 프로젝트! 500년 전 사라진 황금도시를 찾아라!'),
(NULL, '타이타닉','비극 속에 침몰한 세기의 사랑, 스크린에 되살아날 영원한 감동'),
(NULL, '8월의 크리스마스','시한부 인생 사진사와 여자 주차 단속원과의 미묘한 사랑'),
(NULL, '늑대와 춤을','늑대와 친해져 모닥불 아래서 함께 춤을 추는 전쟁 영웅 이야기'),
(NULL, '국가대표','동계올림픽 유치를 위해 정식 종목인 스키점프 국가대표팀이 급조된다.'),
(NULL, '쇼생크 탈출','그는 누명을 쓰고 쇼생크 감옥에 감금된다. 그리고 역사적인 탈출.'),
(NULL, '인생은 아름다워','귀도는 삼촌의 호텔에서 웨이터로 일하면서 또 다시 도라를 만난다.'),
(NULL, '사운드 오브 뮤직','수녀 지망생 마리아는 명문 트랩가의 가정교사로 들어간다'),
(NULL, '매트릭스',' 2199년.인공 두뇌를 가진 컴퓨터가 지배하는 세계.');
SELECT * FROM FulltextTbl;

전체 텍스트 검색 실습

MYSQL은 기본적으로 3글자 이상만 전체 텍스트 인덱스로 생성한다.
이러한 설정을 2글자까지 전체 텍스트 인덱스가 생성되도록 시스템 변숫 값을 변경하자.

SHOW VARIABLES LIKE 'innodb_ft_min_token_size';

를 입력하면 전체 텍스트 인덱스를 생성할 때 단어의 최소 값이다.

우리는 '성별', '남자', '커피' 와 같은 2글자 단어를 검색할 것이다.
설정을 해보자.

MySQL Server 8.0 디렉터리에 my.ini 파일을 수정하자

powershell을 이용해 my.ini 파일을 열면 아래와 같다.

Fulltext인덱스 만들기

CREATE FULLTEXT INDEX 인덱스이름 ON 테이블이름(칼럼명);

CREATE FULLTEXT INDEX idx_description ON FulltextTbl(description);

인덱스가 생성되었는지 확인해보자.

FulltextTbl테이블의 description칼럼에 '남자'가 들어간 것을 찾아보자

방법1. SELECT * FROM FulltextTbl WHERE description LIKE '%남자%';

방법2. SELECT * FROM FulltextTbl WHERE MATCH(description) AGAINST('남자%' IN BOOLEAN MODE);

결과는 같지만, 방법1이 Fulltext인덱스를 이용하므로 검색 속도가 빠르다는 것을 알 수 있다.

남자와 여자가 포함되는 것을 검색하는 방법

SELECT * FROM FulltextTbl WHERE MATCH(description) AGAINST('남자* 여자*' IN BOOLEAN MODE);

남자와 여자가 모두 들어있는 것만 검색하는 방법

SELECT * FROM FulltextTbl WHERE MATCH(description) AGAINST('+남자* +여자*' IN BOOLEAN MODE);

여자는 제외하고 남자만 들어있는 것을 검색하는 방법

SELECT * FROM FulltextTbl WHERE MATCH(description) AGAINST('남자* -여자*' IN BOOLEAN MODE);


참고 영상 : https://www.youtube.com/watch?v=1kE8y7rAOzM&list=PLVsNizTWUw7Hox7NMhenT-bulldCp9HP9&index=45

profile
그래야만 한다

0개의 댓글