시맨틱 검색
원본 보기시맨틱 검색
Elasticsearch에서 시맨틱 검색이 어떻게 동작하는지 감을 잡고 싶다면 이 빠른 시작 가이드가 도움이 됩니다. 시맨틱 검색을 위한 가장 간단한 관리형 경로인 semantic_text 워크플로를 사용합니다. 먼저 인덱스를 만들고 데이터를 두 가지 형태로 저장합니다. 키워드 매칭을 위한 일반 텍스트와 semantic_text에 저장되는 시맨틱 표현입니다(벡터 임베딩은 내부적으로 벡터 검색을 사용해 자동으로 생성되고 비교됩니다). 그다음 키워드 검색과 해당 임베딩에 대한 시맨틱 검색을 결합하고 결과를 병합하는 하이브리드 쿼리를 실행합니다.
이 빠른 시작 가이드는 semantic_text 필드 타입을 사용한 시맨틱 검색과 하이브리드 검색을 보여줍니다. 키워드 기반 전문 검색과 시맨틱 검색을 결합하므로 정확한 용어와 의미를 모두 매칭할 수 있습니다. 시맨틱 검색은 벡터 검색에 기반합니다. 텍스트가 임베딩으로 변환되어 벡터 공간에서 유사도로 매칭됩니다.
예를 들어 문서에 "annual leave policy"라는 문구가 있다면, "annual leave"로 키워드 검색하면 용어가 일치하므로 해당 문서가 반환됩니다. 하지만 "vacation rules"로 검색하면 그 정확한 단어가 문서에 없기 때문에 같은 문서가 반환되지 않을 수 있습니다.
시맨틱 검색과 벡터 검색을 사용하면 "vacation rules" 같은 쿼리로도 "annual leave policy" 문서를 반환할 수 있습니다. 정확한 용어가 아니라 의미를 기준으로 매칭하기 때문입니다.
하이브리드 검색을 사용하면 같은 쿼리로 키워드 매치와 시맨틱 매치를 모두 반환할 수 있습니다. 정확한 단어 매칭과 의미 기반 벡터 검색을 결합해 결과가 계속 유용하게 유지됩니다.
실행 중인 Elasticsearch 클러스터가 필요합니다. 이 가이드를 가장 빠르게 따라 하려면 무료 서버리스 체험이 포함된 서버리스 프로젝트를 생성하세요.
-
인덱스 매핑 생성
인덱스 매핑을 정의합니다. 매핑은 인덱스의 필드와 데이터 타입을 지정하며, 여기에는 전문 검색용 일반 텍스트 필드와 벡터 임베딩 및 벡터 검색을 통해 시맨틱 검색을 구동하는
semantic_text필드가 포함됩니다.PUT semantic-embeddings{ "mappings": { "properties": { "semantic_text": { "type": "semantic_text" }, "content": { "type": "text", "copy_to": "semantic_text" } } } }- 시맨틱 검색을 위한
semantic_text필드 타입의semantic_text필드입니다. 벡터 임베딩은 내부적으로 기본 추론 엔드포인트와 벡터 검색을 사용해 자동으로 생성되고 저장됩니다. - 일반 텍스트를 저장하는
text필드 타입의content필드입니다. 이 필드는 키워드 검색에 사용됩니다. content에 색인된 값은semantic_text로 복사되어 벡터 임베딩으로 변환되며, 기본 추론 엔드포인트에 의해 벡터 검색용으로 저장됩니다.
응답 예시{ "acknowledged": true, "shards_acknowledged": true, "index": "semantic-embeddings" } - 시맨틱 검색을 위한
-
문서 색인
bulk API로 문서를 색인합니다.
content필드에 내용만 제공하면 됩니다.copy_to매핑이 텍스트를semantic_text로 복사하고 벡터 임베딩을 자동으로 생성하므로, 같은 문서에 대해content에는 키워드 검색을,semantic_text에는 시맨틱 검색을 실행할 수 있습니다.POST _bulk{ "index": { "_index": "semantic-embeddings" } } { "content": "After running, cool down with light cardio for a few minutes to lower your heart rate and reduce muscle soreness." } { "index": { "_index": "semantic-embeddings" } } { "content": "Marathon plans stress weekly mileage; carb loading before a race does not replace recovery between hard sessions." } { "index": { "_index": "semantic-embeddings" } } { "content": "Tune cluster performance by monitoring thread pools and refresh interval." }응답 예시{ "errors": false, "took": 600, "items": [ { "index": { "_index": "semantic-embeddings", "_id": "akiYKZ0BGwHk8ONXXqmi", "_version": 1, "result": "created", "_shards": { "total": 1, "successful": 1, "failed": 0 }, "_seq_no": 0, "_primary_term": 1, "status": 201 } }, { "index": { "_index": "semantic-embeddings", "_id": "a0iYKZ0BGwHk8ONXXqmi", "_version": 1, "result": "created", "_shards": { "total": 1, "successful": 1, "failed": 0 }, "_seq_no": 0, "_primary_term": 1, "status": 201 } }, { "index": { "_index": "semantic-embeddings", "_id": "bEiYKZ0BGwHk8ONXXqmi", "_version": 1, "result": "created", "_shards": { "total": 1, "successful": 1, "failed": 0 }, "_seq_no": 1, "_primary_term": 1, "status": 201 } } ] }
Search API를 사용해 하이브리드 검색을 실행합니다.
JSON 본문은 하이브리드 쿼리입니다. RRF(reciprocal rank fusion) retriever가 두 개의 match 쿼리를 실행하는데, 하나는 키워드 매칭을 위해 content에 대해, 다른 하나는 시맨틱 검색을 위해 semantic_text에 대해 실행되며(내부적으로 벡터 검색을 사용), 결과를 병합합니다.
RRF retriever는 RRF 공식을 기반으로 상위 문서를 반환합니다. 이를 통해 키워드 기반 전문 쿼리와 (벡터 검색을 통한) 시맨틱 검색의 결과를 하나의 순위 목록으로 결합하는 하이브리드 검색이 가능해집니다.
GET semantic-embeddings/_search
{
"retriever": {
"rrf": {
"retrievers": [
{
"standard": {
"query": {
"match": {
"content": "muscle soreness after jogging"
}
}
}
},
{
"standard": {
"query": {
"match": {
"semantic_text": "muscle soreness after jogging"
}
}
}
}
]
}
}
}
- match 쿼리가 키워드 매칭용 일반 텍스트를 저장하는
content필드에 대해 실행됩니다. - match 쿼리가 벡터 검색을 사용하는 시맨틱 검색을 위해
semantic_text필드에 대해 실행됩니다(쿼리와 문서 벡터는 자동으로 저장되고 비교됩니다).
문서가 두 쿼리 중 어느 하나에서라도 높은 순위를 차지하면 결합된 목록에 나타날 수 있습니다.
아래 응답 예시에서 두 개의 히트는 하이브리드 쿼리에서 키워드 검색과 시맨틱 검색을 결합하는 것이 왜 중요한지 보여줍니다.
상위 문서에는 muscle soreness와 running이라는 표현이 들어 있어 키워드 검색에 부합하면서 시맨틱 및 벡터 검색에서도 높은 순위를 차지합니다. 두 번째 문서에는 그런 단어가 전혀 없고 마라톤 훈련과 세션 간 회복에 대해 이야기합니다. 쿼리 용어가 텍스트에 없으므로 content에 대한 키워드 전용 검색이라면 이 문서를 놓치거나 훨씬 낮은 순위로 매겼을 가능성이 큽니다.
그럼에도 시맨틱 검색이 이 문서를 매칭하는 이유는 마라톤 훈련과 회복이 달리기 후 근육통과 같은 개념에 연결되기 때문입니다. 공유하는 키워드가 없어도 벡터 유사도가 그 연결을 포착합니다. 하이브리드 검색은 단어가 일치하는 문서를 유지하면서, 동일한 어휘가 없더라도 벡터 검색이 주제로 찾아낸 문서까지 함께 가져옵니다.
각 _score는 이번 검색에 한정된 관련성 점수입니다. 점수가 높을수록 같은 응답 안에서 아래 문서들보다 높은 순위임을 의미합니다.
{
"took": 202,
"timed_out": false,
"_shards": {
"total": 6,
"successful": 6,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 2,
"relation": "eq"
},
"max_score": 0.032786883,
"hits": [
{
"_index": "semantic-embeddings",
"_id": "akiYKZ0BGwHk8ONXXqmi",
"_score": 0.032786883,
"_source": {
"content": "After running, cool down with light cardio for a few minutes to lower your heart rate and reduce muscle soreness."
}
},
{
"_index": "semantic-embeddings",
"_id": "a0iYKZ0BGwHk8ONXXqmi",
"_score": 0.016129032,
"_source": {
"content": "Marathon plans stress weekly mileage; carb loading before a race does not replace recovery between hard sessions."
}
}
]
}
}
- 쿼리에 매칭된 문서 수입니다(여기서는 2건). 관련 없는 클러스터 튜닝 문서는 반환되지 않습니다.
- 반환된 히트 중 가장 높은 관련성 점수입니다(최상위 문서의 점수와 동일).
- 최상위 문서의 관련성 점수입니다. 이 문서의 텍스트는 muscle soreness, 달리기 후 회복 같은 쿼리 용어와 일치하므로(running은 jogging과 가깝습니다) 키워드 검색과 (벡터 유사도로 구동되는) 시맨틱 검색 모두 높은 순위를 매길 수 있습니다.
- 두 번째 순위 문서의 관련성 점수입니다. 이 문서에는 muscle soreness나 jogging이 없으며, 주로 벡터 검색이 마라톤 훈련과 회복을 쿼리에 매칭했기 때문에 나타납니다.
content에 대한 키워드 전용 검색은 이런 종류의 매치를 놓치는 경우가 많습니다.
semantic_text로 시맨틱 검색하기 -semantic_text필드 타입으로 시맨틱 검색과 벡터 검색을 설정하는 방법에 대한 전체 튜토리얼을 따라 해 보세요.- inference API로 시맨틱 검색하기 - 서드파티 임베딩 서비스(예: Cohere, Hugging Face, OpenAI)와 함께 inference API를 사용해 벡터 임베딩 기반 시맨틱 검색을 실행합니다.
semantic_text로 하이브리드 검색하기 -semantic_text에 대한 시맨틱 검색과 text 필드에 대한 전문 검색을 결합한 뒤 RRF로 결과를 병합합니다. 벡터 임베딩은 자동으로 생성되고 비교됩니다.- ELSER로 시맨틱 검색하기 - 희소 벡터 검색과 시맨틱 검색에 ELSER 모델을 사용합니다.
- 밀집 및 희소 벡터 인제스트 파이프라인 - Elasticsearch에 배포한 NLP 모델로 벡터 검색을 처음부터 끝까지 구현합니다. 밀집 또는 희소를 선택하고, 모델을 배포하고, 인제스트 파이프라인을 구축한 뒤
semantic_text에 의존하지 않고 쿼리합니다.
- 텍스트 시맨틱 검색 - 의미 기반 텍스트 검색을 위한 세 가지 워크플로(
semantic_text, inference API, 클러스터 내 배포 모델)를 비교하고 복잡도가 어떻게 다른지 확인합니다. - 멀티모달 검색 - Jina 멀티모달 임베딩으로 텍스트, 이미지, 오디오, 비디오, 문서를 아우르는 검색을 수행합니다.
- 벡터 검색 - 관리형 시맨틱 워크플로 이상의 제어가 필요할 때
dense_vector와sparse_vector필드, 관련 쿼리, 수동 벡터 구현을 직접 다룹니다. - 랭킹과 리랭킹 - 다단계 파이프라인을 구성합니다. 초기 BM25, 벡터 또는 하이브리드 검색 후 더 작은 후보 집합에 대해 더 강력한 모델로 리랭킹합니다.
- 검색 쿼리 작성하기 - 고전적인 쿼리, 분석형 파이프, 조합 가능한 검색 파이프라인 중 무엇이 필요한지에 따라 Search API에서 Query DSL, ES|QL 또는 retriever를 선택합니다.
전문 검색, 벡터 검색, 하이브리드 검색 등 더 많은 옵션에 대해 알아보려면 Search approaches로 이동하세요. 벡터 검색 활용 사례 요약은 Vector search use cases를 참고하세요.