시맨틱 검색 (Semantic Search)

키워드가 아니라 의미로 문서를 찾고 싶을 때 쓰는 검색 방식이 시맨틱 검색이에요. 텍스트를 고정 길이의 임베딩 벡터로 바꿔서, 뜻이 비슷한 문서들끼리 벡터 공간에서 가까이 모이게 하는 게 핵심이랍니다. Elasticsearch에서는 semantic_text 필드와 추론(inference) 엔드포인트를 조합해 자연스럽게 시맨틱 검색을 구성할 수 있어요.

출처: Semantic search for text — Elasticsearch Guide

시맨틱 검색이 필요한 이유

기존의 어휘(lexical) 검색은 사용자가 쓴 표현 그대로만 찾아줘요. 반면 시맨틱 검색은 동의어·유의어·문맥까지 잡아서, 예를 들어 "날씨가 어떤가요?"라고 물어도 "오늘 기온", "강수 확률" 같은 관련 문서를 찾아줄 수 있답니다. 스키마 없이 문장 전체를 벡터로 표현하기 때문에 검색 품질이 훨씬 유연해져요.

semantic_text 필드로 시작하기

semantic_text 필드는 임베딩 모델이 알아서 만들어주는 벡터를 담는 필드 타입이에요. 매핑에서 inference_id로 사용할 추론 엔드포인트를 지정해 주면 돼요.

PUT /my-index-000001
{
  "mappings": {
    "properties": {
      "semantic_text_field": {
        "type": "semantic_text",
        "inference_id": "my-elser-endpoint"
      }
    }
  }
}

문서를 넣을 때는 일반 텍스트만 넣으면 되고, 벡터 생성은 추론 파이프라인이 처리해 줘요. 따로 임베딩을 계산해서 넣을 필요가 없답니다.

knn 검색으로 질의하기

시맨틱 검색은 knn (k-최근접 이웃) 검색으로 수행해요. query_vector_builder에 텍스트를 넣으면 같은 임베딩 모델이 질의 벡터를 만들고, 가장 가까운 k개를 돌려줘요.

GET /my-index-000001/_search
{
  "knn": {
    "field": "semantic_text_field",
    "query_vector_builder": {
      "text_embedding": {
        "model_id": "sentence-transformers__all-minilm-l6-v2",
        "model_text": "What is the weather tomorrow?"
      }
    },
    "k": 10
  }
}

k는 결과로 받을 최상위 문서 수예요. 벡터 밀도가 높아질수록 후보 탐색 단계가 커지므로, 정확도와 성능을 보고 적절한 값을 정해야 해요.

어떤 검색을 고를까

  • 정확한 고유명사·코드·버전·약어는 어휘 검색(BM25)이 강해요.
  • 문장 수준의 의미 유사도가 중요하면 시맨틱 검색이 좋아요.
  • 둘 다 쓰는 하이브리드 검색으로 재현율을 높이는 것도 흔한 패턴이에요.

더 알아보기