728x90
반응형
MySQL에서 FullText 인덱스 검색을 하기 위해서는 MATCH(), AGAINST() 절을 사용해야합니다.
(풀텍스트 인덱스에 대한 설명은 다른 블로그 포스팅을 참고해주세요.)
기존에 dialect는 MySQL5Dialect를 사용하고 있었습니다.
properties.put("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect");
MySQL5Dialect를 커스텀하겠습니다.
package com.moonsiri.config.hibernate.dialect;
import org.hibernate.dialect.MySQL5Dialect;
import org.hibernate.dialect.function.SQLFunctionTemplate;
import org.hibernate.type.StandardBasicTypes;
public class CustomMySQL5Dialect extends MySQL5Dialect {
public CustomMySQL5Dialect() {
super();
registerFunction("match", new SQLFunctionTemplate(StandardBasicTypes.DOUBLE, "MATCH(?1) AGAINST (?2 IN NATURAL LANGUAGE MODE)"));
registerFunction("matchs", new SQLFunctionTemplate(StandardBasicTypes.DOUBLE, "MATCH(?1, ?2) AGAINST (?3 IN NATURAL LANGUAGE MODE)"));
}
}
dialect 속성값을 커스텀한 MySQL5Dialect로 변경합니다.
properties.put("hibernate.dialect", "com.moonsiri.config.hibernate.dialect.CustomMySQL5Dialect");
다음과 같이 사용하면,
public List<PostDTO> findAllByKeyword(String keyword) {
return jpaQueryFactory.select(Projections.constructor(PostDTO.class, postEntity.id, postEntity.title, postEntity.content))
.from(postEntity)
.where(this.searchKeyword(keyword))
.fetch();
}
private BooleanExpression searchKeyword(String keyword) {
if (StringUtils.isBlank(keyword)) {
return null;
}
return Expressions.numberTemplate(Double.class,
"function('matchs', {0}, {1}, {2})", postEntity.title, postEntity.content, keyword).gt(0);
}
아래와 같은 쿼리를 얻을 수 있습니다.
SELECT `id`, `title`, `content`
FROM `post`
WHERE MATCH(`title`, `content`) AGAINST (? IN NATURAL LANGUAGE MODE) > ?
[Reference]
728x90
반응형
'spring > spring jpa' 카테고리의 다른 글
[SpringBoot] JPA Comment (주석 추가) 설정 방법 (0) | 2024.02.02 |
---|---|
[Spring] log4jdbc로 쿼리 실행 결과 로그 출력 (0) | 2023.09.08 |
[SpringBoot] QueryDSL org.apache.jasper.JasperException: Unable to compile class for JSP: (0) | 2023.08.24 |
[SpringBoot2] JPA Master/Slave 구조 분기 처리 (2) | 2023.08.23 |
[SpringBoot] JPA Projection (0) | 2021.06.23 |
댓글