[Elasticsearch] 정확도(Relevancy)와 검색 최적화
Elasticsearch의 정확도(Relevancy)와 스코어(Score) 점수 이해하기
검색 엔진에서 검색 결과를 얼마나 정확하게 반환하는지가 매우 중요합니다. RDBMS와 같은 시스템은 단순히 쿼리 조건을 만족하는 결과를 반환하지만, Elasticsearch는 검색 결과의 **정확도(연관성, relevancy)**를 기반으로 가장 적절한 문서를 먼저 보여줍니다. 이번 글에서는 Elasticsearch의 **정확도와 점수(score)**가 어떻게 계산되는지, 그리고 검색 결과의 순위를 결정하는 BM25 알고리즘을 통해 이를 어떻게 최적화할 수 있는지 설명하겠습니다.
1. 정확도(Relevancy)란?
🔹 정확도의 개념
**Relevancy(렐러번시, 연관성)**는 검색 결과가 입력된 검색 조건과 얼마나 정확하게 일치하는지를 나타냅니다. RDBMS는 검색 조건에 부합하는 데이터만 반환할 뿐, 어떤 데이터가 더 적절한지를 평가하는 기능이 없습니다. 반면, Elasticsearch는 각 검색 결과의 정확도를 평가하여, 사용자가 원하는 정보를 우선적으로 제공할 수 있습니다.
🔹 검색 엔진에서 정확도의 중요성
예를 들어, 구글이나 네이버 같은 웹 검색엔진을 사용할 때 사용자는 수많은 검색 결과를 보게 됩니다. 이때, 단순히 검색어가 포함된 웹페이지가 아니라, 사용자가 원하는 정보와 가장 연관성이 높은 웹페이지가 상위에 노출됩니다. Elasticsearch도 같은 원리로 동작합니다.
✅ 예시
👉 검색어: "엘라스틱서치 튜토리얼"
👉 일반적인 RDBMS의 결과: "엘라스틱서치에 대한 간단한 설명" / "튜토리얼 사이트 모음"
👉 Elasticsearch의 결과: "엘라스틱서치를 처음 배우는 사람을 위한 완벽한 튜토리얼" ✅
Elasticsearch는 사용자가 원하는 정보를 보다 정밀하게 제공하기 위해 검색 정확도를 기반으로 점수를 매깁니다.
2. 스코어(Score) 점수란?
Elasticsearch의 검색 결과는 각 문서가 검색어와 얼마나 밀접하게 관련이 있는지를 점수로 나타냅니다. 이 점수를 **스코어(score)**라고 하며, 점수가 높은 문서가 상위에 노출됩니다.
🔹 Elasticsearch에서 스코어(score) 점수 확인하기
다음은 "quick dog"을 검색하는 match 쿼리입니다.
GET my_index/_search
{
"query": {
"match": {
"message": "quick dog"
}
}
}
🔹 스코어 점수 확인
위 쿼리를 실행하면 각 문서의 _score 값이 함께 반환됩니다.
{
"hits": {
"total": 3,
"max_score": 2.5,
"hits": [
{
"_id": "1",
"_score": 2.5,
"_source": {
"message": "The quick brown fox jumps over the quick dog"
}
},
{
"_id": "2",
"_score": 1.8,
"_source": {
"message": "The quick brown fox"
}
},
{
"_id": "3",
"_score": 1.5,
"_source": {
"message": "Lazy jumping dog"
}
}
]
}
}
🔹 해석:
- _score가 가장 높은 문서가 가장 연관성이 높다고 판단된 문서입니다.
- 상단의 max_score 값이 전체 검색 결과 중 가장 높은 점수입니다.
- Elasticsearch는 이 스코어를 계산하기 위해 BM25 알고리즘을 사용합니다.
3. 정확도 계산 - BM25 알고리즘
BM25(Best Matching 25)는 Elasticsearch가 문서의 연관성을 평가할 때 사용하는 알고리즘입니다. BM25 점수는 다음 3가지 요소를 기반으로 계산됩니다.
🔹 1) TF (Term Frequency, 용어 빈도)
같은 검색어가 문서에서 얼마나 많이 등장하는지를 평가합니다.
- 예시: "쥬라기 공원"이라는 검색어로 검색했을 때,
- "쥬라기 공원"이 10번 등장하는 문서 🆙
- "쥬라기 공원"이 5번 등장하는 문서 🆗
- 등장 횟수가 많을수록 점수가 올라갑니다.
하지만 BM25는 TF 점수가 일정 이상 증가하면 더 이상 가중치를 주지 않습니다. (최대 25까지 증가)
🔹 2) IDF (Inverse Document Frequency, 역문서 빈도)
자주 등장하는 단어보다 희귀한 단어에 더 높은 점수를 부여합니다.
- "공원"이라는 단어는 수많은 문서에서 등장하지만, "쥬라기"는 상대적으로 드문 단어입니다.
- 희귀한 단어일수록 검색에서 더 중요한 의미를 가지므로, IDF 점수가 높아집니다.
🔹 3) Field Length (필드 길이)
검색어가 짧은 문서에 등장할수록 높은 점수를 받습니다.
- 제목 필드는 짧지만 중요한 정보를 포함하므로 높은 점수를 받습니다.
- 본문 필드는 길기 때문에 상대적으로 낮은 점수를 받을 수 있습니다.
4. 정확도와 BM25를 활용한 검색 최적화
Elasticsearch에서 검색 결과를 최적화하려면 다음 방법을 고려할 수 있습니다.
✅ 검색 필드별 가중치 부여
- 제목(title) 필드는 가중치를 높이고, 본문(content) 필드는 가중치를 낮춤.
- boost 값을 조절하여 특정 필드의 중요도를 높일 수 있음.
GET my_index/_search
{
"query": {
"multi_match": {
"query": "엘라스틱서치 튜토리얼",
"fields": ["title^2", "content"]
}
}
}
"title^2"은 title 필드의 가중치를 2배로 높인다는 의미입니다.
✅ 사용자 맞춤 검색 결과 제공
- 사용자의 클릭 데이터와 연관성이 높은 문서를 상위에 노출.
- Function Score Query를 활용하여 특정 문서의 점수를 조정.
✅ 동의어(Synonym) 처리
- "영화"와 "무비"를 동일한 의미로 처리하여 검색 결과의 품질을 향상.
5. 정리
개념 | 설명 |
Relevancy (정확도) | 검색어와 검색 결과가 얼마나 연관성이 높은지 평가하는 기준 |
Score (스코어 점수) | 검색된 문서의 정확도를 수치화한 값 |
BM25 알고리즘 | Elasticsearch가 검색 정확도를 계산하는 방법 |
TF (용어 빈도) | 검색어가 문서에서 많이 등장할수록 높은 점수를 부여 |
IDF (역문서 빈도) | 자주 등장하는 단어보다 희귀한 단어에 높은 점수를 부여 |
Field Length | 문서가 짧을수록 높은 점수를 부여 |
6. 학습 가이드
1️⃣ BM25 알고리즘의 수식과 개념을 깊이 이해
2️⃣ Boosting, Function Score Query를 활용한 검색 최적화 학습
3️⃣ Elasticsearch의 Query DSL을 실습하며 직접 적용
4️⃣ 다른 검색 알고리즘(TF-IDF, PageRank 등)과 비교
이제 Elasticsearch의 **정확도(relevancy)와 스코어(score)**의 개념을 이해하셨나요? 🧐
다음으로는 검색 최적화를 위한 Boosting과 Function Score Query에 대해 학습해보는 것을 추천합니다! 🚀