Open jukangpark opened 2 months ago
단어를 인덱스화 : tsvector는 문서에서 단어(토큰)를 추출하고, 이를 효율적으로 검색할 수 있도록 인덱스화합니다. 예를 들어, 문장에서 단어를 추출해 알파벳 순서로 정렬하고 중복된 단어를 제거합니다.
단어의 위치 정보 저장 : tsvector는 단순한 텍스트 인덱스뿐 아니라, 각 단어가 문서 내에서 어느 위치에 등장하는지도 저장합니다. 이를 통해 검색할 때 단어의 순서나 위치에 대한 정보를 활용할 수 있습니다.
SELECT to_tsvector('english', 'This is a test document about PostgreSQL full-text search.');
위 SQL 을 실행하면, PostgreSQL 은 입력된 텍스트를 tsvector 타입으로 변환합니다. 반환 결과는 다음과 같습니다.
'about':5 'document':4 'full':6 'postgresql':7 'search':8 'test':3
위 결과에서 :
tsquery
: 검색어를 표현하는 데이터 타입.
tsvector
: 텍스트 데이터를 변환한 형태.
tsvector는 GIN(Generalized Inverted Index) 또는 GiST(Generalized Search Tree) 인덱스를 사용하여 검색 속도를 최적화할 수 있습니다. 이를 통해 대규모 텍스트 데이터에서 매우 빠른 검색 성능을 제공합니다.
CREATE INDEX idx_posts_fts ON posts USING GIN(to_tsvector('english', post_name || ' ' || content));
이처럼 tsvector를 인덱싱하면 검색 성능이 극적으로 향상됩니다.
여러 테이블에서 검색을 하고자 한다면, JOIN을 사용하여 테이블을 결합한 후 풀 텍스트 서치를 적용할 수 있습니다. 예를 들어, posts 테이블과 comments 테이블을 결합하여 검색할 수 있습니다.
SELECT *
FROM posts
JOIN comments ON posts.id = comments.post_id
WHERE to_tsvector('english', posts.post_name || ' ' || comments.content) @@ to_tsquery('english', '검색어');
위 예시에서는 posts와 comments 테이블을 결합하여 각 테이블의 데이터를 하나의 tsvector로 합친 후 풀 텍스트 검색을 적용하고 있습니다.
Full Text Search 기능에서 tsvector 는 성능을 높이기 위한 핵심 도구이다. tsvector 의 역할은 토크나이즈와 인덱스화 인데, 텍스트 데이터를 토크나이즈 하고, 이를 인덱스하는 과정에서 사용한다. 토크나이즈는 텍스트를 개별 단어(토큰)으로 나누는 작업을 의미하며, 이를 통해 각 단어를 검색 가능한 상태로 변환한다. 토크나이즈는 아래와 같은 이점이 존재한다.
텍스트 검색이나 자연어 처리(NLP)에서 자주 등장하지만 의미상 큰 도움이 되지 않는 단어들을 말한다. 검색 성능을 높이기 위해, 불용어는 텍스트 데이터에서 제거되거나 무시되는 경우가 많다. 불용어는 주로 관사, 접속사, 전치사 등의 기능어로, 문장의 의미 전달에 크게 기여하지 않기 때문에 검색 결과에서 제외된다.
다음은 영어에서 자주 사용되는 불용어의 예시입니다:
• 관사: a, an, the
• 접속사: and, or, but
• 전치사: in, on, at, by
• 대명사: he, she, it, they
예를 들어, 문장이 “This is a sample document about PostgreSQL”라면, 불용어 제거 후에는 중요한 단어들만 남아 “sample document PostgreSQL”과 같이 처리될 수 있습니다.
Is your feature request related to a problem? Please describe.
계정에 대한 검색 기능이 필요함
Describe the solution you'd like
풀 텍스트 서치 Supabase Docs
Describe alternatives you've considered
Additional context