jukangpark / Deskify

Deskify is a social networking platform where people showcase and share their personalized desk setups with others.
https://deskify-bay.vercel.app
3 stars 1 forks source link

검색 기능 (계정, 제품 태그, 게시글 제목(?)) #55

Open jukangpark opened 2 months ago

jukangpark commented 2 months ago

Is your feature request related to a problem? Please describe. image

계정에 대한 검색 기능이 필요함

Describe the solution you'd like

풀 텍스트 서치 Supabase Docs

Describe alternatives you've considered

Additional context

jukangpark commented 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

위 결과에서 :

tsvector 의 주요 용도

tsquery: 검색어를 표현하는 데이터 타입. tsvector: 텍스트 데이터를 변환한 형태.

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를 인덱싱하면 검색 성능이 극적으로 향상됩니다.

요약

jukangpark commented 2 months ago

여러 테이블을 검색하는 방법

1. 방법 JOIN 을 사용하여 여러 데이블을 검색

여러 테이블에서 검색을 하고자 한다면, 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로 합친 후 풀 텍스트 검색을 적용하고 있습니다.

jukangpark commented 2 months ago

Full Text Search 기능에서 tsvector 는 성능을 높이기 위한 핵심 도구이다. tsvector 의 역할은 토크나이즈와 인덱스화 인데, 텍스트 데이터를 토크나이즈 하고, 이를 인덱스하는 과정에서 사용한다. 토크나이즈는 텍스트를 개별 단어(토큰)으로 나누는 작업을 의미하며, 이를 통해 각 단어를 검색 가능한 상태로 변환한다. 토크나이즈는 아래와 같은 이점이 존재한다.

  1. 성능 향상 : 데이터를 사전에 인덱스화 하고, 이를 통해 빠르게 검색할 수 있도록 돕는다.
  2. 정확도 향상 : 불용어 제거, 대소문자 변환, 유사어 처리 등 다양한 정교한 텍스트 분석 기능을 제공하여, 더 정확한 검색 결과를 제공한다.

불용어란? (Stop Words)

텍스트 검색이나 자연어 처리(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”과 같이 처리될 수 있습니다.

불용어의 주요 역할

  1. 검색 성능 향상: 불용어는 자주 등장하지만, 실제로 의미 있는 정보를 전달하지 않으므로 이를 무시하면 데이터 처리량을 줄일 수 있습니다. 따라서 검색 엔진이나 데이터베이스에서 검색 성능이 향상됩니다.
  2. 검색 정확도 개선: 불용어가 제거되면 의미 있는 단어들만 남아 검색 대상이 되므로, 보다 정확한 검색 결과를 제공할 수 있습니다.
  3. 데이터 인덱싱 최적화: 불용어를 인덱싱에서 제외함으로써 불필요한 인덱스 크기를 줄이고, 실제 중요한 단어들만으로 인덱스를 구성하여 검색 속도를 향상시킬 수 있습니다.