새소식

Database/MySQL

[MySQL] 긴 글을 search 하는 방법 : FullText Search

  • -

LIKE 연산자를 써서 검색을 할 수 있지만, %연산자를 사용하게되면 index를 사용하지 못하게 된다는 단점이 있다.

그럴때는 full text index를 활용하면 된다.

 

🎈FULLTEXT INDEX 생성

CREATE FULLTEXT INDEX 인덱스명 ON 테이블명(컬럼명);

CREATE FULLTEXT INDEX 도서명 ON index_test.library(서명);

 

🎈FULLTEXT INDEX 를 사용해서 검색

SELECT * FROM library
WHERE match(컬럼명) against("검색할단어");

SELECT * FROM library 
WHERE match(서명) against("대한민국");

 

🎈IN BOOLEAN MODE

위와 같은 방법은 정확히 "대한민국"이라는 단어만 찾아준다.

% 기능

그러나 IN BOOLEAN MODE 옵션을 추가해준다면 '*' 기호를 사용할 수 있다.
* 기호는 %와 유사하다.

SELECT * FROM library
WHERE match(서명) against("대한민국*" IN BOOLEAN MODE);

이렇게 "대한민국*"을 사용하면  "대한민국을" "대한민국이" 등도 검색 가능하다.

 

OR 연산

SELECT * FROM library
WHERE match(서명) against("대한민국 독도" IN BOOLEAN MODE);

또한 위와 같이 여러 단어를 넣으면 대한민국 또는 독도가 포함된 결과를 검색해준다. 

 

AND 연산

SELECT * FROM library
WHERE match(서명) against("+대한민국 +독도" IN BOOLEAN MODE);

+ 기호를 앞에 붙이면 해당 단어가 반드시 들어간 결과를 출력해준다.
위와 같은 쿼리문을 사용하면 대한민국과 독도가 들어간 데이터를 검색해준다.

 

NOT 연산

SELECT * FROM library
WHERE match(서명) against("-대한민국 +독도") IN BOOLEAN MODE);

- 기호를 앞에 붙이면 해당 단어는 들어가있지 않은 데이터를 검색해준다.

 

🎈PARSER ngram

CREATE FULLTEXT INDEX 인덱스명 ON 테이블명(컬럼명) WITH PARSER ngram;

ngram 방식을 사용하지 않은 쿼리문들은 띄어쓰기를 기준으로 매칭을 해주지만
띄어쓰기를 잘못 사용한 단어들에 대해서는 제대로 매칭을 해주지 못한다는 단점이 있다.

WITH PARSER ngram 옵션을 사용한다면 ngram 기반으로 검색을 해준다.
즉, "고 구마"라고 작성해도 n_gram=3이라면 고구마 라고 검색을 해줄 것이고
"쿠키런을"으로 작성 시 n_gram=2라면 "쿠키" "키런" "런을" 으로 검색을 해줄 것이다.

 

 

 

728x90

'Database > MySQL' 카테고리의 다른 글

[MySQL] Trigger  (0) 2023.03.25
[MySQL] index  (0) 2023.03.23
[MySQL] procedure/function 안에서만 사용 가능한 IF  (0) 2023.03.22
[MySQL] function  (0) 2023.03.22
[MySQL] 날짜&시간 데이터  (0) 2023.03.21
Contents