# ElasticSearch에 드디어 SQL 스타일 JOIN 기능 도입

> Clean Markdown view of GeekNews topic #20417. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=20417](https://news.hada.io/topic?id=20417)
- GeekNews Markdown: [https://news.hada.io/topic/20417.md](https://news.hada.io/topic/20417.md)
- Type: GN+
- Author: [xguru](https://news.hada.io/@xguru)
- Published: 2025-04-19T09:46:47+09:00
- Updated: 2025-04-19T09:46:47+09:00
- Original source: [elastic.co](https://www.elastic.co/blog/esql-lookup-join-elasticsearch)
- Points: 3
- Comments: 0

## Summary

Elasticsearch 8.18 버전에서 **ES|QL의 `LOOKUP JOIN`** 기능이 도입되어 데이터 상관관계 분석이 가능해졌습니다. 이 기능은 **LEFT OUTER JOIN** 형식으로, 기존 **ENRICH** 방식보다 설정과 관리가 용이하며, **데이터 조인 및 보안 이벤트 분석**에 유용합니다. **단일 샤드 기반의 ‘lookup index’ 모드**가 도입되어 최대 20억 문서까지 저장 가능하며, **다대다 조인 및 동적 필드 지정**에 적합합니다. 향후 **INNER JOIN, 서브쿼리** 기능도 지원될 예정이며, Kibana UI를 통해 **lookup 인덱스를 쉽게 생성**할 수 있습니다.

## Topic Body

- ES 8.18에 **ES|QL의 LOOKUP JOIN** 명령어가 도입되어 데이터 상관관계 및 보강이 가능해짐  
- 기존 ENRICH 기능보다 설정과 관리가 쉬우며, **데이터 조인, 보안 이벤트 상관 분석, 자산 정보 병합 등에 유용**  
- JOIN을 위해 새롭게 설계된 **단일 샤드 기반의 ‘lookup index’ 모드** 도입 — 최대 20억 문서까지 저장 가능  
- `LOOKUP JOIN`은 **다대다 조인을 쉽게 처리하며, 동적 필드 지정 및 집계 기능에도 적합**  
- Kibana 또는 API를 통해 **CSV로 쉽게 lookup 인덱스를 만들 수 있으며**, 향후 INNER JOIN, 서브쿼리 기능도 예정됨  
  
---  
  
### ES|QL에 진짜 JOIN이 생겼다: LOOKUP JOIN 기능 소개  
  
#### Elasticsearch에서도 이제 SQL 스타일 JOIN 가능  
  
- Elasticsearch 8.18부터 **ES|QL에서 `LOOKUP JOIN`을 지원**  
- 이는 **LEFT OUTER JOIN** 형식이며, “우측” 데이터는 새로운 `lookup` 인덱스 모드를 통해 관리됨  
- 예시:  
  - IP 주소에 따라 환경명(dev, QA, prod) 병합  
  - 보안 이벤트에 직원 정보, 자산 정보, 위협 인텔리전스 등 추가  
  - 웹 로그에서 응답 코드별 환경 분석 등  
  
#### 기존 ENRICH와의 차이점  
  
- # ENRICH 방식  
  - 인덱스 기반의 **정책을 사전에 설정해야 함**  
  - 데이터가 변경될 때마다 **정책을 재실행해야 함**  
  - **다중 매칭 시 멀티값 필드로 반환**되어 후처리가 복잡함  
  - **집계 및 통계 분석에는 부적합**  
  - **정적인 데이터(변경이 거의 없는 참조용 정보)**에 적합  
- # LOOKUP JOIN 방식  
  - **별도 정책 없이 즉시 사용 가능**  
  - 인덱스를 직접 수정할 수 있어, **변경 사항이 즉시 반영됨**  
  - **다중 매칭 시 행 단위로 분리되어 분석이 용이함**  
  - **그룹화 및 집계에 최적화되어 있음** (예: 사용자별 트래픽 합계)  
  - **동적이고 자주 업데이트되는 데이터**에도 유리함  
  
#### 사용 예시  
  
```sql  
FROM kibana_sample_data_logs   
| WHERE response.keyword != "200"   
| LOOKUP JOIN envs_lkp ON clientip   
| STATS COUNT(*) by response, environment  
```  
  
- IP별 환경 데이터를 JOIN하여 HTTP 오류 발생 위치 분석  
- 팀 소유 정보도 JOIN해서 어떤 팀이 관리하는 서버에 문제가 있는지 파악 가능  
  
  ```sql  
  FROM kibana_sample_data_logs   
  | WHERE response.keyword != "200"   
  | LOOKUP JOIN teams_lkp ON host   
  | STATS num = COUNT(*) by host, response.keyword, team   
  | SORT num DESC  
  ```  
  
#### Lookup 인덱스 생성 방법  
  
- Kibana UI로: **Stack Management → Index Management → Create index**  
- REST API로:  
  
  ```json  
  PUT mylookupindex  
  {  
    "settings": {  
      "index.mode": "lookup"  
    }  
  }  
  ```  
  
- 머신러닝 File Upload를 통해 CSV 업로드 후 인덱스 생성 시 `lookup` 모드 설정 가능  
  
#### 주의사항 및 팁  
  
- **JOIN은 무거운 연산**이므로 자주 쓰는 필드는 `lookup` 대신 **ENRICH + ingest-time denormalization** 고려  
- `lookup index`는 단일 샤드로 구성되어 있으며, **최대 20억 문서 제한**  
- 일반 쿼리처럼 `FROM <lookup_index>` 로 직접 조회도 가능함  
- Logstash나 Elastic Agent를 통해도 데이터 입력 가능 (단, data stream은 아님)  
  
#### 향후 계획  
  
- **INNER JOIN, SUBQUERY, 일반 인덱스 조인**도 지원 예정  
- Kibana 내에서 직접 **lookup 인덱스 생성 및 수정 UI 제공 예정**  
  - 예: Discover에서 CSV 드래그 앤 드롭 → 자동 인덱스 생성  
  - **GUI 기반 Lookup 관리 기능** 제공 예정 (목업도 공개됨)  
  
#### 정리 및 시작하기  
  
- `LOOKUP JOIN`은 **정식 릴리즈 전 기술 프리뷰**지만, ES|QL을 새로운 수준으로 끌어올릴 수 있는 기능  
- Elastic Cloud에서 Elasticsearch 8.18 또는 9.0으로 시작 가능

## Comments



_No public comments on this page._
