MySQL의 검색 - LIKE, FULLTEXT SEARCH(전문검색)

송준섭 Junseop Song·2023년 11월 29일
1

참고

MySQL like문 (특정 문자 포함되어있는지 검색)

MySQL FullText Search 전문검색 기능 (1) - 인덱싱 방식 - 빌트인 전문 검색 - Stopword

LIKE를 이용한 검색

게시판 제목에 아디다스가 들어가는 게시물을 찾고싶은 경우

select * from tbl_board where title = '아디다스';

이 명령어를 사용하면 제목이 정확히 “아디다스”인 레코드만 뽑아오기 때문에 원하는 결과를 얻을 수 없음 → like문을 사용

아디다스로 시작하는 데이터 검색

select * from tbl_board where title like '아디다스%';

아디다스로 끝나는 데이터 검색

select * from tbl_board where title like '%아디다스';

아디다스가 들어가는 데이터 검색

select * from tbl_board where title like '%아디다스%';

이 방법을 사용할 경우 ‘아디다스’라는 문자열을 받아올 때 trim()으로 공백 제거 하는 것을 추천

그러나 LIKE문을 이용한 검색은 인덱스를 사용하지 못하는 경우가 있음 (앞에 와일드카드(%)를 사용하는 경우 등) → 조회가 느릴 수 있음

FullText Search (전문검색)

게시물의 내용이나 제목 등과 같이 문장이나 문서의 내용에서 키워드를 검색하는 기능

이름이나 별명(닉네임)과 같은 단어에서 일부만 일치하는 사용자를 검색하는 기능으로도 사용할 수 있음

LIKE 기능과 같이 패턴 일치 검색 기능(양쪽에 %%를 사용한)은 인덱스를 사용하지 못할 수도 있지만 전문검색은 일부만 검색하는 경우에도 전문검색 인덱스를 이용하여 더 빠른 검색이 가능함

MySQL에서 전문검색을 활용하려면 테이블을 생성할 때 해당 속성에 FULLTEXT 인덱싱

CREATE TABLE articles (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(200),
    content TEXT,
    FULLTEXT(title, content)  -- title, content에 전문검색 인덱싱
);

이미 있는 테이블의 속성에 인덱싱을 하고싶다면

ALTER TABLE articles ADD FULLTEXT INDEX 인덱스이름 (title, content);  -- 이미 존재하는 articles 테이블의 title, content 속성에 인덱싱

해당 인덱스 삭제 명령

ALTER TABLE article DROP INDEX 인덱스이름

그리고 전문검색을 하기 위해서는 MATCH 연산자와 AGAINST 연산자를 사용할 수 있음

MATCH 연산자

특정 열 또는 열들에서 전문검색을 수행하는 데 사용

보통 WHERE절에서 활용되며, 검색 대상이 되는 열들을 지정

AGAINST 연산자

MATCH 연산자와 함께 사용되며, 검색할 키워드나 구문을 지정

FULLTEXT 인덱스를 기반으로 해당 열에서 특정 키워드와 일치하는 행을 검색

SELECT * FROM articles WHERE MATCH (content) AGAINST ('키워드');

위의 쿼리는 ‘content’ 열에서 ‘키워드’를 포함하는 행을 검색

이 때, MATCH는 검색을 수행할 열(content)을 지정하고, AGAINST는 실제 검색어를 제공

IN BOLLEAN MODE

SELECT * FROM articles WHERE MATCH (content) AGAINST ('+키워드1* -키워드2' IN BOOLEAN MODE);

위와 같이IN BOOLEAN MODE를 사용하면 더 정교한 검색을 할 수 있음

위의 쿼리를 보면,

  • +키워드1: 필수 단어. “키워드1”이라는 단어가 반드시 포함되어야 함
  • 키워드1*: 와일드카드. 단어의 일부분을 나타내거나, 여러 형태의 단어를 포함하는 데 사용. 키워드1로 시작하는 단어를 찾는다는 뜻
  • -키워드2: 제외 단어. 키워드2가 붙은 단어는 검색 결과에서 제외

즉, 위의 쿼리는 ‘키워드1’이라는 단어가 포함되어야 하며, ‘키워드2’라는 단어는 포함되지 않아야 함

IN NATURAL LANGUAGE MODE

기본적으로 MySQL의 FULLTEXT 검색에서 사용되는 모드

사용자가 제공한 검색어에 따라 일치하는 결과를 반환하는 데 사용

단어의 중요도에 따라 검색 결과를 반환하는 데 중점을 둠

SELECT * FROM articles WHERE MATCH (content) AGAINST ('키워드' IN NATURAL LANGUAGE MODE);

위 쿼리는 ‘articles’ 테이블의 ‘content’열에서 ‘키워드’라는 문구를 포함하는 행을 검색

사용자가 입력한 검색어에 따라 유사성을 평가하고 가장 일치하는 결과부터 반환

검색어의 중요도를 고려하여 결과를 제공

WITH QUERY EXPANSION MODE

검색 결과를 확장하여 관련성이 높은 추가 검색어를 포함하여 결과를 반환

검색어를 기반으로 연관된 단어나 구문을 찾아서 검색 결과를 확장

SELECT * FROM articles WHERE MATCH (content) AGAINST ('키워드' WITH QUERY EXPANSION);

위 쿼리는 ‘articles’ 테이블의 ‘content 열에서 '키워드'라는 문구를 포함하는 행을 검색하는 것

NATURAL LANGUAGE MODE보다 검색 결과를 확장하여 관련성이 높은 추가 검색어를 포함하여 결과를 반환

NATURAL LANGUAGE MODE는 입력된 검색어와 가장 일치하는 결과를 반환하는 반면, WITH QUERY EXPANSION은 입력된 검색어를 확장하여 연관된 검색어를 추가하여 더 다양한 결과를 반환

0개의 댓글