시계열 데이터 일정 간격 집계

 

엘라스틱서치 시계열데이터 날짜별, 시간별 등 기준 일정 간격으로 집계하는법을 알아봅시다.


달력기준 일정 간격 집계

GET [인덱스]/_search
{
    "query": {
        "match_all": {}
	},
	"size": 0,
	"aggs": {
		"my_buckets": {
			"date_histogram": {
				"field": "timetmp",
				"calendar_interval": "month",
				"format": "yyyy-MM"         
			}
		}
	}
}

 

my_buckets: 버켓 이름

field: 간격을 측정할 필드

format: 날짜 포맷

calendar_interval: 달력 간격

minute, 1m
hour, 1h
day, 1d
week, 1w
month, 1M
quarter, 1q 분기
year, 1y

 


시간기준 일정 간격 집계

GET [인덱스]/_search
{
    "query": {
        "match_all": {}
	},
	"size": 0,
	"aggs": {
		"my_buckets": {
			"date_histogram": {
				"field": "timetmp",
				"fixed_interval": "1h",
				"format": "yyyy-MM-dd/hh:mm:ss"
			}
		}
	}
}

 

my_buckets: 버켓 이름

field: 간격을 측정할 필드

format: 날짜 포맷

fixed_interval : 시간 간격

ms 밀리초
s
m
h
d

일정 간격 데이터 통계

GET [인덱스]/_search
{
    "query": {
        "match_all": {}
	},
	"size": 0,
	"aggs": {
		"my_buckets": {
			"date_histogram": {
				"field": "timetmp",
				"fixed_interval": "1h",
				"format": "yyyy-MM-dd/hh:mm:ss"         
			},
			"aggs":{
				"data_sum":{
					"sum" : { "field": "egg" }
				}
			}
		}
	}
}

 

각각의 date_histogram 데이터를 통계내고 싶으면 위와 같이 aggs 를 이용하여  통계낼수 있습니다.

 


기타

GET [인덱스]/_search
{
    "query": {
        "match_all": {}
	},
	"size": 0,
	"aggs": {
		"my_buckets": {
			"date_histogram": {
				"field": "timetmp",
				"fixed_interval": "6h",
				"extended_bounds": {
					"min": "2024-03-26T00:00:00"
					"max": "2024-03-26T23:59:59"
				}
			}
		}
	}
}

 

extended_bounds 를 이용하여 histogram 범위를 확장하면 중간에 Null값으로 인해 표시되지 않는 데이터도 표시할 수 있습니다.

 

extended_bounds 적용 전 데이터

"buckets":
[
    {
        "key_as_string": "2024-03-26T00:00:00.000Z",
        "key": 1711411200000,
        "doc_count": 4245
    },
    {
        "key_as_string": "2024-03-26T12:00:00.000Z",
        "key": 1711454400000,
        "doc_count": 1862
    }
]

 

extended_bounds 적용 후 데이터

"buckets":
[
    {
        "key_as_string": "2024-03-26T00:00:00.000Z",
        "key": 1711411200000,
        "doc_count": 4245
    },
    {
        "key_as_string": "2024-03-26T06:00:00.000Z",
        "key": 1711432800000,
        "doc_count": 0
    },
    {
        "key_as_string": "2024-03-26T12:00:00.000Z",
        "key": 1711454400000,
        "doc_count": 1862
    },
    {
        "key_as_string": "2024-03-26T18:00:00.000Z",
        "key": 1711476000000,
        "doc_count": 0
    }
]

마무리

 

잘못된 점이 있거나 궁금한 점이 있다면 언제든지 문의해주시기 바랍니다!

 

 

728x90
반응형

'프로그래밍 > Elasticsearch' 카테고리의 다른 글

[Elasticsearch] 엘라스틱서치 명령어 모음  (0) 2024.02.23

Elasticsearch 명령어 모음

 

작업할때 빠르게 명령어를 찾을려고 정리해 놓습니다.


Index

 

모든 Index 확인

GET _cat/indices?v

 

Index 구조

GET [인덱스]

# pretty 사용하면 들여쓰기를 보기편하게 해준다 #
GET [인덱스]?pretty

 

Index 생성

PUT [인덱스]

 

Index 삭제

DELETE [인덱스]

 

Index 내 Document 개수

GET [인덱스]/_count

 

Index 열기

POST [인덱스]/_open

 

Index 닫기

POST [인덱스]/_close

Index 검색

 

전체 검색

GET [인덱스]/_search
{
    "query": {
        "match_all": {}
	}
}

# 콤마를 사용하여 Index 여러개를 동시에 검색 가능 #
GET [인덱스 1],[인덱스 2]/_search
{
    "query": {
        "match_all": {}
	}
}

# 와일드카드 사용가능 #
GET */_search
{
    "query": {
        "match_all": {}
	}
}

GET test*/_search
{
    "query": {
        "match_all": {}
	}
}

 

단일 검색

# 풀 텍스트 검색 #
GET [인덱스]/_search
{  
	"query":{  
		"match":{  
			"필드":"값"
		}
	}
}

