본문 바로가기

Database/elastic search

es 칼럼 limit 변경하기 [Limit of total fields [1000] has been exceeded]

 
 

"error": { "type": "illegal_argument_exception", "reason": "Limit of total fields [1000] has been exceeded" }

 

인덱스에 총 필드 수가 1000개를 초과했고, 그로 인해 이 이벤트(document)가 인덱싱되지 않고 실패한 것

엘라스틱서치의 기본 필드 수는 1000개로 지정되어 있다. 

 

 

Elasticsearch는 데이터의 모든 하위 키를 개별 필드로 매핑한다. 
즉, app.sdk_version_code, app.app_name, ..., user.nickname, device.height 등 각각이 하나의 필드로 계산되어 전체 필드 수가  1000개를 넘는 상황이 발생하면 위와 같이 에러가 발생한다. 

 

기존 인덱스에 적용하기 (2000개로 확장하기)

# log-YYYYMMDD 인덱스

PUT /log-20250515/_settings

{

 "index.mapping.total_fields.limit": 2000

}

 

 

새 인덱스 생성시 적용하기 (템플릿에 적용)

# log-template

 

PUT _index_template/log_template

{

 "index_patterns": ["log-*"], "template": { "settings": { "index.mapping.total_fields.limit": 2000 } }

}

 

향후 관리를 위해선

  1. 필드 정리: 너무 많은 동적 필드(dynamic field)가 생기지 않도록 로그 포맷 정리 (예: info.key1, info.key2 → JSON blob 하나로 저장).
  2. flattened 타입 고려 (ES 7.3 이상): JSON 오브젝트를 텍스트 필드처럼 저장하여 필드 수 감소
  3. dynamic: false 또는 필요 없는 필드에 매핑 제외

 

 


 

번외

Elasticsearch에서 type: "flattened"과 JSON blob(string 저장 방식)은 모두 필드 수 폭증을 방지하기 위한 방식에 쓰이지만, 용도와 검색 가능성 면에서 차이가 있음

 

항목

type: "flattened"
JSON blob ("type": "text"로 저장된 문자열 JSON)
 
저장 방식 내부 JSON을 평면 문자열 구조로 저장 JSON 전체를 하나의 문자열(string)로 저장
매핑 필드 수 증가 필드 하나만 추가됨 필드 하나만 추가됨
검색 키 기반 검색 가능 (my_field.key: "value") 일반 검색 불가능 (문자열 검색만 가능)
집계(Aggregation) 제한적 (정렬, 집계 불가) 완전 불가
정렬/필터 불가 불가
성능 빠름, 경량 인덱싱 느림 (full-text index일 경우 비효율적)
사용 예 구조가 다양한 데이터 (로그, 메타데이터 등) 그냥 저장만 필요한 원본 JSON, 원본 백업 등
 

 

'Database > elastic search' 카테고리의 다른 글

2. elasticsearch indexing  (1) 2024.10.20
1. Elasticsearch  (0) 2024.10.18
Apache Lucene 4  (4) 2024.10.17