티스토리 뷰

Spring/Hibernate

PostgreSQL: Full Text Search

Korean Eagle 2024. 3. 20. 22:43
728x90

1. 이론은 대해서는 생략한다.

 

2. MySQL은 index에서 full text 검색을 지원해서 index를 full text로 설정하고 검색 대상이 될 컬럼을 지정해서 인덱스를 만들면 된다.

 

3. PostgreSQL은 약간 다른데 특정한 데이터 타입의 컬럼을 추가하여 그 컬럼을 지정해서 검색하는 방식이다.

 

4. 내용이 별거 없어서 아래 참고하면 된다.

 

5. 사실 스프링을 사용하면 Hibernate에서 full text search를 지원하는데, Apache Lucene 엔진을 사용한다. 하지만, 설정이 필요하고 파일시스템에 저장하는 방식을 사용하기 때문에 간편함을 추구하다가 더 불편해 질 수도 있다. 개인적으로는 데이터베이스에서 지원하는 것을 사용하는 것을 선호하는데 결국 선택의 문제다.

 

# 자연어 검색을 위한 특수한 컬럼을 추가
ALTER TABLE catalog.products ADD COLUMN search_column tsvector;

# 검색이 대상이 될 컬럼들을 묶어서 tsvector로 변환한다. 
UPDATE catalog.products SET search_column = to_tsvector('english', name || ' ' || full_description || ' ' || short_description);

# 인덱스를 생성하여 검색 속도를 높인다.
CREATE INDEX products_search_vector_idx ON catalog.products USING gin(search_column);

# 쿼리를 만들어 사용한다. 여기서는 Samsung을 검색어로 검색하였다.
SELECT * FROM catalog.products WHERE search_column @@ to_tsquery('english', 'Samsung');

# 아래의 스프링 쿼리로 변환하여 사용한다.

    @Query(
        value = "SELECT * " +
                "FROM   catalog.products " +
                "WHERE  search_vector @@ to_tsquery('english', :keyword) " +
                "   AND status='ACTIVE' ",
        nativeQuery = true
    )
    fun findAllWithKeywordFullText(
        keyword: String,
        pageable: Pageable
    ): Page<ProductEntity>
728x90
댓글