BM25 실전 — OpenSearch에서 BM25 활용
BM25 실전
OpenSearch는 기본적으로 Okapi BM25 알고리즘으로 문서 점수를 계산해요. 키워드 기반 검색이며, 질의에 나온 단어가 문서에 얼마나 잘 나타나는지로 관련성을 매겨요.
BM25가 고려하는 것 (TF/IDF)
- Term Frequency: 검색어가 자주 나올수록 문서가 더 관련 있다고 봐요
- Inverse Document Frequency: 전체 문서에 흔한 단어(예: '그만큼')는 가중치를 낮춰요 (IDF)
검색 쿼리 예
GET shakespeare/_search
{
"query": {
"match": {
"text_entry": "long live king"
}
}
}
응답의 각 문서는 _score 필드로 관련성 점수를 받아요. BM25가 이 점수를 계산해요.
유사도 알고리즘
- BM25: OpenSearch의 기본 Okapi BM25 유사도
- LegacyBM25 (Deprecated): 이전 구현. 호환용으로 남아 있어요
- boolean: 용어에 boost 값만큼 점수를 부여하는 방식
OpenSearch 3.0부터는 기본 유사도가 LegacyBM25Similarity에서 Lucene의 네이티브 BM25Similarity로 바뀌었어요. 스코어링에 k1 + 1 상수가 빠지는 차이가 있으니, 기존 스코어를 유지하려면 명시적으로 LegacyBM25를 설정해야 해요.
BM25 유사도 설정
PUT /testindex
{
"settings": {
"index": {
"similarity": {
"custom_similarity": {
"type": "BM25",
"k1": 1.2,
"b": 0.75,
"discount_overlaps": "true"
}
}
}
}
}
k1(TF 포화)과 b(문서 길이 정규화)로 점수 특성을 조절할 수 있어요. 벡터 검색과 함께 하이브리드 검색의 어휘 축으로도 자주 쓰여요.