아빠는 개발자

[MySQL] Ngram 본문

Database

[MySQL] Ngram

father6019 2024. 1. 7. 01:47
728x90
반응형

MySQL의 fulltext 검색 알고리즘

 

일단 Ngram 이란??

N-gram은 통계학 기반의 언어 모델 중 하나

N-gram 언어 모델은 이처럼 다음 단어를 예측할 때 문장 내 모든 단어를 고려하지 않고 특정 단어의 개수(N)만 고려

즉, N-gram은 N개의 연속적인 단어의 나열을 하나의 묶음(=token)으로 간주

 

"오늘 점심 추천 메뉴: 파스타, 피자"

 

  모델명 구현 결과
1 Unigram(N=1) 오늘, 점심, 추천, 메뉴, 파스타, 피자
2 Bigram(N=2) 오늘 점심, 점심 추천, 추천 메뉴, 메뉴 파스타, 파스타 피자
3 Trigram(N=3) 오늘 점심 추천, 점심 추천 메뉴, 추천 메뉴 파스타, 메뉴 파스타 피자
4 4-gram(N=4) 오늘 점심 추천 메뉴, 점심 추천 메뉴 파스타, 추천 메뉴 파스타 피자

 

테스트

CREATE TABLE IF NOT EXISTS `doo` (
  `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  `title` VARCHAR(100) NOT NULL,  
  `reg_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`), 
  FULLTEXT INDEX `ft_idx_title` (`title`)  WITH PARSER `ngram`
);

 

 

데이터 삽입 

INSERT INTO doo(title) VALUES('전밍키 십새끼 뒤지고 싶냐?');

 

set

 set global innodb_ft_aux_table = 'shop/doo';

 

 

SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_CACHE;

저장된 토큰

 

쿼리

SELECT * FROM doo  WHERE MATCH(title) AGAINST("십새끼");

 

쿼리결과

 

 

 

 

ngram Full-Text Parser

mysql> USE test;

mysql> CREATE TABLE articles (
      id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
      title VARCHAR(200),
      body TEXT,
      FULLTEXT (title,body) WITH PARSER ngram
    ) ENGINE=InnoDB CHARACTER SET utf8mb4;

mysql> SET NAMES utf8mb4;

INSERT INTO articles (title,body) VALUES
    ('数据库管理','在本教程中我将向你展示如何管理数据库'),
    ('数据库应用开发','学习开发数据库应用程序');

mysql> SET GLOBAL innodb_ft_aux_table="test/articles";

mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_CACHE ORDER BY doc_id, position;

 

 

 

 

 

CREATE TABLE articles (
      id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
      title VARCHAR(200),
      body TEXT
     ) ENGINE=InnoDB CHARACTER SET utf8mb4;

ALTER TABLE articles ADD FULLTEXT INDEX ft_index (title,body) WITH PARSER ngram;

# Or:

CREATE FULLTEXT INDEX ft_index ON articles (title,body) WITH PARSER ngram;

 

https://dev.mysql.com/doc/refman/8.0/en/fulltext-search-ngram.html 

 

MySQL에서는 BOOLEAN MODE 외에도 NATURAL LANGUAGE MODE를 사용할 수 있습니다. 이 모드는 사용자의 질의에 대한 텍스트 매칭을 수행합니다.

NATURAL LANGUAGE MODE는 기본적으로 두 가지 유형의 매칭을 수행합니다:

  1. Natural Language Full-Text Searches: 사용자의 검색 질의와 텍스트 열의 내용 간의 유사성을 평가합니다. 이 모드에서는 전체 텍스트 인덱스가 필요합니다.
  2. Boolean Searches: 사용자가 제시한 검색 질의의 불리언 검색을 수행합니다. 이 모드에서는 전체 텍스트 인덱스가 필요하지 않습니다.

예를 들어, MATCH(column_name) AGAINST('search_query' IN NATURAL LANGUAGE MODE)와 같은 쿼리를 사용하여 NATURAL LANGUAGE MODE를 활용할 수 있습니다.

NATURAL LANGUAGE MODE는 문장의 의미를 이해하고 해당하는 결과를 제공하는 데에 중점을 둡니다. 그러나 성능이나 정확성 측면에서 BOOLEAN MODE보다 제한적일 수 있습니다.

 

 

이렇다고 한다. 

728x90
반응형