Loading...
MySQL 9.5 Reference Manual 9.5의 14.9.8 ngram Full-Text Parser의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
내장된 MySQL 전문(Full-Text) 파서는 단어 사이의 공백을 구분자로 사용하여 단어의 시작과 끝을 결정하는데, 이는 단어 구분 기호를 사용하지 않는 표의문자 언어(ideographic languages)를 다룰 때 제약이 됩니다. 이 제약을 해결하기 위해 MySQL은 Chinese, Japanese, Korean (CJK)을 지원하는 ngram 전문 파서를 제공합니다. ngram 전문 파서는 InnoDB 및
MyISAM과 함께 사용할 수 있습니다.
참고
MySQL은 또한 Japanese용 MeCab 전문 파서 플러그인을 제공하며, 이 플러그인은 문서를 의미 있는 단어로 토크나이징합니다. 자세한 내용은 Section 14.9.9, “MeCab Full-Text Parser Plugin”을 참조하십시오.
ngram은 주어진 텍스트 시퀀스로부터 얻은 연속된 _n_개의 문자 시퀀스입니다. ngram 파서는 텍스트 시퀀스를 연속된 _n_개의 문자 시퀀스로 토크나이징합니다. 예를 들어, ngram 전문 파서를 사용하여 “abcd”를 서로 다른 n 값에 대해 토크나이징할 수 있습니다.
1n=1: 'a', 'b', 'c', 'd' 2n=2: 'ab', 'bc', 'cd' 3n=3: 'abc', 'bcd' 4n=4: 'abcd'
ngram 전문 파서는 내장 서버 플러그인입니다. 다른 내장 서버 플러그인과 마찬가지로, 서버가 시작될 때 자동으로 로드됩니다.
Section 14.9, “Full-Text Search Functions”에 설명된 전문 검색 구문은 ngram 파서 플러그인에도 적용됩니다. 파싱 동작의 차이점은 이 섹션에 설명되어 있습니다. minimum 및 maximum word length 옵션(
innodb_ft_min_token_size,
innodb_ft_max_token_size,
ft_min_word_len,
ft_max_word_len)을 제외한 전문 검색 관련 구성 옵션도 적용 가능합니다.
ngram 파서의 기본 ngram 토큰 크기는 2(bigram)입니다. 예를 들어, 토큰 크기가 2인 경우, ngram 파서는 문자열 “abc def”를 네 개의 토큰 “ab”, “bc”, “de”, “ef”로 파싱합니다.
ngram 토큰 크기는 minimum 값 1, maximum 값 10을 갖는
ngram_token_size 구성 옵션을 사용하여 설정할 수 있습니다.
일반적으로, ngram_token_size는 검색하려는 토큰 중 가장 큰 크기로 설정합니다. 단일 문자만 검색하려는 경우, ngram_token_size를 1로 설정하십시오. 더 작은 토큰 크기는 더 작은 전문 검색 인덱스와 더 빠른 검색을 제공합니다.
둘 이상의 문자로 구성된 단어를 검색해야 하는 경우,
ngram_token_size를 그에 맞게 설정하십시오. 예를 들어, “Happy Birthday”는 simplified Chinese로
“生日快乐”이며, 여기서
“生日”는 “birthday”를 의미하고,
“快乐”는 “happy”로 번역됩니다. 이와 같이 두 글자로 된 단어를 검색하려면
ngram_token_size를 2 이상으로 설정하십시오.
읽기 전용 변수이므로,
ngram_token_size는 startup 문자열의 일부이거나 구성 파일에서만 설정할 수 있습니다:
1mysqld --ngram_token_size=2
1[mysqld] 2ngram_token_size=2
참고
다음 minimum 및 maximum word length 구성 옵션은 ngram 파서를 사용하는 FULLTEXT 인덱스에 대해서는 무시됩니다:
innodb_ft_min_token_size,
innodb_ft_max_token_size,
ft_min_word_len,
ft_max_word_len.
ngram 파서를 사용하는 FULLTEXT 인덱스를 생성하려면,
CREATE TABLE,
ALTER TABLE, 또는
CREATE INDEX에서 WITH PARSER ngram을 지정합니다.
다음 예제는 ngram``FULLTEXT 인덱스가 있는 테이블을 생성하고,
샘플 데이터(Simplified Chinese 텍스트)를 insert한 후,
Information Schema의
INNODB_FT_INDEX_CACHE 테이블에서 토크나이징된 데이터를 조회하는 방법을 보여줍니다.
1mysql> USE test; 2 3mysql> CREATE TABLE articles ( 4 id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, 5 title VARCHAR(200), 6 body TEXT, 7 FULLTEXT (title,body) WITH PARSER ngram 8 ) ENGINE=InnoDB CHARACTER SET utf8mb4; 9 10mysql> SET NAMES utf8mb4; 11 12INSERT INTO articles (title,body) VALUES 13 ('数据库管理','在本教程中我将向你展示如何管理数据库'), 14 ('数据库应用开发','学习开发数据库应用程序'); 15 16mysql> SET GLOBAL innodb_ft_aux_table="test/articles"; 17 18mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_CACHE ORDER BY doc_id, position;
기존 테이블에 FULLTEXT 인덱스를 추가하려면,
ALTER TABLE 또는
CREATE INDEX를 사용할 수 있습니다. 예를 들어:
1CREATE TABLE articles ( 2 id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, 3 title VARCHAR(200), 4 body TEXT 5 ) ENGINE=InnoDB CHARACTER SET utf8mb4; 6 7ALTER TABLE articles ADD FULLTEXT INDEX ft_index (title,body) WITH PARSER ngram; 8 9# Or: 10 11CREATE FULLTEXT INDEX ft_index ON articles (title,body) WITH PARSER ngram;
ngram 파서는 파싱 시 공백을 제거합니다. 예를 들면:
내장 MySQL 전문 파서는 단어를 스톱워드 목록의 항목과 비교합니다. 단어가 스톱워드 목록의 항목과 동일하면, 그 단어는 인덱스에서 제외됩니다. ngram 파서의 경우 스톱워드 처리 방식이 다르게 수행됩니다. 스톱워드 목록의 항목과 동일한 토큰을 제외하는 대신, ngram 파서는 스톱워드를 포함하는 토큰을 제외합니다.
예를 들어,
ngram_token_size=2라고 가정하고, 문서에 “a,b”가 포함되어 있으면, 이 문자열은 “a,”와 “,b”로 파싱됩니다. 콤마(“,”)가 스톱워드로 정의되어 있다면, “a,”와 “,b”는 둘 다 콤마를 포함하므로 인덱스에서 제외됩니다.
기본적으로, ngram 파서는 English 스톱워드 목록을 포함하는 기본 스톱워드 목록을 사용합니다. Chinese, Japanese, Korean에 적용할 수 있는 스톱워드 목록을 사용하려면 자체적으로 생성해야 합니다. 스톱워드 목록 생성 방법에 대한 정보는 Section 14.9.4, “Full-Text Stopwords”를 참조하십시오.
ngram_token_size보다 긴 스톱워드는 무시됩니다.
natural language mode 검색의 경우, 검색 term은 ngram term의 union으로 변환됩니다. 예를 들어, 문자열 “abc”(여기서
ngram_token_size=2라고 가정)는 “ab bc”로 변환됩니다. “ab”를 포함하는 문서 하나와 “abc”를 포함하는 문서 하나가 있을 때, 검색 term “ab bc”는 두 문서 모두와 일치합니다.
_boolean mode search_의 경우, 검색 term은 ngram phrase search로 변환됩니다. 예를 들어, 문자열 'abc'(
ngram_token_size=2라고 가정)는 '“ab bc”'로 변환됩니다. 'ab'를 포함하는 문서 하나와 'abc'를 포함하는 문서 하나가 있을 때, 검색 phrase '“ab bc”'는 'abc'를 포함하는 문서와만 일치합니다.
ngram FULLTEXT 인덱스에는 ngram만 포함되고 term의 시작 위치 정보는 포함되지 않기 때문에, 와일드카드 검색은 예상치 못한 결과를 반환할 수 있습니다. ngram FULLTEXT 검색 인덱스를 사용하는 와일드카드 검색에는 다음 동작이 적용됩니다:
와일드카드 검색의 prefix term이 ngram 토큰 크기보다 짧은 경우, 쿼리는 prefix term으로 시작하는 ngram 토큰을 포함하는 모든 인덱스 row를 반환합니다. 예를 들어,
ngram_token_size=2라고 가정하면,
“a*”에 대한 검색은 “a”로 시작하는 모든 row를 반환합니다.
와일드카드 검색의 prefix term이 ngram 토큰 크기보다 긴 경우, prefix term은 ngram phrase로 변환되고 와일드카드 연산자는 무시됩니다. 예를 들어,
ngram_token_size=2라고 가정하면,
“abc*” 와일드카드 검색은 “ab bc”로 변환됩니다.
Phrase 검색은 ngram phrase 검색으로 변환됩니다. 예를 들어, 검색 phrase “abc”는 “ab bc”로 변환되며, 이는 “abc”와 “ab bc”를 포함하는 문서를 반환합니다.
검색 phrase “abc def”는 “ab bc de ef”로 변환되며, 이는 “abc def” 및 “ab bc de ef”를 포함하는 문서를 반환합니다. “abcdef”를 포함하는 문서는 반환되지 않습니다.
14.9.7 Adding a User-Defined Collation for Full-Text Indexing
14.9.9 MeCab Full-Text Parser Plugin