시맨틱 검색 (Semantic Search)
시맨틱 검색 (Semantic Search)
키워드가 아니라 의미로 문서를 찾고 싶을 때 쓰는 검색 방식이 시맨틱 검색이에요. 텍스트를 고정 길이의 임베딩 벡터로 바꿔서, 뜻이 비슷한 문서들끼리 벡터 공간에서 가까이 모이게 하는 게 핵심이랍니다. Elasticsearch에서는 semantic_text 필드와 추론(inference) 엔드포인트를 조합해 자연스럽게 시맨틱 검색을 구성할 수 있어요.
시맨틱 검색이 필요한 이유
기존의 어휘(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)이 강해요.
- 문장 수준의 의미 유사도가 중요하면 시맨틱 검색이 좋아요.
- 둘 다 쓰는 하이브리드 검색으로 재현율을 높이는 것도 흔한 패턴이에요.