안녕하세요. 이번 시간에는 kibana에서 regex로 filter를 거는 방법을 알아보겠습니다. 8.5.0 버전 기준으로 설명합니다. 사실 간단한 정도의 regex는 지원이 되니, 이용해 보시는 것도 나쁘지 않겠습니다. 어떤 것을 지원하는지는 문서 참고하시면 되겠습니다.

 


 저번 시간에 KQL을 이용해서 filter를 걸었습니다. 그런데, 문제는 이것이 regex를 지원하지 않습니다. 그래서, 이메일 패턴이 있을 때, @ 앞에 붙은 아이디가 7자 이상인 email이 있는 문서에 대해서 찾지 못합니다. 이것을, Elasticsearch Query DSL이 가능하게 해 줍니다.

 

 eCommerce 샘플 데이터를 보겠습니다.

 

 

 email의 type을 확인해 보니 k라고 되어 있습니다. Keyword를 의미합니다.

 

 

 깔대기 모양의 메뉴를 누르면, Saved query가 나오는데요. 여기서, Add filter를 눌러 보겠습니다.

 

 

 그러면 이런 메뉴가 보이는데요. Edit as Query DSL을 눌러보겠습니다.

 

 

 먼저, regexp는 term 레벨의 쿼리라고 문서에서 언급이 되어 있습니다. 그래서, 정확하게 일치하는 용어가 있는 결과를 찾습니다. 이것은 "email" 필드가 패턴 ".{7,}@.+"을 만족하는 것만 뽑아줍니다. 해석해 보면, 어떠한 문자가 7개 이상 나오고, @가 나온 다음에, 어떠한 문자가 1개 이상 나오는 패턴과 일치하는 것이 있으면 결과에 나옵니다.

 

 

 그런데, 결과를 보니, selena@~ 꼴도 있습니다. @ 앞에 있는 글자 수가 6개인데요. 이게 어떻게 된 일일까요? 사실 문서를 보면 ALL이 default로 되어 있습니다. 이 말인 즉은, 선택적인 옵션이 모두 참이라는 이야기입니다. @ 옵션은 Any entire string을 의미하는데요. 먼저, .{7,}로 7개 이상의 문자를 받습니다. 그 다음에 @가 들어온 다음에, .+가 들어왔습니다. 즉, 이 말인 즉슨, 7개 이상의 문자를 받은 후에, 모든 문자열이 뒤에 append된 형태를 의미합니다.

 

 모든 데이터의 이메일 길이가 10자 이상이였기 때문에, 모든 문서가 결과에 나옵니다. 

 

 

  이는 간단하게 "value"를 "jackson@.+"을 주면 알 수 있는데요.

 

 @ 앞에 jackson만 붙였는데, 50 hits로 매우 많이 줄어들었습니다. jackson으로 시작하고, 그 다음에 any string이 붙고, 길이 1이상인 string이 붙는 패턴의 term이 있는지를 검사하기 때문입니다.

 

 

 이건 어떨까요? jackson이 오고, Any string이 온 다음에 .+byrd-family.zzz 패턴이 오는지 검사하는 것입니다.

 

 고로, 1개의 패턴만 매치됩니다.

 


 default는 모든 선택적인 option이 참이 됩니다. 고로, 해당 옵션들을 막던지, 아니면 escaping을 시켜줘야 하는데요. 저는 옵션들 중 일부만 활성화 시키는 방법을 선택하였습니다. 먼저 메타 문자 '@'의 활성화를 막기 위해서 flags를 NONE으로 주었습니다.

 

 

 flags를 NONE으로 주면 아무 옵션도 활성화 시키지 않습니다. value는 똑같이 임의의 문자열이 7개 이상 나온 다음에 @가 나오고, 임의의 문자열이 1개 이상 나오는 패턴입니다.

 

 

 결과가 잘 나왔음을 확인할 수 있어요.

 

 

 COMPLEMENT 플래그는 메타 문자 ~를 활성화 시킵니다. 이것은 NOT을 의미합니다. value에 @~(hopkins-family)가 있는데요. 이는 @ 다음에 hopkins-family 패턴에 길이가 1 이상인 문자열 패턴이 안 나온다는 것을 의미합니다. 

 

 

 결과를 보면 749개가 나옵니다. 여러 flag를 추가하려면 | 이라는 문자를 붙여서 연결해 주면 됩니다. 이것 말고도 다양한 옵션들이 있으니, 자세한 스펙은 문서를 참고하시면 됩니다.