BLOG

Amazon Elasticsearch Service로 URL 경로 분석해 개별 요소 검색 가능
작성일: 2019년 4월 4일

기본 데이터에 대한 메타데이터 및 카탈로그 검색 기능이 있으면 AWS 클라우드에 데이터 레이크(가공되지 않은 상태로 저장돼 접근이 가능한 엄청난 양의 데이터)를 쉽게 구축할 수 있습니다. S3키, S3와 객체 메타데이터(object metadata)를 저장하고 검색할 때는 Amazon Elasticsearch Service (Amazon ES)가 도움이 됩니다. S3 키에 객체 이름은 당연히 포함되지만, 검색하려는 경로 요소를 식별하는 추가 키가 포함될 수도 있습니다. 주요 경로를 검색하려면 Amazon ES를 어떻게 설정해야 할까요? 텍스트 필드(text fields)를 위한 맞춤형 분석기를 구축하려면 어떻게 해야 할까요?

 

분석

 

Amazon Elasticsearch Service(Amazon ES)를 사용하면 응용프로그램의 데이터를 쉽게 검색할 수 있습니다. Elasticsearch는 어떤 특징들을 갖고 있을까요? Amazon ES는 데이터, 매핑(mappings), 검색 요청 등을 관통하는(pass through) 관리 계층(layer)입니다. Amazon ES와 Elasticsearch 관계에 대한 자세한 내용은 설명서를 참고하세요.

 

Amazon ES로 매핑과 문서를 보내면 매핑은 Elasticsearch가 필드 값(the values in fields)을 분석하는 방법을 정하고 쿼리(queries)를 타깃으로 하는 항을 생성합니다. Elasticsearch는 쿼리를 Amazon ES로 보낼 때 쿼리의 항들과 문서 필드의 항들을 연결 지어보고 해당 문서가 쿼리와 일치하는지를 알아냅니다. Elasticsearch는 쿼리 결과에 따라 일치하는 항목들의 순위를 매기고 돌려보냅니다.

 

그렇다면 텍스트 유형 값은 어떨까요? Elasticsearch 6.x 매핑은 텍스트키워드의 두 가지 텍스트 필드를 지원합니다. 키워드 필드는 최소로 처리되며 데이터를 정확히 대조하기 위한 기초가 됩니다. 텍스트 필드를 분석하면 항(terms)이라고 불리는 개별 단어로 나뉩니다. (Elasticsearch의 이전 버전들은 텍스트 유형의 이름들이 버전마다 달랐다는 점에 유의하세요.)

 

Elasticsearch는 텍스트 필드를 분석해 여러 처리 단계를 거쳐 텍스트를 전달하는 기술입니다. 이 기술은 텍스트 필터를 통해 글자 흐름(the stream of characters)을 전달하고 tokenizer를 적용해 이어지는 항들을 내보낸 후 마지막으로 생성된 토큰 필터를 적용합니다.

 

 

아래 나온 것처럼 각 단계의 동작을 사용자 지정할 수 있습니다.

 

 

Elasticsearch의 분석기

 

Elasticsearch는 다음을 포함해 여러 가지 분석기(analyzer)가 구축돼 있습니다.

 

  • Whitespace – 추가 문자나 토큰 필터링 없이 Whitespace에서 소스 문자열을 분할해 항을 생성하세요.
  • Simple – 비문자에서 소스 문자열을 분할하고 텍스트를 소문자로 바꿔 항을 생성합니다.
  • Standard유니코드 문자 분할을 적용해 항을 생성하세요. Standard는 텍스트 필드의 기본 분석기입니다. 이 분석기는 항을 소문자로 바꿔주지 않습니다.
  • Keyword – 전체 입력 문자열은 수정되지 않은 하나의 항으로 쓰입니다.
  • Language analyzers – stemming, 불용어(stop words) 및 동의어(stemming, 불용어 및 동의어에 대한 자세한 내용까지)를 포함하며, 전문화된 언어별 텍스트 처리 방식을 포함하여 언어별로 취급해주는 전문 분석기들이 있습니다.

 

 

분석기 사용

 

인덱스를 만들 때 매핑에 필드를 지정해 필드에 사용할 분석기를 설정하세요. 예를 들어, 아래의 매핑은 my_field의 분석기를 whitespace 분석기로 설정합니다.

 

PUT scratch_index

{

   “mappings”: {

       “my_data”: {

           “properties”: {

               “my_field”: {

                   “type”: “text”,

                   “analyzer”: “whitespace”

                 }

               }

             }

           }

         }

 

참고: Amazon Elasticsearch Service의 기존 필드에서는 분석기를 변경할 수 없습니다. 분석기를 테스트할 때는 쉽게 삭제하고 또 다시 만들 수 있는 스크래치 인덱스(scratch index)를 이용하세요.

 

 

예제

 

