일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 아이온큐
- dbeaver
- 테슬라
- API
- Elasticsearch
- api cache
- Docker
- Analyzer
- aqqle
- request cache
- mysql
- Elastic
- NORI
- JPA
- Cache
- aggs
- ann
- file download
- redis
- java crawler
- TSLA
- IONQ
- Query
- java
- Aggregation
- 양자컴퓨터
- vavr
- elasticsearch cache
- Selenium
- KNN
Archives
- Today
- Total
아빠는 개발자
[MySQL] Ngram 본문
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는 기본적으로 두 가지 유형의 매칭을 수행합니다:
- Natural Language Full-Text Searches: 사용자의 검색 질의와 텍스트 열의 내용 간의 유사성을 평가합니다. 이 모드에서는 전체 텍스트 인덱스가 필요합니다.
- Boolean Searches: 사용자가 제시한 검색 질의의 불리언 검색을 수행합니다. 이 모드에서는 전체 텍스트 인덱스가 필요하지 않습니다.
예를 들어, MATCH(column_name) AGAINST('search_query' IN NATURAL LANGUAGE MODE)와 같은 쿼리를 사용하여 NATURAL LANGUAGE MODE를 활용할 수 있습니다.
NATURAL LANGUAGE MODE는 문장의 의미를 이해하고 해당하는 결과를 제공하는 데에 중점을 둡니다. 그러나 성능이나 정확성 측면에서 BOOLEAN MODE보다 제한적일 수 있습니다.
이렇다고 한다.
728x90
반응형
'Database' 카테고리의 다른 글
[Aqqle] SQL (0) | 2024.09.29 |
---|---|
[DB] DBeaver - Public key retrieval is not allowed (0) | 2024.08.11 |
[MySQL] Group by 결과로 sort, 여러 조건을 결과로 sort (0) | 2024.06.11 |
[database] DBeaver 다운로드 (0) | 2024.01.07 |
[MySql] MySQLWorkbench EER diagram 그리기 (0) | 2023.09.02 |