MySQL에서 “서버 개발자” 라고 검색했을 때, “서버” 와 “개발자” 두 단어가 포함된 내용이 1순위로 출력되고 “서버” 또는 “개발자”를 포함한 내용을 2순위로 출력하고 싶을 때 LIKE만으로는 어려움이 있다.
이럴때 사용하면 좋은 기능이 바로 FULLTEXT이다.
FULLTEXT Search
FULLTEXT는 입력한 keyword가 포함된 내용을 출력해줄 뿐만 아니라 다양한 규칙을 적용시켜 개발자가 원하는 값만 출력이 가능하게 하는 기능이다.
1. 최소 검색어 길이 수정
보통 MySQL의 FULLTEXT 검색어 최소 길이는 4로 설정되어있는데 이럴경우 “개발” 이라는 단어는 검색이 안된다. 이러한 문제를 해결하는 방법은 다음과 같다.
1) mysql에서 show variables like '%ft_min%'; 로 길이를 확인한다.
2) mysql server 폴더의 ini 파일에 아래 내용을 추가한다.
ini파일 찾기가 어렵다면SHOW VARIABLES WHERE Variable_Name LIKE "%dir"로 basedir 확인해보기
[mysqld]
ft_min_word_len=2
innodb_ft_min_token_size=2
3) mysql 재시작 (작업관리자에서 다시시작하기)
4) FULLTEXT 인덱스 설정해뒀으면 지우고 다시 추가하던가 repair table meeting quick; 사용해서 repair해주기 (스키마 지우고 다시 만들어서 설정하는걸 추천)
2. FULLTEXT KEY 설정
spring boot 환경에서 jpa를 사용해 서버를 구축하다 보니 테이블 설정을 모두 sts에서 해줘야했는데 @Column에 columnDefinition옵션으로 FULLTEXT KEY 설정을 해줘도 어째서인지 계속 오류가 발생했다.
아마 FULLTEXT가 index이다 보니까 index Entity를 만들어서 적용시켜줘야했던것같은데 아직 이부분에 대해선 더 공부가 필요했기에 직접 MySQL에서 설정해주는 방법을 선택했다.
alter table 테이블명 add fulltext key (컬럼명1, 컬럼명2, ...);
3. 사용 예시
Repository에 아래와 같이 코드를 작성했다.
@Query(value = "SELECT * FROM MEETING m WHERE MATCH(m.title, m.content, "
+ "m.tags, m.area1, m.area2) AGAINST('keywords' in boolean mode) ORDER BY m.meeting_id DESC", nativeQuery = true)
4. 발생할 수 있는 오류
FULLTEXT를 사용해서 출력하는 하나의 row 문자열들은 character set 이 모두 동일해야한다!!!
ex) title은 utf8 이고 content는 utf8mb4이면 일관성이 없기에 오류가 발생한다.
때문에 문자열 타입의 character set을 일치시켜줘야하는 과정이 필요하다.
ALTER TABLE meeting MODIFY COLUMN phone VARCHAR(255) CHARACTER SET utf8mb4;