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(문서 길이 정규화)로 점수 특성을 조절할 수 있어요. 벡터 검색과 함께 하이브리드 검색의 어휘 축으로도 자주 쓰여요.

더 알아보기