[mysql] full-text 텍스트 검색 (like 대체)적용하기 프로그래밍
2018.08.13 15:45 Edit
mysql 에서 text 검색시 보통 like 나 instr 을 사용한다.
그러나 mysql 5.5 부터 full-text index가 사용 가능하다.
https://dev.mysql.com/doc/refman/5.5/en/fulltext-restrictions.html
-isam 에서는 5.5부터 지원
-innodb 에서는 5.6부터 지원
1. full-text index 생성하기
ALTER TABLE `기존 테이블명` ADD FULLTEXT INDEX `인덱스명` (`컬럼명`) VISIBLE;
2. 최소 검색 글자수 설정 my.cnf
ft_min_word_len = 2 innodb_ft_min_token_size = 2
기본값은 4인데 2로 고쳐서 2글자이상 검색이 가능하도록
수정후 확인 작업.
show variables like '%ft_min%';
3.인덱스 재설정작업
/* isam */ REPAIR TABLE 테이블명 QUICK; /* innodb */ OPTIMIZE TABLE 테이블명;
4. sql 작성
/* or 검색, 검색어1 만 있어도 결과포함 */ SELECT * FROM 테이블명 WHERE MATCH(컬럼명) AGAINST('검색어1 검색어2') /* 큰 따옴표로 띄어쓰기도 검색가능, 따로검색하지않고 '검색어1 검색어2' 그대로검색 */ SELECT * FROM 테이블명 WHERE MATCH(컬럼명) AGAINST('"검색어1 검색어2"') /* 검색어1 을 검색하되 검색어2가 들어간놈을 제외 */ SELECT * FROM 테이블명 WHERE MATCH(컬럼명) AGAINST('"검색어1" -검색어2' in boolean mode) /* 검색어1과 검색어2가 모두 들어간놈 */ SELECT * FROM 테이블명 WHERE MATCH(컬럼명) AGAINST('+"검색어1" +"검색어2"' in boolean mode) /* 검색어1 and 검색어2 가 모두 들어간놈이 우선 그후 검색어2 만 들어간것도 포함 */ SELECT * FROM 테이블명 WHERE MATCH(컬럼명) AGAINST('"검색어1" +"검색어2"' in boolean mode) /* 스코어(정확도)를 확인 */ SELECT *, MATCH(컬럼명) AGAINST('"검색어1" +"검색어2"' in boolean mode) AS SCORE FROM 테이블명 WHERE MATCH(컬럼명) AGAINST('"검색어1" +"검색어2"' in boolean mode) /* 검색어1이, 검색어1을, 검색어1이 를 모두 포함 */ SELECT * FROM 테이블명 WHERE MATCH(컬럼명) AGAINST('검색어1*' in boolean mode)
https://dev.mysql.com/doc/refman/5.7/en/fulltext-boolean.html
출처 - http://dogcowking.tistory.com/78
"주식회사" 를 검색할때 "회사" 로 검색이 안되지 않나요?