Custom

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

2개의 포스트

🧠 형태소 분석기와 Analyzer 비교

이 문서는 Elasticsearch에서의 형태소 분석 개념과
다양한 analyzer의 차이를 이해하기 위한 실전 예제를 포함하고 있습니다.


5. 🧠 형태소 분석기란 무엇인가?

  • 형태소 분석기(morphological analyzer)는 문장을 의미 단위(형태소) 로 분리하는 역할을 합니다.
  • Elasticsearch에서는 analyzer를 통해 이 작업을 수행합니다.

⚙️ analyzer 구성 요소

analyzer = tokenizer + filter
  • tokenizer: 문장을 기본 단위로 쪼갬 (예: 단어 기준, n-gram 등)
  • filter: 소문자 변환, 불용어 제거 등 후처리 작업 수행

🇰🇷 nori: 한글 형태소 분석기

  • Elasticsearch에서 제공하는 nori analyzer한국어에 특화된 형태소 분석기입니다.
  • 띄어쓰기만으로 분리하기 어려운 어미, 조사, 접두어, 복합어 등을 처리 가능
  • 예: "삼성전자의 주가는"삼성전자, , 주가,

6. 🔬 다양한 analyzer 비교

테스트 문장

삼성전자의 주가는 7만 원이다.

1️⃣ standard analyzer (기본)

POST http://localhost:9200/_analyze
{
  "analyzer": "standard",
  "text": "삼성전자의 주가는 7만 원이다."
}

📌 결과 예시:

🧮 추천순 점수 공식 직접 설계

이 문서는 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