Elasticsearch는 Apache Lucene 기반의 분산 검색·분석 엔진이다. 역인덱스(inverted index), 집계(aggregation), 벡터 검색 기능으로 전문 검색과 실시간 분석을 지원한다.
핵심 개념
인덱스 구조:
Index (논리 단위)
└─ Shard (물리 분산, 기본 1개)
└─ Replica Shard (복제본)
└─ Lucene Index (실제 저장)
└─ Segment (불변 파일)
역인덱스:
"Elasticsearch 검색" →
단어: [elasticsearch, 검색]
elasticsearch → [doc1, doc3]
검색 → [doc1, doc2, doc4]
고급 검색 쿼리
json
{
"query": {
"bool": {
"must": [
{
"multi_match": {
"query": "분산 검색",
"fields": ["title^3", "content"],
"type": "best_fields",
"fuzziness": "AUTO"
}
}
],
"filter": [
{ "term": { "status": "published" } },
{ "range": { "date": { "gte": "2024-01-01" } } }
],
"should": [
{ "term": { "tags": "elasticsearch" } }
],
"minimum_should_match": 0
}
},
"highlight": {
"fields": { "content": {} }
},
"aggs": {
"by_category": {
"terms": { "field": "category.keyword", "size": 10 }
},
"avg_score": {
"avg": { "field": "score" }
}
}
}
벡터 검색 (kNN)
python
from elasticsearch import Elasticsearch
import numpy as np
es = Elasticsearch("http://localhost:9200")
# 인덱스 매핑 (dense_vector 필드)
es.indices.create(index="articles", body={
"mappings": {
"properties": {
"title": {"type": "text"},
"embedding": {
"type": "dense_vector",
"dims": 768,
"index": True,
"similarity": "cosine"
}
}
}
})
# kNN 검색 (의미론적 검색)
query_vector = get_embedding("검색 엔진 최적화")
results = es.search(index="articles", body={
"knn": {
"field": "embedding",
"query_vector": query_vector.tolist(),
"k": 10,
"num_candidates": 100
}
})
관련 문서