MySQL :: Rankings with InnoDB Full-Text Search
Summary Since MySQL 5.6 went GA—where among many other new features, we introduced full-text indexes for the InnoDB storage engine—questions have occasionally come up about InnoDB full-text search relevancy rankings when doing BOOLEAN MODE searches. Ty
dev.mysql.com
Elasticsearch는 검색을 어떻게 하는가?
혹시 이 글을 읽고 잘못된 부분이나, 추가할 부분이 있다면 Comment 부탁드리겠습니다. 01. 개요 Elasticsearch는 저장된 데이터를 탐색, 색인하기 위하여 Apache lucene이라는 full-featured text search engine libra
lazy-programmer.tistory.com
요약
mysql
rank_score = IDF * IDF * TF
- IDF = log10( N / n )
- N : 전체 row 수 (우리 기준 1000만개)
- n : 검색된 키워드가 포함된 row 수
- TF = 해당 Document에 포함된 keyword 수
예시
SELECT id, title, body, MATCH (title) AGAINST ('database' IN BOOLEAN MODE) AS score FROM articles;
| id | title | body |
|---|---|---|
| 1 | database | test1 |
| 2 | database article | test2 |
| 3 | perter pan | test3 |
| 4 | test | test4 |
| 5 | database databate | test5 |
- 공통요소
N = 5 (전체 row 수)
n = 3 (키워드인 database를 포함하는 row의 수 (id = 1,2,5))
IDF = log10(5/3)
- 개별요소
id = 1
- title에 database가 한 개 존재하므로 TF = 1
- id = 2도 같은 이유로 TF = 1
id = 3
- title에 database가 두 개 존재하므로 TF = 2
score = IDF * IDF * TF로 계산
Elastic Search


공식은 복잡하지만 mysql와 사용하는 요소는 비슷하다.
IDF에서 N은 mysql에서의 N과 같고 $n(q_i)$는 n과 같다.
N = 전체 row 수
q_i = 검색된 키워드
n(q_i) = 검색된 키워드가 포함된 row 수
f(q_i,D) = 해당 Document에서 포함된 키워드의 수 (mysql에서의 TF)
k_1, b = 가중 상수. 상수여서 크게 신경 안써도 될듯?
|D| = 현재 Document의 길이
avgdl = 검색된 Document의 평균 길이
'개발 > 이것저것' 카테고리의 다른 글
| RDB와 NoSQL (0) | 2023.05.10 |
|---|---|
| 동기와 비동기 (0) | 2023.05.07 |
| Transaction이란? (0) | 2023.04.23 |
| Circuit Breaker (0) | 2023.04.16 |
| 도커 (Docker) (0) | 2023.03.10 |