OpenSearch 신경 검색, 재랭킹 파이프라인과 Algolia, Meilisearch, Typesense 등 주요 검색 엔진의 AI 검색 기능을 비교합니다.
OpenSearch는 Elasticsearch 7.10에서 포크(fork)된 오픈소스 검색 엔진입니다. AWS가 주도적으로 개발하며, AWS OpenSearch Service로 관리형 서비스를 제공합니다. Elasticsearch와 유사한 API를 제공하면서도 독자적인 AI 검색 기능을 발전시키고 있습니다.
| 기능 | Elasticsearch | OpenSearch |
|---|---|---|
| kNN 검색 | HNSW (Lucene) | HNSW (nmslib/faiss/Lucene) |
| 임베딩 내장 | Inference API | Neural Search 플러그인 |
| 희소 벡터 | ELSER | Neural Sparse |
| 리랭킹 | Elastic Rerank | Search Pipeline + ML |
| 하이브리드 검색 | RRF retriever | Hybrid Search (정규화 + 조합) |
| 관리형 서비스 | Elastic Cloud | AWS OpenSearch Service |
OpenSearch는 세 가지 kNN 엔진을 지원합니다: nmslib, faiss, Lucene. 각 엔진은 서로 다른 ANN 알고리즘과 최적화를 제공합니다.
{
"settings": {
"index": {
"knn": true,
"knn.algo_param.ef_search": 100
}
},
"mappings": {
"properties": {
"title": {
"type": "text",
"analyzer": "nori"
},
"content": {
"type": "text",
"analyzer": "nori"
},
"content_vector": {
"type": "knn_vector",
"dimension": 1024,
"method": {
"name": "hnsw",
"space_type": "cosinesimil",
"engine": "faiss",
"parameters": {
"ef_construction": 256,
"m": 16
}
}
}
}
}
}{
"size": 10,
"query": {
"knn": {
"content_vector": {
"vector": [0.12, -0.34, 0.56, "..."],
"k": 10
}
}
}
}OpenSearch의 faiss 엔진은 대규모 데이터셋에서 Lucene 엔진보다 메모리 효율이 좋습니다. IVF(Inverted File Index)와 PQ(Product Quantization) 조합도 지원하여, 수억 개의 벡터도 효율적으로 처리할 수 있습니다.
OpenSearch의 Neural Search 플러그인은 임베딩 생성과 시맨틱 검색을 통합합니다. ML 모델을 OpenSearch에 직접 배포하여 인덱싱과 검색 시 자동으로 임베딩을 생성합니다.
import requests
OPENSEARCH_URL = "http://localhost:9200"
# 1. 모델 그룹 생성
model_group = requests.post(
f"{OPENSEARCH_URL}/_plugins/_ml/model_groups/_register",
json={"name": "embedding_models", "description": "Embedding model group"},
).json()
group_id = model_group["model_group_id"]
# 2. 모델 등록
model_config = {
"name": "multilingual-e5-small",
"version": "1.0.0",
"model_group_id": group_id,
"model_format": "TORCH_SCRIPT",
"model_config": {
"model_type": "bert",
"embedding_dimension": 384,
"framework_type": "sentence_transformers",
},
"url": "https://artifacts.opensearch.org/models/ml-models/..."
}
register_response = requests.post(
f"{OPENSEARCH_URL}/_plugins/_ml/models/_register",
json=model_config,
).json()
# 3. 모델 배포
task_id = register_response["task_id"]
# 태스크 완료 후 모델 ID 확인
model_id = "..." # 등록된 모델 ID
requests.post(f"{OPENSEARCH_URL}/_plugins/_ml/models/{model_id}/_deploy")Neural Search 플러그인의 핵심은 **수집 파이프라인(Ingest Pipeline)**입니다. 문서가 인덱싱될 때 자동으로 임베딩을 생성합니다.
{
"description": "Neural search embedding pipeline",
"processors": [
{
"text_embedding": {
"model_id": "your-model-id",
"field_map": {
"content": "content_vector"
}
}
}
]
}{
"size": 10,
"query": {
"neural": {
"content_vector": {
"query_text": "벡터 데이터베이스 성능 최적화",
"model_id": "your-model-id",
"k": 10
}
}
}
}OpenSearch에서 하이브리드 검색은 Search Pipeline의 정규화 프로세서를 사용하여 구현합니다.
{
"description": "Hybrid search pipeline",
"phase_results_processors": [
{
"normalization-processor": {
"normalization": {
"technique": "min_max"
},
"combination": {
"technique": "arithmetic_mean",
"parameters": {
"weights": [0.3, 0.7]
}
}
}
}
]
}{
"size": 10,
"query": {
"hybrid": {
"queries": [
{
"match": {
"content": {
"query": "벡터 데이터베이스 성능"
}
}
},
{
"neural": {
"content_vector": {
"query_text": "벡터 데이터베이스 성능 최적화",
"model_id": "your-model-id",
"k": 50
}
}
}
]
}
}
}OpenSearch 하이브리드 검색에서 weights 파라미터는 BM25와 시맨틱 검색의 가중치를 조절합니다. 위 예시에서 BM25에 0.3, 시맨틱에 0.7의 가중치를 부여했습니다. 도메인에 따라 이 비율을 실험적으로 조정해야 합니다.
OpenSearch는 Search Pipeline의 응답 프로세서(response processor)를 통해 재랭킹을 지원합니다.
{
"description": "Reranking pipeline",
"response_processors": [
{
"rerank": {
"ml_opensearch": {
"model_id": "your-cross-encoder-model-id"
},
"context": {
"document_fields": ["content"]
}
}
}
]
}검색 시 파이프라인을 지정하면 자동으로 재랭킹이 적용됩니다.
{
"size": 10,
"query": {
"match": {
"content": "AI 검색 시스템 설계"
}
},
"ext": {
"rerank": {
"query_context": {
"query_text": "AI 검색 시스템 설계"
}
}
}
}Algolia는 SaaS 형태의 검색 서비스로, NeuralSearch 기능을 통해 AI 검색을 제공합니다.
from algoliasearch.search.client import SearchClientSync
client = SearchClientSync("APP_ID", "API_KEY")
# 검색 (NeuralSearch 자동 적용)
results = client.search_single_index(
index_name="tech-articles",
search_params={"query": "벡터 검색 성능 최적화"},
)Meilisearch는 Rust로 작성된 오픈소스 검색 엔진으로, 간단한 설정과 빠른 검색이 특징입니다.
import meilisearch
client = meilisearch.Client("http://localhost:7700", "MASTER_KEY")
index = client.index("tech-articles")
# 벡터 검색 활성화
index.update_settings({"embedders": {"default": {"source": "userProvided", "dimensions": 1024}}})
# 하이브리드 검색
results = index.search(
"벡터 데이터베이스",
opt_params={"hybrid": {"semanticRatio": 0.7}},
)Typesense는 Meilisearch와 유사한 포지션의 오픈소스 검색 엔진입니다.
프로젝트 요구사항에 따른 검색 엔진 선택 기준을 정리합니다.
| 요구사항 | 권장 엔진 | 이유 |
|---|---|---|
| 엔터프라이즈급, 풀스택 검색 | Elasticsearch | 가장 풍부한 기능, ELSER, Rerank |
| AWS 생태계 통합 | OpenSearch | AWS 관리형, 비용 효율적 |
| 빠른 프로토타입 | Meilisearch / Typesense | 간단한 설정, 즉시 사용 |
| 운영 부담 최소화 | Algolia | 완전 관리형 SaaS |
| 비용 민감 | OpenSearch (자체 호스팅) | 오픈소스, 무료 |
| 기존 PostgreSQL 활용 | pgvector | 별도 인프라 불필요 |
검색 엔진 선택 시 현재 기능뿐 아니라 향후 확장성도 고려해야 합니다. 시맨틱 검색, 리랭킹, 개인화 등 고급 기능이 필요해질 것으로 예상된다면, 처음부터 Elasticsearch나 OpenSearch를 선택하는 것이 마이그레이션 비용을 줄일 수 있습니다.
이번 장에서는 Elasticsearch 외의 주요 검색 엔진들의 AI 검색 기능을 비교했습니다. OpenSearch의 Neural Search 플러그인, 하이브리드 검색, 재랭킹 파이프라인의 구현 방법을 학습했고, Algolia, Meilisearch, Typesense 등 대안 검색 엔진의 특징과 적합한 사용 시나리오를 확인했습니다. 프로젝트 규모, 클라우드 환경, 운영 역량에 따른 검색 엔진 선택 가이드도 제시했습니다.
다음 장에서는 하이브리드 검색과 리랭킹을 결합한 다단계 검색 파이프라인의 설계와 최적화를 다룹니다. BM25와 시맨틱 검색의 결합 전략, 리랭킹 캐스케이드, 성능-품질 트레이드오프까지 실전 구현을 중심으로 살펴보겠습니다.
이 글이 도움이 되셨나요?
BM25와 시맨틱 검색의 결합 전략, RRF/선형 보간, 리랭킹 캐스케이드, 다단계 검색 파이프라인 설계와 성능-품질 트레이드오프를 다룹니다.
Elasticsearch의 kNN 검색, Inference API, semantic_text 필드, ELSER, Elastic Rerank, 하이브리드 검색(RRF)을 실습과 함께 다룹니다.
사용자 프로파일링, 클릭 이력 기반 개인화, 임베딩 기반 사용자 벡터, 인기도 편향 문제, 프라이버시 고려사항과 실시간 개인화를 다룹니다.