참고


Mysql full text 검색(전문 검색)

  1. Mysql  5.6 버전 이후에는 Inno db에도 full text 검색(인덱스 추가) 가능
  1. 주의
    1. 한국어 검색 특성상 보통은 '2글자'이상부터 검색되어야 하는데 mysql 기본 설정은 4글자이니 수정해야 함
      1. SHOW VARIABLES WHERE variable_name LIKE 'ft_m%'; 로 확인하면 4글자인데 최소 값을 2글자로 변경
      2. innodb를 사용하는 경우에는 innodb_ft_min_token_size 의 최소 값을 변경해야 함
    2. 복수개의 컬럼을 대상으로 full_text 검색을 진행시에는 해당 컬럼 모두가 포함된 full_text 인덱스가 필요
      1. 예) title과 content 2개 컬럼을 대상으로 full_text 검색을 실행하려면 2개 컬럼이 포함된 full_text 인덱스가 필요
        1. 쿼리 예) 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”는 찾을수 없음


+ Recent posts