Recommend
Recommend 카테고리의 모든 포스트 - 한국어
1개의 포스트
🧮 추천순 점수 공식 직접 설계
이 문서는 Elasticsearch에서 추천순 정렬을 위해 점수(score)를 수학적으로 설계하는 방법을 설명합니다.
BM25
점수와 사용자 행동 데이터(likes
,clicks
) 그리고최신성
을 조합하여 추천 점수를 만들 수 있습니다.
✅ 목표 점수 공식
최종 점수 = BM25 × 인기 점수 + 최신성 점수
- BM25: Elasticsearch 기본 검색 점수
- 인기 점수:
likes
,clicks
를 기반으로 계산 - 최신성 점수:
createdAt
필드를 기반으로 decay 적용
1. 🎯 BM25 (기본 점수)
- 기본적으로
match
,multi_match
쿼리를 사용할 경우 BM25 점수가 자동 계산됩니다. - 정확도 기반 검색에 사용됩니다.
{
"multi_match": {
"query": "카카오",
"fields": ["title^3", "content", "tags^2"]
}
}
2. 📈 인기 점수 수식 (log1p, sqrt)
{
"field_value_factor": {
"field": "likes",
"factor": 1.2,
"modifier": "sqrt",
"missing": 0
}
},
{
"field_value_factor": {
"field": "clicks",
"factor": 0.8,
"modifier": "log1p",
"missing": 1
}
}
sqrt
: 좋아요 수의 증가폭을 완화log1p
: 클릭 수가 많아도 완만하게 점수 증가
3. 🕒 최신성 점수 (decay 함수)
{
"gauss": {
"createdAt": {
"origin": "now",
"scale": "10d",
"decay": 0.4
}
}
}
createdAt
기준으로 점수 감소- 최신 문서일수록 점수가 높고 오래된 문서는 낮아짐
4. ⚙️ score_mode / boost_mode 설정
항목 | 설명 |
---|---|
score_mode | 여러 function 점수를 어떻게 결합할지 (sum, avg 등) |
boost_mode | 기존 _score 와 function 결과 결합 방식 |
추천 공식에 맞는 설정
"score_mode": "sum",
"boost_mode": "multiply"
- 점수 함수끼리는
sum
- 그 결과를 BM25
_score
와×
(multiply)
5. 🧪 전체 예시 쿼리
{
"query": {
"function_score": {
"query": {
"multi_match": {
"query": "카카오",
"fields": ["title^3", "content", "tags^2"]
}
},
"functions": [
{
"field_value_factor": {
"field": "likes",
"factor": 1.2,
"modifier": "sqrt",
"missing": 0
}
},
{
"field_value_factor": {
"field": "clicks",
"factor": 0.8,
"modifier": "log1p",
"missing": 1
}
},
{
"gauss": {
"createdAt": {
"origin": "now",
"scale": "10d",
"decay": 0.4
}
}
}
],
"score_mode": "sum",
"boost_mode": "multiply"
}
}
}
✅ 정리
요소 | 설명 |
---|---|
BM25 | 기본 텍스트 매칭 점수 |
인기 점수 | likes , clicks → sqrt, log1p 적용 |
최신성 점수 | createdAt → decay 적용 |
최종 조합 | score_mode: sum , boost_mode: multiply |