요약
2026년 8월 4일 출시된 Elasticsearch 9.5의 핵심은 컬럼형 인덱스 모드(Tech Preview)다. 루씬이 색인마다 함께 만드는 역인덱스·BKD 트리·doc values 중 doc values만 남기고 나머지를 건너뛰어, 로그·지표 같은 append-only 분석 워크로드에서 스토리지를 줄이는 것이 목표다.
주요 변화:
columnar인덱스 모드 (Tech Preview): 역인덱스·BKD 트리 없이 doc values만 저장 — 집계 특화, 풀텍스트 검색 불가logsdb_columnar모드: columnar 스토리지 + logsdb 기본값(@timestamp·host.name정렬) +message필드에만 역인덱스 유지- VectorDB 인덱스 모드 자동 보정: DiskBBQ 양자화 깊이·프리컨디셔닝·오버샘플링 색인 시점 자동 튜닝
- Anthropic Claude API 관측성 통합: LLM 호출 토큰 사용량·레이턴시를 Elastic Observability로 수집
- 9.4에서 롤링 업그레이드 지원,
columnar관련 모드는 9.6에서 GA 예정
이전 챕터(database-frontier/17)에서 다룬 Elastic 9.4의 GPU 벡터 인덱싱·Prometheus TSDB 대체·FIPS 140-3과 달리, 9.5는 저장 구조 자체를 선택 가능하게 만드는 방향으로 진화했다.
1. columnar 인덱스 모드: 루씬에서 필요한 구조만 남기기
기존 루씬 인덱스가 저장하는 것들
루씬은 필드 하나를 색인할 때 여러 자료구조를 동시에 생성한다.
| 자료구조 | 목적 | 지원 쿼리 유형 |
|---|---|---|
| 역인덱스(Inverted Index) | 특정 텀을 포함하는 문서 찾기 | match, term, prefix |
| BKD 트리(Block KD-tree) | 숫자·날짜·지리 범위 색인 | range, geo_bounding_box |
| Doc Values | 도큐먼트별 필드값 정렬·집계 | agg, sort, scripted_field |
| Stored Fields | 원본 값 반환 | _source, fields |
로그 파이프라인의 일반적인 패턴은 @timestamp 기준 집계와 host.name·service.name 기준 집계다. 역인덱스와 BKD 트리는 거의 쓰지 않지만, 색인할 때마다 함께 만들어지고 디스크를 차지한다. 특히 고카디널리티 필드에서는 역인덱스 크기가 doc values보다 커지는 경우도 있다.
index.mode: columnar가 바꾸는 것
columnar 모드는 역인덱스와 BKD 트리 생성을 건너뛴다. 각 필드에 doc values만 기록한다.
PUT /my-logs
{
"settings": {
"index": {
"mode": "columnar"
}
}
}결과는 두 가지다. 스토리지가 줄고, 역인덱스·BKD 트리에 의존하는 쿼리가 불가능해진다.
가능한 연산:
date_histogram,terms,avg,max,percentiles등 집계@timestamp기준 시간 범위 필터 (doc values 스캔으로 처리)sort기반 페이지네이션
불가능한 연산:
match,match_phrase— 역인덱스 없음range쿼리 (숫자·날짜 BKD 트리 없음,@timestamp예외 처리 여부는 Open question)geo_bounding_box,geo_distancehighlight
Tech Preview 주의: 9.5 기준으로
columnar모드는 실험적이다. 9.6 GA 전까지 매핑 동작이나 제약 조건이 변경될 수 있다.
2. logsdb_columnar 모드: 로그 워크로드 전용 조합
logsdb가 추가하는 것들
기존 logsdb 모드는 로그 인덱싱 최적화를 묶어둔 사전 설정이다.
- 기본 정렬:
@timestampdesc,host.nameasc (세그먼트 병합 효율화) - 자동
_source합성(synthesis): stored fields 대신 doc values에서 재구성 host.name,log.level등 공통 필드 기본 매핑
logsdb_columnar는 이 기본값에 columnar 스토리지를 결합하면서 message 필드 하나에만 역인덱스를 유지한다. grep 패턴의 로그 검색(message: "OOM", message: "timeout")을 지원하기 위한 최소한의 타협이다.
PUT /my-logs-columnar
{
"settings": {
"index": {
"mode": "logsdb_columnar"
}
}
}나머지 구조적 필드(숫자, 키워드, IP, 날짜)는 doc values로만 저장된다.
3. 아키텍처 비교: 네 가지 인덱스 모드
스토리지 최대
스토리지 중간
스토리지 최소
스토리지 소형
선택 기준 요약:
- 풀텍스트 검색 + 범위 쿼리 필요 →
standard또는logsdb - 로그이고 집계만 함 →
columnar - 로그이고
message키워드 검색만 함 →logsdb_columnar - 벡터 검색 전용 →
vectordb
4. VectorDB 인덱스 모드: DiskBBQ 자동 보정
수동 튜닝의 문제
vectordb 인덱스 모드는 ANN(Approximate Nearest Neighbor) 검색 특화 사전 설정이다. 내부적으로 DiskBBQ(Disk-Based Binary Quantization) 알고리즘으로 벡터를 압축해 디스크에 저장하고, 검색 시 HNSW 그래프를 탐색한다.
9.4까지는 양자화 깊이(quantization bits), 프리컨디셔닝(preconditioning), 오버샘플링(oversampling) 파라미터를 수동으로 조정해야 했다. 데이터셋마다 벡터 분포가 달라 최적값이 달리 나타나기 때문에, 운영자가 실험으로 결정해야 했다.
9.5의 자동 보정
9.5는 색인 시점에 벡터 분포를 샘플링해 파라미터를 자동으로 결정한다.
PUT /my-vectors
{
"settings": {
"index": {
"mode": "vectordb"
}
},
"mappings": {
"properties": {
"embedding": {
"type": "dense_vector",
"dims": 1536,
"index": true,
"similarity": "cosine"
}
}
}
}9.5부터는 위 설정만으로 DiskBBQ 파라미터가 자동으로 선택된다. 벡터 필드에 별도 index_options를 지정하지 않아도 된다.
자동 보정 대상 파라미터:
| 파라미터 | 9.4 기본값 | 9.5 동작 |
|---|---|---|
| 양자화 깊이 | 4비트 고정 | 벡터 분포에 따라 4–8비트 자동 선택 |
| 프리컨디셔닝 | 비활성 | 분포 분산 기반 자동 활성 여부 결정 |
| 오버샘플링 비율 | 3× 고정 | recall 추정 기반 자동 조정 |
Open question: 자동 보정의 recall 목표 기준과 내부 알고리즘 세부 사항은 9.6 GA 문서에서 확인 필요.
5. Anthropic Claude API 관측성 통합
9.5는 Elastic Observability에 Anthropic Claude API 통합을 추가했다. Claude API를 호출하는 서비스에서 OpenTelemetry 계측을 통해 LLM 호출 정보를 자동으로 수집한다.
수집되는 시맨틱 컨벤션 지표:
| 지표 | 설명 |
|---|---|
gen_ai.client.token.usage | 입력·출력 토큰 수 |
gen_ai.client.operation.duration | API 호출 레이턴시 |
gen_ai.request.model | 요청 모델 ID |
gen_ai.response.finish_reason | 완료 사유 (stop, max_tokens 등) |
기존에 OpenAI·Amazon Bedrock·Google Vertex AI 통합이 있었고, 9.5에서 Anthropic이 추가된 형태다. Kibana의 AI Assistant 대시보드에서 모델별·엔드포인트별 비용 추적이 가능하다.
6. 운영 체크리스트: 9.4 → 9.5 업그레이드
columnar 모드 도입 판단 기준
다음 조건을 모두 충족하는 인덱스가 logsdb_columnar 전환 후보다.
- [ ] 해당 인덱스에서
match,match_phrase쿼리를message필드 외에는 사용하지 않는가? - [ ] 숫자·날짜 필드의
range쿼리가 없는가? (@timestamp필터는 제외) - [ ]
geo_bounding_box,geo_distance같은 지리 쿼리가 없는가? - [ ]
highlight기능이 필요 없는가? - [ ] append-only 워크로드인가? (업데이트가 드문 경우)
순수 집계·타임라인 조회만 하는 인덱스는 columnar, message 키워드 검색이 있으면 logsdb_columnar를 선택한다.
Tech Preview 관련 주의사항
기존 logsdb 인덱스를 logsdb_columnar로 직접 변경할 수 없다. 인덱스 모드는 생성 시 설정하며 변경이 불가능하다. ILM 정책과 함께 쓰는 경우에는 신규 인덱스 템플릿에 모드를 지정하고, 기존 인덱스는 롤오버(rollover) 후 신규 인덱스부터 적용한다.
PUT /_index_template/my-logs-template
{
"index_patterns": ["my-logs-*"],
"template": {
"settings": {
"index": {
"mode": "logsdb_columnar"
}
}
}
}vectordb 자동 보정 확인
# 색인 후 세그먼트 정보로 양자화 설정 확인
GET /my-vectors/_segments?verbose=true
# kNN 검색 프로파일로 후보 수·오버샘플링 비율 확인
GET /my-vectors/_search
{
"profile": true,
"knn": {
"field": "embedding",
"query_vector": [0.1, 0.2],
"k": 10,
"num_candidates": 100
}
}7. 9.4와의 비교
| 구분 | Elastic 9.4 | Elastic 9.5 |
|---|---|---|
| 벡터 인덱싱 | GPU 가속 (12× 빠른 빌드) | DiskBBQ 파라미터 자동 보정 |
| 인덱스 모드 신규 | — | columnar, logsdb_columnar (Tech Preview) |
| 로그 스토리지 | logsdb | logsdb_columnar (역인덱스 최소화) |
| LLM 관측성 | OpenAI·Bedrock·Vertex | + Anthropic Claude |
| FIPS | 140-3 완성 | 유지 |
| 출시일 | 2026-06 | 2026-08-04 |
References
- https://www.elastic.co/blog/whats-new-elasticsearch-9-5
- https://www.elastic.co/guide/en/elasticsearch/reference/current/index-modules.html
- https://www.elastic.co/guide/en/elasticsearch/reference/current/logs.html
- https://www.elastic.co/guide/en/elasticsearch/reference/current/knn-search.html
- https://www.elastic.co/guide/en/elasticsearch/reference/current/dense-vector.html