참고
Mysql full text 검색(전문 검색)
- Mysql 5.6 버전 이후에는 Inno db에도 full text 검색(인덱스 추가) 가능
- 주의
- 한국어 검색 특성상 보통은 '2글자'이상부터 검색되어야 하는데 mysql 기본 설정은 4글자이니 수정해야 함
- SHOW VARIABLES WHERE variable_name LIKE 'ft_m%'; 로 확인하면 4글자인데 최소 값을 2글자로 변경
- innodb를 사용하는 경우에는 innodb_ft_min_token_size 의 최소 값을 변경해야 함
- 복수개의 컬럼을 대상으로 full_text 검색을 진행시에는 해당 컬럼 모두가 포함된 full_text 인덱스가 필요
- 예) title과 content 2개 컬럼을 대상으로 full_text 검색을 실행하려면 2개 컬럼이 포함된 full_text 인덱스가 필요
- 쿼리 예) SELECT * FROM xe_documents WHERE MATCH(title, content) AGAINST('+답변 +조합' IN BOOLEAN MODE)
[사용 예]
테이블 생성
CREATE TABLE `tbl_full` (
`key` int(10) unsigned NOT NULL COMMENT '식별값',
`content` text COMMENT '내용',
PRIMARY KEY (`key`),
FULLTEXT KEY letter_content (letter_content)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='테이블';
실행 - 자연어 검색(keyword가 포함되어 있는 row를 찾음)
select * from tbl_full where match(content) against ('내용');
실행 - boolean mode 검색(keyword가 포함되어 있는 row를 찾고 추가적인 규칙 이용)
select * from tbl_full where match(content) against ('내용*' in boolean mode);
-- col like '내용%' 의 형태로 검색되지만 동일하지는 않음
-- "가나다라 내용마바" 검색가능
-- "가나다라내용마바" 검색불가능
ex) SELECT * FROM xe_documents WHERE MATCH(content) AGAINST('+답변 +조합' IN BOOLEAN MODE)
실행 - 쿼리 확장 검색(자연어 검색을 이용하여 데이터 셋을 만들어 다시 검색)
select * from tbl_full where match(content) against ('내용*' WITH QUERY EXPANSION);
-- col like '내용%' 의 형태로 검색되지만 동일하지는 않음
-- "가나다라 내용마바" 검색가능
-- "가나다라내용마바" 검색불가능
불린 검색시 사용 가능 키워드
연산자 없음: 정확하게 일치하는 단어 반환
> against(‘keyword1 keyword2’)
> 정확하게 keyword1 또는 keyword2 일치하는 row 검색
+ : keyword가 포함된 행 반환
> against(‘+keyword1 +keyword2’ in boolean mode)
> keyword1과 keyword2 포함한 row 검색
- : keyword가 포함된 행 제외
> against(‘+keyword1 -keyword2’ in boolean mode)
> keyword1은 포함하지만 keyword2 포함하지 않는 row 검색
* : keyword를 포함한 prefix 형태의 검색 가능
> against(‘keyword1*’ in boolean mode)
> keyword1은 포함(keyword1%)한 row 검색
<> : 값의 관계 비교, 해당하는 값 반환
“” : 해당 콤마 사이 keyword 반환
> “keyword1 keyword2” 는 찾지만 “keyword1 keyword3 keyword2”는 찾을수 없음
'DB > Mysql' 카테고리의 다른 글
글로벌 서비스 개발시, Mysql 날짜/시간에 처리를 위한 데이터타입 확인 (0) | 2021.11.17 |
---|---|
Mysql n-gram을 이용한 검색 (2) | 2021.08.26 |
Mysql rules(with java) (0) | 2018.12.28 |
Mysql 로그인 이력 저장을 위한 파티션 테이블 샘플(mysql history partition table) (0) | 2018.11.12 |
CentOS 7에 Mysql 5.7 설치 (1) | 2017.05.17 |