컴퓨터 과학/[Study] Real MySQL 8.0

Chapter 08.04 R-Tree 인덱스 ~ 08.05 전문 검색 인덱스

계란💕 2022. 12. 29. 18:58

 

 

 

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) 처리: 검색에서 가치없는 단어를 모두 필터링해서 제거하는 작업을 의미한다. 
  • 어근 분석(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;

 

 

사영자 정의 불용어 사용

  1. 불용어 목록을 파일로 저장하고 MySQL 서버 설정 파일에서 파일의 경로를 ft_stopword_file='/data/my_custom_stopword.txt'
  2. InnoDB 스토리지 엔진을 사용하는 테이블의 전문 검색 엔진에서만 사용가능, 불용어 목록을 테이블로 만든다. 

 

 

 

 

출처 - 「Real MySQL 8.0 - 백은빈, 이성욱」 위키북스