"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 } }
}
향후 관리를 위해선
- 필드 정리: 너무 많은 동적 필드(dynamic field)가 생기지 않도록 로그 포맷 정리 (예: info.key1, info.key2 → JSON blob 하나로 저장).
- flattened 타입 고려 (ES 7.3 이상): JSON 오브젝트를 텍스트 필드처럼 저장하여 필드 수 감소
- dynamic: false 또는 필요 없는 필드에 매핑 제외
번외
Elasticsearch에서 type: "flattened"과 JSON blob(string 저장 방식)은 모두 필드 수 폭증을 방지하기 위한 방식에 쓰이지만, 용도와 검색 가능성 면에서 차이가 있음
항목
저장 방식 | 내부 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 |