GN⁺: PostgreSQL로 검색 엔진 만들기
(xata.io)- PostgreSQL 자체 검색 엔진을 만들기 위한 구성 요소 제공
- 주요 구성 요소는 tsvector 및 tsquery 데이터 유형, 일치 연산자 @@, 일치 결과 순위 매기기 함수 및 GIN 인덱스 유형
- tsvector는 정규화된 어휘와 원본 텍스트에서의 위치를 저장
- tsquery는 정규화된 쿼리를 나타내며 논리 연산자를 사용하여 여러 용어를 결합할 수 있음
- GIN 인덱스 유형은 tsvector의 효율적인 쿼리를 위해 사용됨
- ts_rank 및 ts_rank_cd는 용어 빈도와 근접성을 고려하는 순위 매기기 함수
- 관련성 조정을 통해 특정 기준에 따라 검색 결과를 사용자 정의할 수 있음
- 숫자, 날짜 및 정확한 값 부스터를 순위 점수에 추가할 수 있음
- 열 가중치를 할당하여 검색 결과에서 특정 용어를 우선시할 수 있음
- 제목 열에 setweight를 사용하면 "jedi"라는 단어가 포함된 영화 제목의 순위가 향상됨
- PostgreSQL은 직접적으로 퍼지 검색이나 오타 허용을 지원하지 않지만 유사성이나 Levenshtein 거리를 사용하여 구현할 수 있음
- 사용자가 검색 범위를 좁히는 데 도움이 되는 패싯 검색은 카테고리 정의 또는 알고리즘을 사용하여 PostgreSQL에서 구현할 수 있음
- 이 기사는 Elasticsearch와의 자세한 비교가 제2부에서 이루어질 것을 언급하며 마무리됨
Hacker News 의견
- PostgreSQL와 Elasticsearch를 비교하는 제2부에 대한 기대감
- CRUD 및 검색을 위해 PostgreSQL과 Elasticsearch를 동기화하는 노력을 과소평가했습니다.
- 검색 엔진은 빠른 검색 속도가 필요합니다. 이는 단순히 이론상으로만 중요한 것이 아닙니다.
- 기본적인 CS 알고리즘과 하드웨어 활용으로 기본 데이터베이스와 검색 엔진을 쉽게 생성할 수 있습니다.
- 검색의 주관적인 특성이 가장 큰 도전입니다.
- Postgres는 임베딩을 통해 관련 콘텐츠를 찾기 위해 pgvector와 결합될 수 있습니다.
- Postgres 내부 검색은 CPU 부하가 크며, 트랜잭션 업데이트가 우선되어야 합니다.
- ES와 Solr 클러스터는 재인덱싱 중에 높은 CPU 사용률로 작동합니다.
- 검색, 재귀 조인 및 벡터를 위한 PG 확장은 사이드 프로젝트에 재미있고 간단합니다.
- SQLite도 고급 인덱싱 및 어간 추출 기능을 제공합니다.
- 비즈니스 로직을 데이터베이스로 추상화하지만, 트레이드오프는 언급되지 않았습니다.
- 특정 북마크된 사이트를 위해 사용자 정의 검색 엔진을 실행하는 것을 고려하고 있습니다.
- Postgres/Elasticsearch 또는 상용 솔루션을 선택해야 할지에 대한 호기심이 있습니다.
- "고급"이라는 단어는 긍정적인 지표로 간주됩니다.