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 <@> '대한민국 역사';
퀴즈
랭킹의 목적으로 적절하지 않은 것은?
퀴즈를 풀려면 대화형 기능을 불러와야 합니다.