MySQL - 풀텍스트 검색: 초보자 가이드

안녕하세요, 미래의 데이터베이스 마법사 여러분! 오늘 우리는 MySQL 풀텍스트 검색의 세계에 흥미로운 여행을 떠납니다. 프로그래밍에 처음이시라도 걱정하지 마세요 - 저는 친절한 안내자로써 복잡한 개념을 작은 조각으로 쉽게 이해할 수 있도록 도와드리겠습니다. 커피(또는 차, 당신이 좋아하는 것)를 한 잔 마시고, 함께 시작해보세요!

MySQL - Fulltext Search

MySQL 풀텍스트 검색이란?

거대한 도서관에서 특정 책을 찾는다고 상상해보세요. 각 책을 하나씩 확인할 수도 있지만, 그것은 영원히 끝나지 않을 것입니다! 이때 풀텍스트 검색이 구원자로 나타납니다. 마치 초고속 도서관 사서가 모든 책을 빠르게 스캔하여 당신이 찾는 것을 정확하게 찾아주는 것과 같습니다.

MySQL 용어로, 풀텍스트 검색은 대량의 텍스트 데이터를 빠르고 효율적으로 검색할 수 있는 강력한 기능입니다. 블로그 게시물이나 제품 설명과 같은 긴 텍스트 필드 내에서 단어나 문구를 검색할 때 특히 유용합니다.

MySQL 풀텍스트 검색의 주요 포인트

코드에 손을 대기 전에, 몇 가지 주요 포인트를 다루겠습니다:

  1. 속도: 풀텍스트 검색은 텍스트 검색에 LIKE 쿼리를 사용하는 것보다 훨씬 빠릅니다.
  2. 관련성: 검색어에 대한 결과를 관련성에 따라 순위를 매깁니다.
  3. 柔軟性: 정확한 문구나 개별 단어를 검색할 수 있습니다.
  4. Stopwords: "the"나 "and"와 같은 일반 단어는 검색 효율성을 높이기 위해 무시됩니다.
  5. 최소 단어 길이: 기본적으로 4자 이하의 단어는 인덱스화되지 않습니다.

풀텍스트 검색의 유형

MySQL은 세 가지 유형의 풀텍스트 검색을 제공합니다:

검색 유형 설명 예시 사용
자연어 모드 기본 모드, 단어와 문구를 검색 "healthy recipes" 검색
부울 모드 연산자를 사용하여 더 복잡한 쿼리 가능 "healthy +recipes -desserts" 검색
쿼리 확장 단어의 의미를 기반으로 검색 확장 "car" 검색 시 "automobile" 결과도 반환

이제 이들 각각을 자세히 살펴보겠습니다!

자연어 모드

이는 기본이자 가장 간단한 풀텍스트 검색 유형입니다. 친구에게 "헬シー한 요리 아이디어가 있어?"라고 물어보는 것과 같습니다.

SELECT * FROM recipes
WHERE MATCH(title, content) AGAINST('healthy recipes');

이 예제에서 MySQL은 'recipes' 테이블의 'title' 또는 'content' 열에 'healthy'와 'recipes'를 포함한 항목을 찾아 관련성에 따라 결과를 순위 매깁니다.

부울 모드

부울 모드는 마치 탐정처럼 MySQL에게 포함하거나 제외할 것을 지정하는 복잡한 쿼리를 가능하게 합니다.

SELECT * FROM recipes
WHERE MATCH(title, content) AGAINST('+healthy +recipes -desserts' IN BOOLEAN MODE);

이 쿼리는 'healthy'와 'recipes'를 포함하고 'desserts'를 제외한 레시피를 찾습니다. '+'는 "포함해야 함"을 의미하고, '-'는 "포함하지 않음"을 의미합니다.

쿼리 확장

쿼리 확장은 마치 검색에 사전을 내장한 것처럼, 정확한 검색어를 포함하지 않은 관련 결과를 찾는 데 유용합니다.

SELECT * FROM recipes
WHERE MATCH(title, content) AGAINST('car' WITH QUERY EXPANSION);

이는 'automobile', 'vehicle' 또는 특정 차 브랜드와 같은 결과를 반환할 수 있습니다.即便单词"car"没有明确提及。

MySQL FULLTEXT 인덱스 생성

풀텍스트 검색을 사용하기 전에, FULLTEXT 인덱스를 생성해야 합니다. 이는 우리의 사서(MySQL)가 사용할 특별한 목록을 만드는 것과 같습니다.

FULLTEXT 인덱스를 생성하는 방법은 다음과 같습니다:

CREATE TABLE articles (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(200),
content TEXT,
FULLTEXT (title, content)
);

이 예제에서 우리는 'title'과 'content' 열에 FULLTEXT 인덱스를 포함한 'articles' 테이블을 생성하고 있습니다.

기존 테이블에 FULLTEXT 인덱스를 추가할 수도 있습니다:

ALTER TABLE articles
ADD FULLTEXT (title, content);

MySQL FULLTEXT 인덱스 제거

occasionally, you might need to remove a FULLTEXT index. It's like telling our librarian, "Thanks, but we don't need that special catalog anymore."

Here's how you can drop a FULLTEXT index:

ALTER TABLE articles
DROP INDEX title;

이 명령은 'articles' 테이블에서 'title'이라는 이름의 FULLTEXT 인덱스를 제거합니다.

클라이언트 프로그램을 사용한 풀텍스트 검색

이제 모든 것을 통합하여 실제 상황에서 풀텍스트 검색을 어떻게 사용할 수 있는지 보겠습니다. 요리 웹사이트에 요리 검색 엔진을 구축하는 것을 상상해보세요.

먼저 테이블을 생성하고 데이터를 추가해보겠습니다:

CREATE TABLE recipes (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(200),
content TEXT,
FULLTEXT (title, content)
);

INSERT INTO recipes (title, content) VALUES
('Healthy Banana Smoothie', 'Blend bananas, yogurt, and honey for a quick and healthy breakfast.'),
('Grilled Chicken Salad', 'Grill chicken breast and toss with fresh greens, tomatoes, and a light vinaigrette.'),
('Chocolate Chip Cookies', 'Mix flour, sugar, butter, and chocolate chips. Bake until golden brown.');

이제 헬シー한 요리를 검색해보겠습니다:

SELECT * FROM recipes
WHERE MATCH(title, content) AGAINST('healthy' IN NATURAL LANGUAGE MODE);

이 쿼리는 'healthy'라는 단어가 제목이나 내용에 포함된 레시피를 반환합니다. 바나나 스무디 요리가 반환됩니다.

보다 복잡한 검색을 부울 모드로 시도해보겠습니다:

SELECT * FROM recipes
WHERE MATCH(title, content) AGAINST('+healthy +quick -chocolate' IN BOOLEAN MODE);

이 쿼리는 헬シー하고 빠른 요리를 찾되, 초콜릿을 포함한 요리는 제외합니다.

이제 MySQL 풀텍스트 검색의 세계에 첫 걸음을 뗐습니다. 연습이 완벽을 만든다는 것을 기억하고, 다양한 쿼리와 검색 모드를 실험해보세요. 얼마 지나지 않아 가장 경험 많은 사서도 부러워할 만한 강력한 검색 기능을 만들어낼 것입니다!

행복한 코딩과 항상 빠르고 정확한 검색을 기원합니다!

Credits: Image by storyset