N-gram Parser를 이용해 검색 기능을 구현하던 중 특정 문자에 대해 검색이 안되는 것을 확인했다.
현재 'name'이라는 칼럼에 FULLTEXT INDEX를 걸어놓은 상태인데, 'b'라고 검색하면 정상적으로 결과가 나오지만 'a'라고 검색하면 결과가 나오지 않는 것을 확인할 수 있다.
쿼리문은 다음과 같다.
SELECT *
FROM products
WHERE MATCH(name) AGAINST (<검색어> IN BOOLEAN MODE);
이는 'a'가 구분자(Stopword)이기 때문에 발생한 문제이다. 자세한 설명은 관련 링크를 참고하면 된다.
MySQL innoDB에는 내부적으로 다음과 같은 stopword들이 존재한다.
mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_DEFAULT_STOPWORD;
+-------+
| value |
+-------+
| a |
| about |
| an |
| are |
| as |
| at |
| be |
| by |
| com |
| de |
| en |
| for |
| from |
| how |
| i |
| in |
| is |
| it |
| la |
| of |
| on |
| or |
| that |
| the |
| this |
| to |
| was |
| what |
| when |
| where |
| who |
| will |
| with |
| und |
| the |
| www |
+-------+
이처럼 기본적으로 설정된 stopword들을 무시하기 위해선 innodb_ft_enable_stopword라는 환경변수의 값을 바꿔줘야 한다.
# 일시적 처리
SET GLOBAL innodb_ft_enable_stopword = 0;
또는 /etc/my.conf에 아래 항목을 추가한다.
# 영구적 처리 (재시작 시 적용)
innodb_ft_enable_stopword = 0;
RDS를 사용하는 경우엔 RDS - 파라미터 그룹 - innodb_ft_enabled_stopword에서 0으로 세팅해준다.
정상적으로 검색이 이루어지는 것을 확인할 수 있다.
참고
https://dev.mysql.com/doc/refman/5.7/en/fulltext-search-ngram.html
https://dev.mysql.com/doc/refman/8.0/en/fulltext-stopwords.html
https://m.blog.naver.com/pareko/221873782090
'트러블슈팅' 카테고리의 다른 글
[트러블슈팅] IntelliJ Build Error: java.lang.AbstractMethodError (0) | 2022.07.15 |
---|---|
[트러블슈팅] 카카오맵 401 Unauthorized 에러 (kakao is not defined) (2) | 2021.10.05 |
[트러블슈팅] Invalid keyPath 에러 (0) | 2021.05.28 |
[트러블슈팅] UseEffect에서 clean up이 되지 않을 때 (feat. async) (0) | 2021.05.25 |
[트러블슈팅] ER_CON_COUNT_ERROR: Too many connections (1) | 2021.05.06 |