# 정확하게 일치하는 텍스트만 검색 #
GET [인덱스]/_search
{
	"query": {
		"term": {
			"필드": "값"
		}
	}
}

 

기본적인 다중 검색

# 모든 조건이 일치 (검색 스코어 계산 O) #
GET [인덱스]/_search
{
	"query": {
		"bool": {
			"must": [ 
				{ "match": { "필드":"값" } },
				{ "match": { "필드":"값" } }
			]
		}
	}
}

# 조건중 하나이상 일치 (검색 스코어 계산 X) #
GET [인덱스]/_search
{
	"query": {
		"bool": {
			"filter": [
				{ "match": { "필드":"값" } },
				{ "match": { "필드":"값" } }
			]
		}
	}
}

# 모든 조건이 일치하지 않음 #
GET [인덱스]/_search
{
	"query": {
		"bool": {
			"must_not": [
				{ "match": { "필드":"값" } },
				{ "match": { "필드":"값" } }
			]
		}
	}
}

# 조건중 하나이상 일치 #
GET [인덱스]/_search
{
	"query": {
		"bool": {
			"should": [
				{ "match": { "필드":"값" } },
				{ "match": { "필드":"값" } }
			]
		}
	}
}

# 배열중 하나이상 일치 #
GET [인덱스]/_search
{
	"query": {
		"terms": {
			"필드": ["값 1","값 2","값 3"]
		}
	}
}

# 값1과 값2 사이 3자리 검색어 포함 검색 #
GET [인덱스]/_search
{
	"query": {
		"match_phrase": {
			"필드": {
				"query": "값1 값2",
				"slop": 3
			}
		}
	}
}

# 값1과 값2 사이 3자리 검색어 포함 검색 #
GET [인덱스]/_search
{
	"query": {
		"range": {
			"필드": {
				"gte": "크거나 같은 값",
				"gt": "큰 값",
				"lte": "작거나 같은 값",
				"lt": "작은 값"
			}
		}
	}
}

 

복합적인 다중 검색

# 특정 범위의 A or B 
GET [인덱스]/_search
{
	"query": {
		"bool": {
			"filter": [	  
			{
				"range": {
					"필드": {
						"gte": "크거나 같은 값",
						"gt": "큰 값",
						"lte": "작거나 같은 값",
						"lt": "작은 값"
					}
				}
			},
			{
				"bool":{
					"should": [
						{ "match": { "필드": "A값" } },
						{ "match": { "필드": "B값" } }
					]
				}
			}
		]
		}
	}
}

# (A and B) or (C and D) #
GET [인덱스]/_search
{
	"query": {
		"bool": {
			"should": [
				{ "bool": {
					"must":[
						{ "match": { "필드": "A 값" } },
						{ "match": { "필드": "B 값" } }
					]
				}
			},
				{ "bool": {
					"must":[
						{ "match": { "필드": "C 값" } },
						{ "match": { "필드": "D 값" } }
					]
				}
			}
			]
		}
	}
}

# (A or B) and (C or D) #
GET [인덱스]/_search
{
	"query": {
		"bool": {
			"must": [
				{ "terms": {
					"필드": ["A 값","B 값"]
					}
				},
				{ "terms": {
					"필드": ["C 값", "D 값"]
					}
				}
			]
		}
	}
}

 

검색 결과 가공

# 결과 개수 0페이지, 100개 #
GET [인덱스]/_search
{
	"query":{
		"match_all":{}
	},
	"from" : 0,
	"size" : 100,
}

# 결과 정렬 desc 내림차순, asc 오름차순 #
GET [인덱스]/_search
{
	"query":{
		"match_all":{}
	},
	"sort" : [
		{ "필드" : "desc" },
		{ "필드" : "asc" }
	]
}

# 집계 #
GET [인덱스]/_search
{
	"query":{
		"match_all":{}
	},
	"aggs":{
		"평균 임의필드": {
			"avg": {"field": "집계필드"}
		},
		"최솟값 임의필드": {
			"min": {"field": "집계필드"}
		},
		"최댓값 임의필드": {
			"max": {"field": "집계필드"}
		},
		"전체합계 임의필드": {
			"sum": {"field": "집계필드"}
		},
		"백분윗값 임의필드": {
			"percetiles": {"field": "집계필드"}
		},
		"avg,min,max,sum,count 값 임의필드": {
			"stats": {"field": "집계필드"}
		},
		"유니크값 임의필드": {
			"cardinality": {"field": "집계필드"}
		},
		"필드 내부위치 정보의 중심점 임의필드": {
			"geo-centroid": {"field": "집계필드"}
		}
	}
}

# 집계 데이터에서 다시 집계 #
GET [인덱스]/_search
{
	"query":{
		"match_all":{}
	},
	"aggs": {
    	"임의필드": {
      		"cardinality": { "field": "집계필드" }
		},
		"aggs": {
			"임의필드": {
				"min": { "field": "집계필드" }
			}
		}
	}
}

 


마무리

 

잘못된 점이 있거나 궁금한 점이 있다면 언제든지 문의해주시기 바랍니다!

728x90
반응형

+ Recent posts