Blog

[Spring][258] 구분자 기법의 FULLTEXT index가 2자 이하의 단어를 검색할 수 없는 문제

Category
Author
Tags
PinOnMain
1 more property
문제 상황
기본 설정으로 FULLTEXT indexing을 하게 되면 3글자 이상의 단어들만 검색이 가능하며, 2글자 이하의 단어는 검색이 되지 않는다.
문제 원인
기본적으로 MySQL은 Storage engine으로 innodb라는 것을 사용한다.
%programdata%\MySQL\MySQL Server 8.0\my.ini 파일을 보면 아래와 같은 설정이 되어 있음을 알 수 있다.
default-storage-engine=INNODB
SQL
복사
위 현상이 발생하는 이유는 이 innoDB와 연관이 있다.
sql의 변수 중 innodb_ft_min_token_size 라는 값이 있는데, FULLTEXT indexing 시에 해당 변수의 값보다 작은 크기의 글자들은 인덱스화하지 않고 버리게 된다. 해당 변수의 기본 설정값은 3이기에 3글자 이상의 단어들만 인덱스에 사용하고 2글자 이하의 단어들은 모두 버리게 된다.
예를들면 ‘자바 스프링’ 이라는 단어를 구분자(” “)를 기준으로 분리하면 ‘자바’와 ‘스프링’이 남는데, 자바는 두 글자 단어이므로 버리고 스프링은 세 글자 단어이기에 저장하게 된다. 이로 인해서 스프링으로 검색하면 ‘자바 스프링’ 결과를 얻을 수 있지만, 자바로 검색하면 결과를 얻을 수 없게 된다.
해결 방법
그렇다면 해결 방법은 간단하다. innodb_ft_min_token_size 값을 수정하면 된다. MySQL의 변수 변경은 SET을 통해 수정할 수 있다.
set innodb_ft_min_token_size = 1;
SQL
복사
의도에 따라서 2로 저장해도 상관없다. 다만 한글에는 1글자로 된 단어가 많기에 모든 keyword를 저장할 수 있도록 1로 설정하였다.
물론 이 명령어는 실행되지 않는다. 해당 변수가 저장된 파일이 readonly이기에 수정할 수 없다는 경고 문구를 확인했다.
다른 방법은 mySQL 내 my.ini 파일에 값을 수정하여 입력하는 것이다. 위에 언급했던 그 파일이 맞다.
파일을 VScode(메모장을 활용해도 열 수는 있다.)로 열면 [mysqld]라는 칸이 있다.
해당 칸 밑에 innodb_ft_min_token_size = 1; 를 입력한 후 관리자 권한으로 저장해 준다. 관리자 권한이 없다면 ctrl + s를 누를 때 경고 표시가 뜨면서 관리자 권한으로 다시 시도 버튼이 따로 나온다.
저장했으면 MySQL service를 다시 실행해야 저장한 변수들이 실행 시에 적용되어 들어간다.
윈도우의 서비스 앱을 열어 my SQL을 찾아 다시 시작한다.
다시 한 번 FULLTEXT index를 생성한 후 검색을 시도하면 정상적으로 2글자 단어도 검색이 가능한 것을 볼 수 있다.