Elasticsearch의 문서와 색인, TF와 IDF

0

이번엔 Elasticsearch의 몇가지 기본개념을 살펴보도록 하겠다.

Elasticsearch에는 두 가지 중요한 논리적 개념이 존재한다.

첫번째는 문서(Document)이다.

데이터베이스적 관점에서 생각한다면 Document는 테이블 속 한 행을 의미하며 모든 Document는 고유 ID를 가질 수 있다. 직접 이러한 고유 ID를 할당할 수도 있고, Elasticsearch를 통해 자동으로 할당할 수도 있다.

두번째 개념은 색인(index)이다.

색인은 데이터베이스적 관점에서 데이터베이스의 테이블과 같은 개념이다. 색인은 각 문서 내의 데이터 유형을 정의하는 체계가 있고, 하나의 색인에는 한가지 데이터 타입의 문서만 사용할 수 있다.

간단히 요약하자면 클러스터가 데이터베이스라고 생각하고, 인덱스가 테이블, 문서는 그 테이블의 행이라고 생각하면 된다.

😮 그렇다면 어떻게 엘라스틱서치는 우리의 검색어가 포함된 문서를 찾아낼 수 있는 것일까?

여기서 우선은 역색인(Inverted index)라는 개념을 알아야한다. 다음과 같은 두개의 document가 있다고 가정하자

문서1(Document1)

Space: The final frontier. These are the voyages

문서2(Document2)

He's bad, he's number one. He's the space cowboy with the laser gun!

Elasticsearch는 문서를 단어별로 해체하고 소문자로 변환한다. "space"라는 단어는 두 문서에 모두 나타난다. 따라서 역색인은 "space"가 문서1, 문서2에 포함되어있음을 나타낸다.

Inverted index
space: 문서1, 문서2
the: 문서1, 문서2
final: 문서1
frontier: 문서1
he: 문서2
bad: 문서2

우리는 이러한 역색인을 이용하여 검색을 수행할 수 있는 것이다.

하지만 "the"라는 단어는 매우 흔하고 사실상 모든 문서에 포함되어있다. 따라서 "the"를 검색할 때, 어떻게 우리는 "the"가 의미있는 문서만을 가려낼 수 있을까?

여기서 TF-IDF(Term Frequency, Inverse Document Frequency)라는 개념을 알아야한다.

TF(단어빈도)는 지정된 검색어가 문서 내에서 나타내는 빈도를 뜻한다. 만약에 어떤 문서에서 "space"라는 단어가 자주 등장한다면 단어빈도(TF)가 높아진다.

이에 반해, 문서빈도(DF)는 색인내의 모든 문서에서 단어가 사용되는 빈도를 의미한다. 따라서 "space"는 문서빈도가 낮고 "the"는 모든 문서에서 꽤 자주 등장하므로 문서빈도가 굉장히 높을 것이다. 여기서 우리가 단어빈도를 문서빈도로 나눈다면 이는 단어빈도에 역문서빈도(IDF)를 곱하는 것과 같고, 이는 관련성을 수학적으로 구한 것을 의미한다.

예를 들면, "space"라는 단어는 우주에 관한 기사에서 높은 관련성을 가질 것이고 반대로 "the"는 그렇게 높은 관련성을 나타내지 않을 것이다. 왜냐하면 "the"는 다른 문서에서도 자주 사용되는 흔한 단어이기 때문이다.

이게 검색 엔진이 작동하는 기본적인 그림이다. 어떠한 단어를 검색하면 관련성이 높은 순서대로 결과를 가져온다. 그리고 관련성은 TF-IDF의 개념에 기초하고 있다.

profile
Software engineer who is interested in server development, computer vision, and soccer

0개의 댓글