[mysql] full-text 텍스트 검색 (like 대체)적용하기 프로그래밍

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

Tag :

Leave Comments