2021년 9월 12일 일요일

정규표현식 몰라도 된다 - 2nd

정규표현식보다 데이터 이해도가 더 중요함은 엘라스틱도 마찬가지. 일단 간단한 예제 인덱스 생성.
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);
      """
    }
  }
}


데이터에 대한 이해만 충분하면 스플렁크든 엘라스틱이든, 정규표현식이든 뭐든 다 취사 선택 가능한 툴일 뿐이다. 내게 편한 툴을 선택하면 그만.

관련 글

댓글 없음:

댓글 쓰기

크리에이티브 커먼즈 라이선스