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 |