일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Checked Exception
- Unchecked Exception
- Socket is closed
- graphql
- Srping MVC
- Tomcat DBCP
- 데이터 압축
- 바이트 절삭
- AfterMapping
- Reading HttpServletRequest Multiple Times
- 이중정렬
- Jndi DataSource
- try - with - resources
- Java Graphql
- 상호 인증
- Java Rest
- mapstruct
- 개방 폐쇄 원칙
- Request Body 여러 번 사용
- java
- mTLS
- Graphql Client
- NoUniqueBeanDefinitionException
- requestheaderdto
- tomcat jndi
- Sub Bytes
- Java Singleton
- WildFly
- HandlerMethodArgumentResolver
- Open Close Principal
- Today
- Total
Developer Sang Guy
[Mysql]Full Text Search ngram 본문
Mysql Full Text Search는 텍스트 내 공백을 구분 기호로 사용하여 추출 된 토큰을 인덱스로 생성하여 검색에 사용되도록 합니다.
하지만 이는 공백과 같은 구분 기호없이 연속 된 텍스트를 대상으로 조회 할 경우에는 제한이 있습니다.
select content from tb_fts_test where match content against ('ser 구마');
위와 같은 제한은 ngram parser를 사용하여 해결할 수 있습니다.
ngram parser 설정
ALTER TABLE `002`.`tb_fts_test`
ADD FULLTEXT INDEX `IDX1` (`CONTENT`) WITH PARSER ngram VISIBLE;
설정 후 조회 결과
select content from tb_fts_test where match content against ('ser 구마');
ngram은 주어진 텍스트 내용을 아래와 같이 연속 된 문자로 토큰화하여 인덱스로 생성합니다.
텍스트 : abcd
생성 된 인덱스 : ab, bc, cd
위와 같이 인덱스를 생성하므로 완전한 단어가 아닌 일부 단어 만으로도 조회가 가능하게 됩니다.
ngram을 설정한 순간부터 토큰 최소 사이즈는 더 이상 innodb_ft_min_token_size 설정을 바라보지 않고 ngram_token_size 설정을 바라보게 됩니다.
ngram_token_size의 기본 사이즈는 2이며 my.conf에서 1 ~ 10으로 설정 가능합니다.
[mysqld]
ngram_token_size=2
ngram을 설정하면 기본 Full Text Search 기능을 사용할 때와 아래와 같은 변경 사항이 적용됩니다.
공백 처리 변경
ngram은 텍스트를 분석할 때 공백을 제거합니다.
예시 (ngram_token_size = 2)
"ab cd"는 "ab", "cd"로 처리
"a bc"는 "bc"로 처리
불용어 사용 처리 변경
Full Text Search 기능을 사용할 때는 토큰화 된 단어가 STOPWORD에 등록 된 단어와 일치한 경우에만 인덱스 생성이 제한되었지만
ngram을 적용한 이 후에는 STOPWORD가 토큰화 된 단어 안에 포함되어 있을 경우 같이 생성이 제한됩니다.
예시
텍스트 : "a, b"
STOPWORD : "a"
ngram(size=2) 적용 후 생성되는 토큰 : "a," 및 ",b"
결과
"a,"는 STOPWORD에 설정되어 있는 "a"가 포함되어 있어 인덱스로 생성되지 않습니다.
검색 처리 변경
in natural language mode (일반 모드)
select content from tb_fts_test where match content against ('피자는');
결과
ngram에 의해 "피자", "자는" 두 개의 토큰으로 변환되어 검색이 진행되며 1개의 토큰을 포함하고 있는 "고구마 피자"와 2개의 토큰을 포함하고 있는 "피자는 맛있어"가 검색이 됩니다.
in boolean mode
select content from tb_fts_test where match content against ('피자는' in boolean mode);
결과
boolean mode를 사용할 경우 검색어로 사용된 "피자는" 토큰이 온전하게 포함 된 "피자는 맛있어"만 검색이 됩니다.
그 외로 ngram Parser Wildcard Search, ngram Parser Phrase Search 두 개의 검색 처리에 대한 변경 사항이 있지만 이 글에서는 다루지 않겠습니다.
위 두개의 처리에 대해서는 아래 URL에서 확인할 수 있습니다.
https://dev.mysql.com/doc/refman/8.0/en/fulltext-search-ngram.html
'Others' 카테고리의 다른 글
[리눅스 Java] jstat를 활용한GC 모니터링 (0) | 2023.06.16 |
---|---|
[Wildfly] 로그가 안나와요(sl4j 충돌) (0) | 2023.03.30 |
[Mysql]Full Text Search (0) | 2023.02.15 |
[MAVEN] JAR, WAR 생성 시 Resource File Exclude (0) | 2023.01.26 |
[Apache] ServerName, ServerAlias 동작 방식 (0) | 2023.01.12 |