Open danbi5228 opened 1 year ago
sync
; 캐시나 버퍼의 내용을 디스크와 동기화echo 3 > /proc/sys/vm/drop_caches
; 운영체제에 포함된 캐시의 내용을 초기화SET GLOBAL Innodb_buffer_pool_load_at_startup=OFF;
SET GLOBAL Innodb_buffer_pool_dump_at_startup=OFF;
MySQL 서버의 대표적인 확장 검색기능인 전문 검색과 공간 검색 기능
전문 검색은
MySQL 서버 같은 RDBMS에서 인덱스라고 하면 보통 B-TREE 자료 구조를 사용해 짧은 단어를 검색하는 것으로 생각한다
하지만 예전부터 용량이 큰 문서를 단어 수준으로 잘게 쪼개어 문서 검색을 하게 해주는 기능이 있었고 이러한 검색을 전문 검색이라 한다
8.0 이전 버전에서는 일부 스토리지 엔진을 사용하는 테이블만 전문 검색을 활용할 수 있었고
8.0에서는 가장 사용률이 높은 InnoDB 스토리지 엔진에서도 사용할 수 있게 개선됨
문서의 단어들을 분리해서 형태소를 찾고 그 형태소를 인덱싱하는 방법은 서구권 언어에 적합하지 한국어, 중국어, 일본어에는 적합하지 않다
이런 단점을 보완하기 위해 8.0버전에서 n-gram 파서가 도입됐다
MySQL 서버에서는 2가지 알고리즘을 이용해 인덱싱할 토큰을 분리해낸다
형태소 분석
하지만 MySQL 서버에서는 단순히 띄어쓰기 기준으로 토큰을 분리해서 인덱싱
n-gram
문장 자체에 대한 이해 없이 띄어쓰기 단위로 분리하고, 그 단어를 주어진 길이(1~10)로 쪼개서 인덱싱
n 값은 ngram_token_size 시스템 변수로 설정할 수 있다
읽기 전용이며, MySQL 서버의 설정 파일을 이용해 서버가 시작될 때만 변경할 수 있다
길이에 따라서 1이면 uni-Gram, 2이면 bi-gram, 3이면 tri-gram이라고 함
가장 일반적으로 bi나 tri-gram이 사용됨
주의할 점
WITH PARSER ngram
옵션이 있어야 n-gram 파서를 사용하는데 없으면 기본 파서(공백으로 구분)를 사용하게됨책에 쿼리를 보면, 조회가 된 경우
조회가 안된 경우
결론은
검색 불가능 : 검색어의 길이 < ngram_token_size
검색 가능 : 검색어의 길이 >= ngram_token_size
그리고 단어의 시작 부분이 아니고 중간이나 마지막 부분도 n-gram이 검색할 수 있다는 것이 중요한 특징이다
218~219p 표를 보면 ngram_token_size=2 일 때 1글자인 '이'는 버려짐
n-gram 파서는 전문 검색 인덱스를 생성할 때 말고도 쿼리의 전문 검색에서도 사용된다
SELECT COUNT(*) FROM tb_bi_gram
WHERE MATCH(title, body) AGAINST ('단편적인' IN BOOLEAN MODE);
ngram_token_size=2 일 때 이미 2글자씩 토큰을 잘라서 인덱스에 저장하고 있는데
어떻게 4글자의 검색어를 이용해서 결과를 찾을 수 있나?
주의할 점
다음 스터디
2023-04-~17~ 26 pm 10:10 ~월요일~ 수요일
정리 범위