8.5 전문 검색 인덱스(Full text Search Index)
- Def) 전문 검색 인덱스: 문서 전체에 대한 분석과 검색을 위한 인덱싱 알고리즘을 말한다.
- B-Tree인덱스는 실제 칼럼의 값이 1MB 이더라도 1MB 전체의 값을 인덱스 키로 사용하는 게 아니라 1000 바이트(MyISAM) 또는 3072바이트(InnoDB)까지만 잘라서 인덱스 키로 사용한다.
- B-Tree인덱스는전체 일치나 좌측 일부 일치와 같은 검색만 가능하다.
- 문서 내용 전체를 인덱스화해서 특정 키워드가 포함된 문서를 검색하는 전문(FullText )검색에는 InnoDB나 MyISAM 스토리지 엔진에서 제공하는 일반적 용도의 B-Tree인덱스를 사용할 수 없다.
8.5.1 인덱스 알고리즘
- 전문 검색에서는 문서 본문 내용에서 사용자가 검색할 키워드를 분석해서 찾고 빠른 검색용으로 이용할 수 있도록 키워드를 이용해서 인덱싱한다.
- 문서의 키워드를 인덱싱하는 방법에 따라 어근 분석과 n-gram 분석 알고리즘으로 구분 가능하다
8.5.1.1 어근 분석 알고리즘
- 불용어(stop word) 처리: 검색에서 가치없는 단어를 모두 필터링해서 제거하는 작업을 의미한다.
- 불용어란 의미가 없는 단어를 말한다. ex) a, about, ,...
- 참고) https://vision-ai.tistory.com/entry/Stopwords-%EB%B6%88%EC%9A%A9%EC%96%B4
- 현재 MySQL 서버는 불용어가 소스 코드에 정의돼있다.
- 하지만 별도로 불용어를 지정할 수도 있다.
- 어근 분석(Stemming): 검색어로 선정된 단어의 뿌리인 원형을 찾는 작업이다.
- MySQL 서버에서는 오픈 소스 형태소 분석 라이브러리 "MeCab(일본어를 위한 형태소 분석 프로그램, 한국어놔 그나마 비슷)"을 플러그인 형태로 사용할 수 있도록 한다.
- 한글, 일본어의 경우, 단어의 변형 자체는 거의 없어서 어근 분석보다는 문자의 형태소를 분석해서 명사와 조사를 구분하는 기능이 더 중요한 편이다.
- 서구권 언어를 위한 형태소 분석기: MongoDB에서 사용되는 오픈 소스 Snowball
- MeCab을 MySQL 서버에 적용하는 건 어렵지 않으나 한글에 맞게 완성도를 맞추는 작업이 시간이 많이 소모된다.
8.5.1.2 n-gram 알고리즘
- Def) n-gram은 본문을 몇 글자씩 잘라서 인덱싱하는 방법이다.
- n: 인덱싱할 키워드의 최소 글자 수, 일반적으로 2글자 단위로 키워드를 쪼개서 인덱싱하는 2-gram방식이 많이 이용된다.
- MeCab을 이용한 형태소 분석이 전문 검색 알고리즘이므로 만족스러운 결과를 얻기 위해서는 노력이 필요하다.
- 범용적으로 적용하기가 쉽지 않아서 단점을 보완하기 위해 "n-gram"알고리즘이 도입
Ex) 2-gram 알고리즘으로 문장의 토큰 분리 방법
To be or not to be. That is the question.
- 띄어쓰기와 마침표를 기준으로 10개의 단어로 구분한다.
- 2글자씩(????) 중첩해서 토큰으로 분리한다.
- 각 글자가 중첩해서 2글자씩 토큰으로 구분됐다는 뜻이다.
- 10글자 단어라면 10 - 1 개의 토큰으로 구분된다.
- MySQL 서버는 이렇게 생성된 토큰에 대해 불용어를 걸러내는 작업을 수행하는데 이 때 불용어와 동일하거나 불용어를 포함하는 경우 걸러서 버린다.
- 불용어의 예) a, an, about 등
- 최종적으로 MySQL 서버에서 실제 저장되는 인덱스 엔트리는 다음과 같다.
- 아래 표의 "출력" 칼럼에 표시된 것들만 전문 검색 인덱스에 등록된다.
8.5.1.3 불용어 변경 및 삭제
- 위의 사진을 보면 ti, at, ha 같은 토큰은 "a", "i"가 불용어로 등록돼있어서 모두 걸러진다.
- 이런 처리는 혼란을 유발한다.
- 따라서 사용자가 직접 불용어를 등록하는 걸 권장
전문 검색 인덱스의 불용어 처리 무시하는 방법
- 1) 스토리지 엔진와 관계없이 MySQL 서버의 모든 전문 검색 인덱스에 대해 불용어를 완전히 제거한다.
- MySQL 서버의 설정 파일(my.cnf)의 ft_stopword_file 시스템 변수에 빈 문자열을 설정하면 된다.
- ft_stopword_file
- MySQL서버가 시작될 때만 인지하기 때문에 설정을 변경하면 MySQL 서버를 재시작해야 변경사항이 반영됨
- 서버에 내장된 불용어를 비활성화하거나 사용자 정의 불용어를 적용할 때 모두 사용 가능하다.
- 2) InnoDB 스토리지 엔진을 사용하는 테이블의 전문 검색 인덱스에 대해서만 불용어 처리를 무시할 수 있다.
- innodb_ft_enable_stopword 시스템 변수 OFF 설정
- MySQL 서버의 다른 스토리지 엔진을 사용하는 테이블은 여전히 내장 불용어 처리를 사용한다.
- MySQL 서버가 실행중인 상태에서도 변수 설정이 가능하다.
Ex)
SET GLOBAL innodb_ft_ enable_stopword=OFF;
사영자 정의 불용어 사용
- 불용어 목록을 파일로 저장하고 MySQL 서버 설정 파일에서 파일의 경로를 ft_stopword_file='/data/my_custom_stopword.txt'
- InnoDB 스토리지 엔진을 사용하는 테이블의 전문 검색 엔진에서만 사용가능, 불용어 목록을 테이블로 만든다.
출처 - 「Real MySQL 8.0 - 백은빈, 이성욱」 위키북스
'컴퓨터 과학 > [Study] Real MySQL 8.0' 카테고리의 다른 글
Chapter 09.01 옵티마이저(Optimizer)와 힌트 (0) | 2023.01.07 |
---|---|
Chapter 08.08 클러스터링 인덱스(Clustering Index) (1) | 2023.01.04 |
Chapter 08.03 B-Tree 인덱스 (0) | 2022.12.24 |
Chapter 08.01 디스크 읽기 방식 ~ 08.02 인덱스란? (0) | 2022.12.11 |
Chapter 05. 트랜잭션과 잠금 (0) | 2022.12.08 |