[엘라스틱서치 알아보기 #1] 엘라스틱서치는 검색엔진이다.

Jake Seo·2019년 7월 15일
12

Look-Into-Elasticsearch

목록 보기
1/4

엘라스틱서치 알아보기 프로젝트는 엘라스틱서치 실무가이드의 목차와 내용을 참조하였습니다. 이 포스트를 읽는 분들이라면 엘라스틱서치 실무가이드 책을 한권 반드시 구매하는 것을 권장합니다.

엘라스틱서치는 검색엔진이다.

일반적으로 검색 엔진(search engine)이라 하면 마냥 검색 결과를 제공하는 프로그램을 떠올립니다. 그래서 사람들은 검색엔진이라 하면 네이버나 구글같은 것을 떠올리기 쉽습니다. 물론 그러한 서비스도 일반적으로 검색 엔진이라 말하지만, 엄밀히 말하자면 그건 검색 서비스로서의 검색 엔진에 가까운 것입니다. 엘라스틱서치는 반면에 프로그램으로서의 검색엔진을 말합니다.

  • 검색 서비스로서의 검색 엔진이란?
    - 검색엔진을 기반으로 구축한 검색 시스템을 활용해 검색 결과를 서비스로 제공하는 것
  • 프로그램으로서의 검색 엔진이란?
    - 현재 가지고 있는 데이터 중에서 특정한 데이터를 검색할 수 있는 기능을 제공하는 것

엘라스틱서치는 우리가 가진 데이터 중 특정한 성질을 갖는 데이터를 찾는 것을 도와주는 녀석입니다.

검색 사이트를 만들고 싶다면?

그렇다면 만일 네이버나 구글같은 사이트를 만들려면 어떻게 해야 할까요? 여러가지가 필요합니다.

  1. 수집기
    • 주로 웹 크롤러라고 불리는 수집기는 여러 사이트를 돌아다니며 그 사이트가 가진 내용들을 특정한 저장소(주로 DB)에 저장합니다.
  2. 저장소(DB)
    • 수집기가 저장한 데이터를 저장할 수 있는 저장소가 당연히 필요합니다.
  3. 색인기
    • 수집한 데이터를 색인이라는 과정을 거쳐 검색하기 용이한 데이터로 만들어주는 역할을 합니다.
    • 검색 엔진의 색인기의 경우 주로 역색인이라는 색인 방법을 사용합니다
  4. 검색기
    • 색인된 단어를 검색할 수 있는 검색기(검색 엔진)가 필요합니다. 검색기는 검색순위 알고리즘을 가지고 있어서 더욱 적합한 검색결과라고 생각할수록 그 결과를 상위에 표시해줍니다.
  5. 검색 결과를 제공할 웹 UI
    • 보통 웹개발자들이 만듭니다. HTML, CSS, JS등의 기술이 필요합니다.

이 중에서 엘라스틱서치는 그 자체로 2, 3, 4의 기능을 훌륭하게 소화합니다. 엘라스틱서치에 대해 더 자세히 알아보기 위해 우리는 색인이라는 단어에 익숙해질 필요가 있습니다. 검색엔진을 위한 색인에는 특수한 색인인 역색인을 사용해야 하는데 역색인이란 무엇인지 알아봅시다.

검색엔진의 핵심 개념 역색인(Inverted-Index)과 색인(Index)이란?

색인이란? 특정한 데이터가 어느 위치에 있는지 미리 저장해두어 검색 시에 빠른 속도로 찾을 수 있는 것입니다. 국어사전에서 가나다순의 첫번째 단어마다 갈피를 만들어 놓아 우리가 찾는 단어를 빨리 찾을 수 있는 것과 비슷한 것입니다.

역색인이란? 일반적인 색인은 데이터의 위치를 그저 순서대로 기억합니다. 이를테면 '나는 홍길동 입니다. 나는 아버지를 아버지라 부르지 못 합니다.' 라는 문자열 데이터가 있는 경우에 다음과 같이 색인될 수 있습니다.

1. 나는 홍길동 입니다.
2. 나는 아버지를 아버지라 부르지 못 합니다.

위와 같이 색인이 된 경우에 내가 만일 '홍길동'이란 단어가 들어간 데이터를 찾는다고 검색하면 색인 결과에 따라 1번 데이터에 내가 원하는 데이터가 있다는 결과가 나올 수 있습니다.

다만, 이 검색 방법에는 약간의 문제가 있다. 이렇게 적은 데이터셋에서 검색을 할 때는 상관이 없지만, 만일 매우 많은 데이터가 존재한다고 해보면 어떨까요? 데이터 번호 1번부터 약 50만번까지 데이터가 있다고 가정하면, 검색을 위해서 우리의 검색엔진은 1번부터 순서대로 50만번까지 검색을 할 것입니다.

최악의 경우 우리가 검색하려는 데이터가 50만번째에 존재한다고 하면 엄청난 속도지연이 발생할 수 있습니다.

우리는 이러한 현상을 개선하기 위해서 역색인(inverted-index)이 필요합니다.

역색인이란 데이터 색인 시에 조금 더 인간의 사고와 가깝게 체계를 구성한 것입니다. 어떠한 데이터를 색인할 때 Term(단어) 기준으로 색인을 수행하는 것입니다. 위의 예제를 역색인한다면 다음과 같습니다.

나 #1, 2
는 #1, 2
홍길동 #1
입니다 #1
아버지 #2
를 #2
부르지 #2
못 #2
합니다 #2

이렇게 역색인된 데이터가 구성되어있다면 홍길동이라는 단어를 보고 바로 2번 문서에 있다는 것을 알 수 있습니다. 그래서 검색 시에 바로 2번 문서를 표기해줄 수 있는 것입니다. 그리고 간단히 생각해봤을 때, 단어를 기반으로 검색하고, 가,나,다에는 순서가 있습니다. 그렇다면 우리가 사전을 찾듯 빠르게 그 단어를 찾아갈 수 있다고 생각해볼 수 있고 그로 인해 엄청난 속도로 검색이 가능할 것입니다.

검색기는 형태소 분석을 한다

위에 검색기는 색인된 단어를 검색한다고 하였습니다. 그런데 우리는 검색 시에 보통 단어만 입력하는 경우는 없습니다. 문장을 통째로 검색합니다. 만일 그 문장이 통째로 검색이 된다면 일치하는 검색결과를 찾기 매우 어려울 것입니다.

이를테면 '검색 잘하는 방법' 이라고 검색했을 때 정확히 '검색 잘하는 방법'이라는 문장 포함하는 웹사이트가 얼마나 될까요? 거의 없을 것입니다.

그래서 검색기는 검색하는 단어의 형태소를 분석합니다. 이를테면 검색 잘하는 방법을 검색했다고 치면 결과는 다음과 같을 수도 있습니다. (형태소 분석에 전문적인 지식이 없으니 참고만 하세요.)

검색 (명사)
잘하는 (형용사)
방법 (명사)

그러면 우리의 똑똑한 검색엔진은 역색인을 보고 검색이라는 단어가 있는 문서가 몇번째에 있는지 알려줄 수 있을 것입니다.

검색 결과를 분류하기 위해 사용되는 TF-IDF

검색엔진과 자주 함께 언급되는 것이 검색의 품질입니다. 여기서 품질이란 '내가 원하는 검색 결과가 나왔는지', '엉뚱한 것이 검색 결과로 나타나는지', '제한시간 내에 검색 결과가 나타나는지' 등 많은 부분에서 평가될 수 있습니다.

이 중에 TF-IDF는 '내가 원하는 검색 결과가 나왔는지'에 대한 이야기입니다.

먼저, TFTerm Frequency 말 그대로 용어의 빈도 수를 말합니다. 문서 내부에 내가 검색한 검색어가 얼마나 많이 포함되는지에 대해 검사하는 것을 말합니다. 만일 내가 검색한 검색어가 문서 내부에 많이 포함되어 있다면, 그 문서는 상위로 올라갈 것입니다.

IDFInverse Document Frequency입니다. 흔하지 않은 단어가 사용되었는지에 대한 이야기입니다. 만일 검색어에 매우 특수한 단어가 있고 다른 단어는 포함하지 않더라도 그 특수한 단어가 정확히 매칭된 문서가 있다면, 그 문서는 상위로 올라갈 것입니다.

그리고 또 Boosting이란 것이 있는데, 이것은 특정한 단어에 임의로 가중치를 주어 해당 단어가 사용되면 문서를 상위로 올리는 기법입니다.

결론

엘라스틱서치는 프로그램으로서의 검색엔진입니다. 우리가 가진 데이터 중 우리가 검색하는 특정한 데이터를 포함한 데이터를 찾아줍니다. 엘라스틱서치는 효과적인 검색을 위해 역색인형태소분석을 합니다. 그래서 빠른 속도의 데이터 검색이 가능합니다.

여기까지 엘라스틱서치는 검색엔진이라는 것을 알아보았습니다. 다음 글에서는 엘라스틱서치와 관계형데이터베이스의 차이는 무엇인지 알아보겠습니다.

profile
풀스택 웹개발자로 일하고 있는 Jake Seo입니다. 주로 Jake Seo라는 닉네임을 많이 씁니다. 프론트엔드: Javascript, React 백엔드: Spring Framework에 관심이 있습니다.

2개의 댓글

comment-user-thumbnail
2020년 12월 9일

이렇게 역색인된 데이터가 구성되어있다면 홍길동이라는 단어를 보고 바로 2번 문서에 있다는 것을 알 수 있습니다. 그래서 검색 시에 바로 2번 문서를 표기해줄 수 있는 것입니다

이건 오타인가요? 홍길동 1번인데 ㅎ

1개의 답글