Score

Score 카테고리의 모든 포스트 - 한국어

3개의 포스트

🎯 검색 점수 튜닝 실습 예제

이 문서는 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. 검색어 → 클릭률 분석

예시:

검색어검색 횟수클릭 횟수클릭률 (%)
카카오1004040%
삼성805062.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로 클릭 수 기반 가중치 부여

🧠 검색 점수 분석: explain 활용하기

이 문서는 ?explain=true를 사용하여 검색 점수(BM25 등)의 계산 근거를 파악하는 방법을 설명합니다.
어떤 문서가 왜 높은 점수를 받았는지 이해하고, 검색 품질을 향상시키는 데 중요한 역할을 합니다.


✅ 1. explain 파라미터란?

검색 API 호출 시 쿼리 파라미터에 ?explain=true를 추가하면,
각 문서의 _score가 어떻게 계산되었는지 자세한 설명이 함께 반환됩니다.

예시 호출

GET /posts/_search?explain=true
{
  "query": {
    "match": {
      "title": "카카오"
    }
  }
}

📊 2. BM25 점수 계산 요소

BM25는 기본적으로 다음 3가지 요소로 점수를 계산합니다: