logo

Ranking

Ranking

  • 검색 시스템은 검색어가 포함된 문서를 찾는 것만으로는 충분하지 않음
  • 사용자들은 검색 결과의 상위 몇 개만 살펴보는 경향이 있음
  • 사용자가 가장 원하는 결과를 가장 위에 보여주는 것이 중요
  • 랭킹의 목적:
    • 관련성이 높은 문서를 상위에 배치
    • 불필요한 문서를 하위로 이동
    • 검색 의도(search intent) 반영
    • 사용자 만족도 향상

Okapi BM25

  • f(q! , D): 문서 D에서 단어 q! 의 빈도
  • |D|: 문서 길이 (avgdl: 평균 길이)
  • k1 : 단어 빈도의 포화(saturation)를 결정하는 하이퍼파라미터(보통 1.2 ~ 2.0)
    • 단어 빈도가 k' 을 넘어가면 점수가 잘 오르지 않음
  • b: 문서 길이의 중요도를 반영하는 하이퍼파라미터(보통 0.75)
    • 커질 수록 문서 길이를 많이 반영, 0이면 문서 길이는 미반영

pg-textsearch 확장 설치

!wget https://github.com/timescale/pg_textsearch/releases/download/v1.1.0/pg-textsearch-v1.1.0-pg17-amd64.zip
!unzip pg-textsearch-v1.1.0-pg17-amd64.zip
!sudo dpkg -i pg-textsearch-postgresql-17_1.1.0-1_amd64.deb
!echo "shared_preload_libraries = 'pg_textsearch'" | \
    sudo tee -a /etc/postgresql/17/main/postgresql.conf
!service postgresql restart
!sudo -u postgres psql -d searchdb -c "CREATE EXTENSION IF NOT EXISTS pg_textsearch;"

BM25로 검색

  • BM25 인덱스
%%sql postgresql+psycopg2://colab:colab@localhost:5432/searchdb
CREATE INDEX idx_title_nouns_pg_textsearch ON wikipages
USING bm25 (title_nouns)
WITH (text_config='simple');
  • "대한민국의 역사" 검색
    • WHERE가 아니라 ORDER BY에 사용
%%sql
SELECT title, title_nouns
FROM wikipages
ORDER BY title_nouns <@> '대한민국 역사'
LIMIT 10;

LIMIT에 따른 차이

  • LIMIT를 설정하면 인덱스를 탐
%%sql
EXPLAIN ANALYZE
SELECT title, title_nouns
FROM wikipages
ORDER BY title_nouns <@> '대한민국 역사'
LIMIT 10;
  • LIMIT가 없으면 모든 문서에 랭킹을 매기므로 인덱스를 타지 않음
%%sql
EXPLAIN ANALYZE
SELECT title, title_nouns
FROM wikipages
ORDER BY title_nouns <@> '대한민국 역사';
Previous
Full Text Search