DB/MYSQL

[MySQL] FullText 검색, 여러개 Like

보겸삼촌 2020. 9. 3. 16:16

 

# 개념

'%'를 사용하여 LIKE 패턴 연산을 지원, 또는 구문에 대한 검색을 지원

 

검색 종류 설명
자연어 검색 문자열을 단어 단위로 분리한 후, 해당 단어 중 하나라도 포함되는 행
불린 모드 검색 문자열을 단어 단위로 분리한 후, 해당 단어가 포함되는 행을 찾는 규칙을 추가적으로 적용하여 해당 규칙에 매칭되는 행
쿼리 확장 단계에 걸쳐서 검색을 수행. 첫 단계에서는 자연어 검색을 수행한 후, 첫 번째 검색의 결과에 매칭된 행을 기반으로 검색 문자열을 재구성하여 두 번째 검색을 수행한다. 이는 1단계 검색에서 사용한 단어와 연관성이 있는 단어가 1단계 검색에 매칭된 결과에 나타난다는 가정을 전제

 

* 자연어 검색

  • 단어 기준으로 검색 하기 때문에 “내용1” 키워드로 검색해도 "내용1입니다는 검색X.
  • [해결방법] Mroonga 플러그인

 

 

* 불린 모드(boolean mode)

  • 필수(+), 예외(-), 부분(*) ,구문(“”) 등 연산자를 사용 가능.
  • 검색 키워드를 쌍따움표(“”) 로 묶으면 해당 전체 구문 그대로 포함된 게시글을 검색.

 

 

# 주의사항

 

 기본적으로 FullText 검색은 default로 4자 이상의 단어 검색을 지원함. 2자 이상의 검색을 하기 위해서는 다음을 통해 글자수를 조정해야함

 

1. 확인

> SHOW VARIABLES LIKE '%ft%';

 

검색결과

 

  본인의 DB 종류에 따라서 수정해야할 변수가 달라짐. 기본적으로 Value 값이 4, 3으로 설정되어있음

 

2. 변경

 

윈도우환경의 경우 다음 경로에서 my.ini 파일을 수정해야 함

C:\ProgramData\MySQL\MySQL Server 8.0

  2.1. 내용 추가

innodb_ft_min_token_size=2
ft_min_word_len=2

 

  2.2. 저장 시 ANSI 형식으로 저장할 것

    저장할 때 인코딩 형식이 utf-8로 저장될 경우가 있는데 그 때는 mysql80 서비스를 재시작하려고 할 때,

    실행이 안되는 경우가 있음 

 

  2.3. 서비스 재시작

 

 

  2.4. OPTIMIZE TABLE 테이블명

 

 

3. 테이블에 FULLTEXT 인덱스 추가

ALTER TABLE 

ADD FULLTEXT INDEX이름 (필)

  3.1. 인덱스 삭제 방법

ALTER TABLE 

DROP INDEX 인덱스이름

 

  3.2. 설정 변경 전 인덱스에 적용하기

REPAIR TABLE 테이블명 QUICK;

 

4. 검색 쿼리

 

  4.1. 자연어 검색 (OR조건)

SELECT * FROM 테이블명
WHERE MATCH(칼럼명) AGAINST('검색어1 검색어2');

 

  4.2. 불린 모드 검색

SELECT * FROM 테이블명

WHERE MATCH(컬럼명) AGAINST(' +"검색어1*" +"검색어2"' in boolean mode)

  : 검색어1이 포함된, 내용 and 검색어2가 정확한 포함된 검색  (+: AND, -: NOT...)

 

 

 

 

[참고] https://medium.com/@sindepal/mariadb-fulltext-index-1292b1f2a695

[참고] https://kmongcom.wordpress.com/2014/03/28/mysql-%ED%92%80-%ED%85%8D%EC%8A%A4%ED%8A%B8fulltext-%EA%B2%80%EC%83%89%ED%95%98%EA%B8%B0/

[참고] http://tcpschool.com/mysql/mysql_index_add

[참고] https://mattgadient.com/how-to-remove-a-fulltext-index-in-mysql-switching-from-myisam-to-innodb/