Elasticsearch에 대해 정리할 때, 우연히 PostgreSQL에 대한 Full Text Search에 대한 포스팅한 글을 보게 되었습니다.
놀랍게도 PostgreSQL에서도 Full Text Search를 지원하고,
놀랍게도 제가 관리하는 페이지에서 데이터를 검색할 때 해당 함수를 이용해서 데이터를 조회를 하였습니다.
저의 무지함에 놀라며, 이번 포스팅에 해당 검색에 대해 조금 알아보려고 합니다.
RDBMS에서 특정 단어에 대한 패턴 검색을 할 경우 LIKE와 와일드카드 '%'을 대게 사용합니다.
SELECT * FROM products WHERE product_name LIKE '%app%';
LIKE 연산자와 '%' 와일드카드는 부분 문자열 일치를 수행합니다. 예를 들면, 'app'이 포함된 문자열을 조회하고자 할 때 'apple', 'apples' 'apply',... 등등 모든 문자열이 참이 됩니다. 그러면 검색을 할 때 해당 연산이 소용이 있을까요? 유저가 app에 대해 검색을 했는데, 사과가 나오면 조금 맛있겠다 생각이 들겠지만, 너무 뜬금없을 거 같아요. 즉, LIKE는 단순히 문자열이 일치하는지 여부를 확인합니다.
또한 단순 문자열 일치 여부만 파악하기 때문에 'running'을 검색하면 'run', 'runs', 'runner'등이 단어에 대한 조회를 놓치게 됩니다. 그리고 양쪽으로 와일드카드를 사용하면 인덱스를 타지 않아서, 데이터 양이 많은 경우 검색 속도가 저하됩니다.
전문 검색(Full-Text Search)
전문 검색(Full Text Search)은 텍스트 데이터에서 정교한 검색을 수행하기 위한 기술로, LIKE와 같은 단순한 패턴 매칭과는 다르게 고급 기능을 제공합니다.
- 검색 정확성: 전문 검색은 형태소 분석, 언어 처리 등을 통해 정교한 검색을 제공합니다. 'apple'을 검색하면 'apples'와 'pineapple'과의 차이를 인식하여 더 정확한 결과를 반환합니다.
- 어간 추출과 언어 처리: 언어 처리를 통해 단어의 기본 형태를 찾고 어간 추출을 통해 다양한 형태의 단어를 하나로 취급합니다. 예를 들면 'run'을 검색하면, 'running', 'runs' 등의 언어들을 조회할 수 있게 됩니다.
- 유사한 단어 검색: 전문 검색은 유사한 단어 검색을 지원합니다. 'cat'을 검색하면, 'cats', 'kittens'등과도 관련된 결과를 찾을 수 있습니다.
- 검색 성능: 전문 검색은 적절한 인덱싱 및 검색 엔진을 활용하여 대용량의 텍스트 데이터에서 효율적으로 검색을 수행할 수 있습니다.
PostgreSQL에서는 to_tsvector와 to_tsquery를 통하여 효율적인 Full-Text 검색을 지원합니다.
to_tsvector 함수는 텍스트를 전문 검색용 벡터로 변환하는 역할을 합니다. 이 함수는 텍스트를 토큰화하고 언어 처리를 적용하여 검색에 사용되는 단어 및 위치 정보를 담은 벡터를 생성합니다.
SELECT to_tsvector('english', 'The quick brown fox jumps over the lazy dog.');
'brown':3 'dog':9 'fox':4 'jump':5 'lazi':8 'quick':2
to_tsquery 함수는 사용자의 검색어를 풀 텍스트 쿼리로 변환합니다. 이 함수는 검색에 사용될 쿼리를 토큰화하고 언어 처리를 적용하여 적절한 쿼리 형식으로 변환합니다.
SELECT to_tsquery('english', 'quick & brown & fox');
'quick' & 'brown' & 'fox'
1. 검색 정확성 테스트
SELECT to_tsvector('english', 'The pineapple is very delicious') @@ to_tsquery('english','apple');
false
2. 어간 추출과 언어 처리 테스트
SELECT to_tsvector('english', 'The quick brown fox jumps over the lazy dog.') @@ to_tsquery('english','jumping');
true
SELECT to_tsvector('english', 'The quick brown fox jumps over the lazy dog.') @@ to_tsquery('english','jumped');
true
3. 유사한 단어 검색 테스트
CREATE TABLE animals (
id SERIAL PRIMARY KEY,
description TEXT
);
INSERT INTO animals
(description)
VALUES
('This is a cat.'),
('Kittens are cute.'),
('Dogs and cats are common pets.');
SELECT to_tsvector('english', description) AS cat_vector
FROM animals
WHERE to_tsvector('english', description) @@ to_tsquery('english', 'cat');
'This is a cat.'
'Kittens are cute.'
'Dogs and cats are common pets.'
4. 검색 성능 테스트
'RDMS > PostgreSQL' 카테고리의 다른 글
[PostgreSQL] 해시 인덱스(Hash Index)에 대해서 - 컴도리돌이 (0) | 2024.08.28 |
---|---|
[PostgreSQL] B-tree index에 대해서 - 컴도리돌이 (2) | 2024.03.28 |
[PostgreSQL] 인덱스 온리 스캔(index only scan)에 대해서 - 컴도리돌이 (1) | 2024.03.27 |
[PostgreSQL] Foreign Key (외래키, 관계 테이블) - 컴도리돌이 (2) | 2024.02.22 |
[PostgreSQL] 날짜 형식 검증 함수 - 컴도리돌이 (0) | 2024.01.18 |