브렌쏭의 Veritas_Garage

Elastic Search 했어요~ 본문

[Project_만들다]/[Project_자아내다]

Elastic Search 했어요~

브렌쏭 2022. 4. 25. 10:20

묘하게 향수를 불러일으키는 문장이다. 샴푸를 불러일으킨다고 해야하나? 어쨌든, 엘라스틱 서치는 이름 그대로 검색을 위한 솔루션이다.

로고가 무슨 밝고 명랑한 수류탄 폭발 장면 같다

보통 뭔가를 찾는다고 한다면, 특히나 SQL과 같은 테이블에서 뭔가를 찾고 싶다면, 일단 검색할 칼럼을 선택하고 그 행을 전부 돌아보면서 일치하는 것이 있는지 보는 것이 정상이다. 혹은 평범한 방법이다. 라고 해야할까.

놀랍게도

어딘가에 사는 사이코들은 검색할만한 키워드로 검색이 될 객체들을 전부 거꾸로 연관지어서 새로운 검색전용 인덱스를 만들면 어떨까? 하고 생각했고, 그렇게 구글이 되었답니다. 메데타시 메데타시.

Inverted Index

위에서 말한 보통의 평범한 방식은 SQL에서 "LIKE" 방식으로 불리고, 데이터 양이 늘어날 수록 느려지는 비례적 탐색속도를 가지고 있었다. 

자 차근차근 한줄한줄 "Brown"이 포함된 글을 전부 찾아보자

이제 역 인덱싱을 하게 된다면, 공간 복잡도가 늘어나는 대신에 시간 복잡도가 낮아지는 등가교환의 법칙에 따라 순식간에 뚝딱 해낼 수 있는 것이다.

와! 너무 좋다!

그런 것이다.

이제 그러면 저 표에서 나온 TERM이라는 단위로 쪼개야 할텐데, 여기에도 몇가지 방법이 있다.

TEXT ANALYSIS

1. Character Filter Analyzer

  • HTML Strip : HTML 태그, 문법용어들을 제거
  • Mapping: 지정한 단어를 다른 단어로 치환 (특수문자 등을 포함하는 경우에 필수)
  • Pattern Replace: 정규식을 이용해서 복잡한 패턴들을 치환

2. Tokenizer

  • Standard Tokenizer: 공백을 기준으로 텀을 구분, 일부 특수문자들을 제거
  • Letter Tokenizer: 알파벳을 제외한 모든 공백, 숫자, 기호들을 기준으로 Term을 분리
  • Whitespace Tokenizer: 스페이스, 탭, 그리고 줄바꿈 같은 공백만을 기준으로 텀을 분리, 마침표 같은 문장요소도 거르지 않음

보통은 스탠다드를 많이 쓰는 편이다. 레터의 경우엔 영어권에서나 쓸모있고, 화이트스페이스는 검색하기가 여간 어려운게 아니기 때문.

3. Token Filter Analyzer

  • Lowercase, Uppercase: 보통은 Term을 모두 소문자로 변경하여 저장하는데, 이를 처리하는 Token Filter가 Lowercase.
  • Stop: 조사와 전치사 같은 불용어(stopword)를 제거하고 저장하도록 한다. 

덧. nGram Analyser

Elasticsearch는 빠른 검색을 위해 검색에 사용될 term을 미리 분리해 역색인하여 저장하는데, Term이 아닌 일부 단어로 검색해야 하는 기능이 필요할 때가 있다. 

노노그램도 루미큐브도 아닙니다

자동완성 기능을 만들려고 한다면 알아둬야 할것이다.

Comments