정규표현식보다 데이터 이해도가 더 중요함은 엘라스틱도 마찬가지. 일단 간단한 예제 인덱스 생성.
POST _bulk{"index": {"_index": "test"}}{"url": "/path1/a.php"}{"index": {"_index": "test"}}{"url": "/path1/path2/b.php"}{"index": {"_index": "test"}}{"url": "/path1/path2/path3/c.php"}
url 데이터에서 file 정보를 추출해보자. 다음은 읽기 스키마 기반의 runtime field 생성 쿼리. grok(정규표현식).extract(소스 필드) 구문을 result 변수에 저장 후 실행(emit)하는 방식.
PUT test/_mapping{ "runtime": { "file": { "type": "keyword", "script": """ String result = grok('.*\\/(?<result>.*)').extract(doc['url.keyword'].value)?.result; emit(result); """ } }}
정규표현식이 낯설다면
url은 경로와 file 정보의 조합이며, /로 구분된다는 데이터 구조의 특징만 기억하면 된다. 다음은 /를 기준으로 마지막 문자열을 가져오는 쿼리 구문.
PUT test/_mapping{ "runtime": { "file": { "type": "keyword", "script": """ String result = doc['url.keyword'].value.splitOnToken('/')[-1]; emit(result); """ } }}
내친 김에 확장자 정보도 추출.
PUT test/_mapping{ "runtime": { "ext": { "type": "keyword", "script": """ String result = doc['url.keyword'].value.splitOnToken('.')[-1]; emit(result); """ } }}
데이터에 대한 이해만 충분하면 스플렁크든 엘라스틱이든, 정규표현식이든 뭐든 다 취사 선택 가능한 툴일 뿐이다. 내게 편한 툴을 선택하면 그만.
관련 글
댓글 없음:
댓글 쓰기