Tuning
Tuning 카테고리의 모든 포스트 - 한국어
2개의 포스트
🎯 검색 점수 튜닝 실습 예제
이 문서는
function_score
쿼리를 활용하여 검색 결과의 relevance score를 커스터마이징하는 실습 예제입니다.
클릭수, 좋아요, 최신성 등을 반영한 복합 점수 계산 전략을 설명합니다.
1. ⚙️ function_score 기본 구조
function_score
쿼리는 검색 점수를 수식 기반으로 조절할 수 있습니다.
{
"query": {
"function_score": {
"query": { "match": { "title": "카카오" } },
"functions": [
...
],
"score_mode": "sum",
"boost_mode": "multiply"
}
}
}
query
: 기본 검색 조건functions
: 가중치나 decay 함수 등 적용score_mode
: 여러 함수의 결과를 합산, 평균 등으로 결합boost_mode
: 기존 점수와 함수 점수를 어떻게 합칠지 결정
2. 💡 likes, clicks 기반 가중치 예시
"functions": [
{
"field_value_factor": {
"field": "likes",
"factor": 1.5,
"modifier": "sqrt",
"missing": 0
}
},
{
"field_value_factor": {
"field": "clicks",
"factor": 0.5,
"modifier": "log1p",
"missing": 1
}
}
]
likes
: 제곱근 기반 증가clicks
: 로그 기반 완만한 증가
3. 🕒 createdAt 기반 최신 문서 선호 (decay 함수)
{
"gauss": {
"createdAt": {
"origin": "now",
"scale": "10d",
"decay": 0.5
}
}
}
- 최신 문서일수록 점수가 높고, 오래될수록 자연스럽게 감소
scale
: 감소가 시작되는 거리decay
: 감소 비율
4. ⚖️ boost_mode와 score_mode 조합
score_mode | 의미 |
---|---|
sum | 함수 결과 모두 더함 |
avg | 평균값 사용 |
max | 가장 큰 값만 사용 |
multiply | 모두 곱함 (값이 0이면 전체 점수 0됨) |
first | 첫 번째 함수만 사용 |
boost_mode | 기존 _score 와의 결합 방식 |
---|---|
multiply | _score * function_score |
sum | _score + function_score |
replace | _score 무시하고 function 사용 |
avg | 평균 사용 |
max/min | 큰 값 또는 작은 값 사용 |
✅ 전체 예시 쿼리
{
"query": {
"function_score": {
"query": {
"match": {
"title": "카카오"
}
},
"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": "15d",
"decay": 0.4
}
}
}
],
"score_mode": "sum",
"boost_mode": "multiply"
}
}
}
📌 요약
요소 | 설명 |
---|---|
function_score | 점수 계산 방식 커스터마이징 |
field_value_factor | 숫자 필드 기반 가중치 반영 |
gauss | 최신성 점수 반영 (decay) |
score_mode | 여러 function 결합 방식 (sum , avg 등) |
boost_mode | 기존 점수와 결합 방식 (multiply , replace 등) |
📊 검색 로그 기반 점수 튜닝 전략
이 문서는 사용자의 검색 로그(search logs) 를 활용하여
검색 점수를 튜닝하고 추천 기능을 강화하는 전략을 설명합니다.
✅ 1. search_logs 인덱스 구성 예시
{
"mappings": {
"properties": {
"query": { "type": "keyword" },
"clicked_doc_id": { "type": "keyword" },
"timestamp": { "type": "date" },
"user_id": { "type": "keyword" }
}
}
}
- 각 로그는 사용자가 어떤 검색어로 어떤 문서를 클릭했는지를 기록
clicked_doc_id
기준으로 클릭 빈도 집계 가능
📈 2. 검색어 → 클릭률 분석
예시:
검색어 | 검색 횟수 | 클릭 횟수 | 클릭률 (%) |
---|---|---|---|
카카오 | 100 | 40 | 40% |
삼성 | 80 | 50 | 62.5% |
- 클릭률이 높은 검색어는 추천 검색어로 활용 가능
- 특정 문서가 어떤 검색어에 자주 클릭되는지 분석해 점수 반영
🔍 3. 인기 키워드 추출
{
"size": 0,
"aggs": {
"popular_queries": {
"terms": {
"field": "query",
"size": 10
}
}
}
}
- 최근 n일 동안 가장 많이 검색된 키워드 집계 가능
✨ 4. 추천어 생성 예시
카
입력 시 → [“카카오”, “카드”, “카메라”] 추천- 인기 키워드를 기반으로 prefix 매칭 추천어 생성 가능
🛠️ 5. 오타 교정 (Did You Mean)
{
"suggest": {
"text": "kakaoo",
"spellcheck": {
"term": {
"field": "query"
}
}
}
}
- 실제 로그에 존재하는 단어를 기준으로 오타 보정 가능
did_you_mean
기능 구현 가능
🚀 6. 클릭 수 기반 추천 점수 반영
방법 1: 검색 쿼리에서 function_score 사용
{
"query": {
"function_score": {
"query": {
"match": {
"title": "카카오"
}
},
"field_value_factor": {
"field": "click_count",
"modifier": "log1p",
"missing": 0
},
"boost_mode": "multiply"
}
}
}
- 클릭 횟수가 높은 문서일수록 가중치가 올라감
- 로그 데이터를 집계해
click_count
필드로 인덱싱해야 함
✅ 요약
전략 항목 | 설명 |
---|---|
search_logs 인덱스 | 검색어, 클릭 문서, 시간, 사용자 ID 등 기록 |
클릭률 기반 분석 | 검색어 → 클릭률 계산 → 인기 검색어 추출 |
추천어 생성 | 자주 검색된 검색어 기반 자동완성 구현 가능 |
오타 교정 | 자주 등장한 검색어 기반 "Did You Mean" 구현 가능 |
점수 반영 | function_score 로 클릭 수 기반 가중치 부여 |