Elasticsearch에서 진짜 join 사용하기

Elasticsearch에서 join이 가능하다고 하는데, 메뉴얼 읽어보면 꼭 사기치는 느낌입니다. 실제는 안되는데, 그래도 쓰고 싶으면 써! 이렇게 이야기를 해주던지…. (영어로 되어 있어서 이해 못했을 수도 있습니다.)

암튼  RDB에서 이야기하는 진짜 join을 할 수 있는 방법이 있습니다.

아래 쿼리를 보면 “join user_id, dept_code” 이 내용이 있는데, 이 기능으로 join을 처리합니다.

딱 보면 아시겠지만, Splunk의 SPL과 유사합니다.

ML Alert를 사용하면 Splunk의 SPL을 사용하는 것처럼 ELK의 데이터를 분석할 수 있습니다.

join 이외에도 여러가지 명령어들을 사용할 수 있습니다.

SPL Command List

index

정확히 index라는 Command는 없고 index를 지정해서 검색하는 하는 기능이다. 아래처럼 인덱스를 정하고 필드 검색을 할 수 있다.
필드 검색 시 log_message=”message”일 경우 log_message가 포함되어 있는 문서를 검색한다.
그리고 log_message=”Rejected message”은 2개의 키워드가 모두 존재하는 문서를 검색한다. 즉 공백은 AND로 처리된다.
예) index=”mail_log” log_message=”Rejected message not authorized to relay to”

stats

Splunk의 stats 명령어와 유사합니다. SQLite 기능을 활용해서 개발한 것이라 SQLite에서 사용하는 함수들 대부분 지원합니다.
예1) index=”network_traffic” | stats round(avg(bytes)/1024), sum(bytes), count(*), min(bytes), max(bytes) by src
예2) index=”network_traffic” | dedup src, dpt | stats group_concat(dpt) by src
Support Function List

Type of function Supported functions and syntax
Aggregate functions sum(), avg(), min(), max(), count(), GROUP_CONCAT(expression, separator)

tstats

Support Function List

Type of function Supported functions and syntax
Aggregate functions count(), distinct_count(), dc(), mean(), avg(), median(), median_absolute_deviation(), stats(), extended_stats(), min(), max(), sum(), values(), terms()

stats() : min(), max(), sum(), count(), avg()
extended_stats() : min(), max(), sum(), count(), avg(), sum_of_squares(), variance(), std_deviation(), std_deviation_bounds_upper(), std_deviation_bounds_lower()

streamstats

Splunk의 streamstats 명령어와 유사합니다.
예) streamstats sum(bytes) by src_ip

Type of function Supported functions and syntax
Aggregate functions sum(), avg(), mean(), median(), min(), max()

timechart

예) timechart c from network_traffic by src span=”1d”

where

예) index=”network_traffic” | where src=”192.168.0.202″ | table src, dst, bytes

table

예) index=”network_traffic” | where src=”192.168.0.202″ | table src, dst, bytes

head

예) index=”network_traffic” | head 100

rename

예) tstats avg(bytes) from network_traffic by src, dst | rename avg(bytes) as avg_of_bytes

dedup

중복제거 예) index=”network_traffic” | table src, dst, bytes | dedup
예) index=”network_traffic” | table src, dst, bytes | dedup src, dst, bytes

eval

예) tstats avg(bytes) as avg_bytes from network_traffic by src | eval avg_kb=round(avg_bytes/1024)
Support Function List

Type of function Supported functions and syntax
Mathematical functions abs(X), ceiling(X), exp(X), floor(X), ln(X), log(X,Y), pi(), pow(X,Y), round(X,Y), sqrt(X)
Trigonometry and Hyperbolic functions sin(X), cos(X), tan(X), abs(X), fabs(X), sqrt(X), square(X), modf(X), sign(X)
Text functions 개발중

Operators

Type Operators
Arithmetic + – * / %
Boolean 테스트중
Concatenation 테스트중

rex

Use this command to either extract fields using regular expression named groups, or replace or substitute characters in a field using sed expressions.
The rex command matches the value of the specified field against the unanchored regular expression and extracts the named groups into fields of the corresponding names.

예) index=”mail_log” | rex field=log_message “Rejected\smessage\s-\s*(?P<source_ip>[0-9].[0-9].[0-9].[0-9])”

sort

예) tstats c from network_traffic by src | sort -c

join

Splunk에서 사용하는 join과 동일하고 현재는 LEFT OUTER JOIN만 지원합니다. INNER JOIN을 원하신다면 아래처럼 IN 을 사용한 서브쿼리를 사용해주세요. tstats max(@timestamp) as event_time, c from safe_db where size>5000 and user_id not in (## tstats c from exception_user by user_id ##) by user_id, dept_code

예) tstats max(@timestamp) as event_time, c from safe_db by user_id, dept_code | join user_id, dept_code [ index=insa_db | table user_id, user_name, dept_code, dept_name ]