공지사항

정현스토어의 공지/상품등록팁/블로그 목록입니다.

제 목 [Blog] MySQL 에서 한글 검색을 위한 ngram Full-Text Parser 조 회 26
작성자 정현스토어 작성일 2025-09-12 13:17:25

온라인 쇼핑몰 상품등록 전문 대행 정현스토어 이승민 입니다.



필자의 네이버 블로그와 정현스토어 홈페이지 통합하면서 좋은 내용의 글을 홈페이지에 블로그 형식으로 옮겨 적습니다.

글을 쓰는 정현스토어 홈페이지 (www.jhyunstore.com) 는 윈도우 OS 와 Java (v21) 기반에 

아파치 톰캣 (Apache Tomcat) v11.0 그리고, MySQL v9.3 으로 현재 운영중입니다.


오랜기간 MySQL v5.6 으로 시작하여 MySQL v9 로 업그레이드 과정에서 검색에 관련한 내용입니다.


-------------------------------------------------------------------------------------------------------------



작년초에 설치한 MySQL 5.6 에서 한글로 제목과 본문을 Full-Text 검색하면 결과가 아쉽더군요


영어는 검색이 잘되는데 본문내 한글을 Full-Text 검색하면 결과가 예상보다 너무 적게 나옵니다


예로 검색어 "그랜저하이브리드"를 검색하면  "그랜저" 는 검색 안되고 "그랜드카니발"이 검색되는 등등...


별도 검색엔진을 궁리하던중 MySQL 5.7 (정확히는 2015-03-09에 릴리즈된  MySQL 5.7.6 버전)의


ngram Full-Text Parser 가 눈에 띄였습니다. 


"MySQL provides an ngram full-text parser that supports Chinese, Japanese, and Korean (CJK)."



(참고 : MySQL 5.7 Reference Manual - 12.9.8 ngram Full-Text Parser)


 https://dev.mysql.com/doc/refman/5.7/en/fulltext-search-ngram.html


MySQL


중국어,일본어,한국어에서는 영어와 다르게 단어 사이에 공백이나 구분자가 없어 단어토큰을 다르게 변환하여 검색하는


방식입니다


1. MySQL 5.7.6 버전 이상으로 설치 또는 업그레이드


  (저는 현재 최신판인 5.7.11 로 업그레이드했습니다. mysql_upgrade.exe를 사용하였는데 추후 다시 적습니다.)



2. my.ini 설정화일에 아래 설정을 추가합니다


[mysqld]


  ngram_token_size=2


  ngram_token_size=2 설정은 검색어 "abc" 를 “ab bc” 변환(파싱) 함을 뜻합니다



3. 제목과 본문필드로 FULLTEXT INDEX 를 생성합니다


CREATE FULLTEXT INDEX 인덱스명 ON 테이블명(제목필드, 본문필드) WITH PARSER ngram;


예: CREATE FULLTEXT INDEX idx_document ON tb_document(subject, body) WITH PARSER ngram;


subject 필드와 body 필드는 varchar 이고 기존 FULLTEXT SQL 문에 "WITH PARSER ngram" 을 추가 하여야 합니다



4. SELECT 문


 4-A) NATURAL LANGUAGE MODE 예시


SELECT ...


FROM ...


WHERE ...  AND match(a.subject, a.body) against('" + 검색어 + "' IN NATURAL LANGUAGE MODE)


4-B) BOOLEAN MODE 예시


SELECT ... 

FROM ...

WHERE ... AND match(a.subject, a.body) against('" + 검색어 + "' IN BOOLEAN MODE)


4-C) BOOLEAN MODE 의 연관도(Score) 예시


SELECT ... , match(a.subject, a.body) against('" + 검색어 + "' IN BOOLEAN MODE) AS score

FROM ...

WHERE ... AND match(a.subject, a.body) against('" + 검색어 + "' IN BOOLEAN MODE)

ORDER BY ... , score DESC



NATURAL LANGUAGE 방식(4-A)보다 BOOLEAN 방식(4-B)이 검색결과가 좋고, 적용 사용시 검색결과

연관도(Score) 우선순위 표시 방식(4-C)을 사용하면 가장 검색 결과가 만족하게 도출됩니다. 




#네이버, #신세계, #롯데, #현대, #백화점, #아울렛, #상품업로드, #상품등록대행, #정현스토어

첨부파일 mysql_01.jpg

댓글 작성