간단한 분석을 할 때 IoT를 이용하는 것은 어떨까요? 태양 전지판이 뉴멕시코 주 산타페 근처 사막에 있는 겁니다. 전력회사는 미국 전역에 태양 전지판과 같은 설비를 많이 갖추고 있으며, 온도, 주변 빛, 햇빛 등에 관한 데이터를 저장하고 있습니다. 이 데이터는 지역, 주(state), 시(city), 필드의 지리적 위치별로 구성된 키 및 각 장치에 대한 시간당 파일들과 S3(s3://devices/region/state/city/geo-ip/date-time/device name.txt)로 이동합니다.

 

전력회사는 지역, 도시, 주, 위치 및 장치 이름으로 이 데이터를 검색합니다. 이 파일들의 상태는 Kibana를 통해 타임 스탬프(편지·문서의 발송·접수 날짜·시간을 기록)를 기반으로 추적 및 관찰할 수 있습니다.

 

_analyze API를 사용하면 Elasticsearch가 어떤 문자열을 어떻게 분석할지 알 수 있습니다. “s3 simpledevices/southwest/new-mexico/santa-fe/9wkdvgw71z9/2019-02-08-00/Location-15.txt” 문자열을 처리하는 데 standard, simple, whitespace 분석기를 사용해봤습니다. 예를 들어, standard 분석기의 출력(output)을 보려면 아래의 call(불러내기)을 이용하세요. (참고: 그 위치에 Geohash가 쓰일 수 있습니다—9wkdvgu781z9는 산타페 외부에 있는 곳을 지정합니다. Geohash를 이용하는 것에 대한 자세한 내용은 위키피디아를 참고하세요.)

 

GET _analyze

{

   “text”: “s3://devices/southwest/new-mexico/santa-fe/9wkdvgw781z9/2019-02-08-00/Location-15.txt”,

   “analyzer”: “standard”

 }

 

standard, simplewhitespace 분석기로 앞의 URL을 분석하면 다음과 같은 항들이 나옵니다:

 

 

각각의 결과는 거의 맞지만 정확히 맞지는 않습니다. standard 분석기는 파일 이름을 세 개의 토큰으로 분석하고 하이픈이 생기는 곳을 기준으로 도시(city)와 주(state)를 두 개의 항으로 구분합니다. simple 분석기는 타임 스탬프를 포함한 모든 숫자를 제거해 Geohash를 숫자가 없는 토큰 여러 개로 나눕니다. whitespace 분석기는 토큰 1개를 내보내서 경로 내 검색을 하지 못하게 합니다. standard, simple, whitespace 셋 중 어떤 것을 통해 결과를 내든 URL schema에서 “s3” 일부가 유지됩니다.

 

 

사용자 분석기 정의하기

인덱스에 대한 매핑의 설정(settings) 부분에 사용자 정의 분석기를 규정하고(define), 앞의 절(section)에서와 같이 이름으로 필드에 적용합니다. 사용자 정의 분석기를 규정하려면 다음 명령을 실행하세요.

 

PUT scratch_index
{
“settings”: {
“analysis”: {
“char_filter”: {
“my_clean”: {
“type”: “mapping”,
“mappings”: [“/ => \\u0020”,
“s3: => \\u0020”]
}
},
“tokenizer”: {
“my_tokenizer”: {
“type”: “simple_pattern”,
“pattern”: “[a-zA-Z0-9\\.\\-]*”
}
},
“analyzer”: {
“s3_path_analyzer”: {
“char_filter”: [“my_clean”],
“tokenizer”: “my_tokenizer”,
“filter”: [“lowercase”]
}
}
}
},
“mappings”: {
“my_data”: {
“properties”: {
“s3_key”: {
“type”: “text”,
“analyzer”: “s3_path_analyzer”
}
}
}
}
}

 

위 예제는 char_filter, tokenizer 및 token filter(filter)를 쓰는 사용자 정의 분석기 s3_path_analyzer를 규정하고 있습니다. 매핑은 매핑 특성(properties)의 필드를 규정하고 분석기(analyzer) 지시어를 사용해 s3_path_analyzer를 단일 필드인 s3_key에 적용합니다.

 

s3_path_analyzermapping char_filter를 사용하여 “s3:”와 “/”의 인스턴스를 공간(Unicode 32)으로 바꿉니다. s3_path_analyzer는 간단하게 패턴을 대조해보고 영문 알파벳과 숫자로 이루어진 문자들과 하이픈, 마침표를 동일한 토큰으로 그룹화하는 tokenizer를 이용합니다. s3_path_analyzer는 소문자(lowercase) 필터로 모든 토큰을 소문자로 표시해 패턴들을 더 쉽게 대조해볼 수 있도록 합니다.

 

s3_path_analyzer[devices, southwest, new-mexico, santa-fe, 9wkdvgw7818z9, 2019-02-08-00, location -15.txt]라는 항을 생성합니다.

 

분석기가 모든 항들을 정확하게 분석할 수 없었던 이전과 달리, 사용자 정의 분석기는 도시(city), 주(state), 지리 위치, 날짜 및 파일명에 대한 항을 생성하기 위해 S3 URL을 정확하게 분석합니다. 이제 URL의 모든 경로 요소들을 기반으로 검색(및 찾기!)를 할 수 있습니다.

 

결론

 

Elasticsearch 분석과 분석기들을 가볍게 살펴봤습니다. 사용자 정의 분석기는 위 예제 데이터에서는 잘 작동하지만 모든 데이터에서 작동하지는 않을 것입니다. 예를 들어, 어떤 데이터의 기간을 유지하는 것은 효과가 있지만, 모든 데이터에 효과가 있지는 않을 수 있습니다. Elasticsearch로 사용할 수 있는 다양한 분석기를 써보세요! 데이터를 이전보다 더 정확히 대조하고 쿼리 결과 검색 능력을 키울 수 있습니다.

 

원문 URL: https://aws.amazon.com/ko/blogs/database/analyze-url-paths-to-search-individual-elements-in-amazon-elasticsearch-service/

 

** 메가존클라우드 TechBlog는 AWS BLOG 영문 게재글중에서 한국 사용자들에게 유용한 정보 및 콘텐츠를 우선적으로 번역하여 내부 엔지니어 검수를 받아서, 정기적으로 게재하고 있습니다. 추가로 번역및 게재를 희망하는 글에 대해서 관리자에게 메일 또는 SNS페이지에 댓글을 남겨주시면, 우선적으로 번역해서 전달해드리도록 하겠습니다.