top bar

글 목록

2015년 5월 17일 일요일

[Elasticsearch] Exact Values Versus Full Text

1. 기본 개념


원문 - Exact Values Versus Full Text

요즘 Elasticsearch 공부에 푹 빠져있다. 회사업무가 바쁜터라, 많은 시간을 Elasticsearch 공부에 할애하진 못하지만, 공부할 때마다 흥미진진한 것 같다.

오늘은 Elasticsearch을 '검색엔진' 답게 해주는 근본 원리에 대한 내용을 포스팅 할까 한다.

(1) Exact Values

공식홈페이지의 원문 단어 그대로 인용해 보았는데, Exact Values란 말 그대로 '정확한 값' 이다. 예를들자면 사용자 ID라던가, 사용자이름, email 주소 등이 되겠다.
Exact Value의 관점에서 보았을때, 'Foo'와 'foo'는 같은 값이 아니다. 같은 논리로, '2014'와, '2014-09-15'도 같은 값이 아닌 것이다.

(2) Full Text

이와는 반대로 Full Text개념은 인간언어로 작성된 'textual data'라고 할 수 있다. 예를 들어 email안의 body내용과 같은 것이다.


Note:  full text를 흔히 '비구조화된 데이터'(unstructured data)라고 하는데, 이는 엄밀히 말하면 잘못된 용어다. 왜냐하면 자연어(natural language)는 굉장히 '구조적'인 양상을 띄고 있기 때문이다. 문제는 이러한 자연어는 매우 복잡한 구조를 가지고 있고, 컴퓨터가 이를 정확히 parsing하기 어렵다는 것이다. 예를들어보자면 아래와 같은 문장이 있다.

'May is fun but June bores me'

여기서 May, June은 사람을 나타내는 것일까 아니면 '달'(月)을 나타내는 것일까?


2. 질의(Query) 관점에서 Exact Values와 Full Text 비교



Exact Values는 query하기가 쉽다. '이 값이 query 조건과 맞는가 맞지 않는가?' 라고하는 이분법적인 비교를 하기 때문이다. 이러한 query는 아래의 SQL문으로 간단히 표현할 수 있다.
WHERE name    = "John Smith"
  AND user_id = 2
  AND date    > "2014-09-15"
하지만, full-text 데이터를 query하는 것은 좀더 복잡 미묘하다. 우리는 단순히, '이 document가 query조건에 맞는가?' 라는 질문을 던질 수 없다. 대신 '이 document가 query조건에 얼마나 가까운가?' 라고 질문할 수 있을 것이다.

보통 검색을 할때, '완전한 문장'을 정확히 찾으려는 시도는 별로 없을 것이다. 하지만, 검색어에 좀더 가까운, 즉 우리가 의도한 대로 검색결과가 나오길 원할 것이다.
예를들어 아래와 같은 경우다

  • 'UK' 라는 검색어를 입력했다면 'United Kingdom'과 관련된 검색결과가 나와야한다
  • 'jump'라는 검색어는 'jumped', 'jumps', 'jumping' 등과 매칭되어야 하며, 심지어는 동의어인 'leap'과도 매칭되어야 한다.
  • 'johnny walker'는 'Johnnie Walker', 그리고 'johnnie depp'은 'Johnny Dep'과 매칭되어야한다
  • 'fox new hunting'이라는 검색어는 Fox News의 사냥관련 정보들과 매칭되어야 한다. 반대로, 'fox hunting news'는 조금 이상하긴하지만 여우들의 사냥 news 관련 정보들이 매칭되어야 할 것이다.

이러한 유형의 query들이 동작하기위해 Elasticsearch는 첫번째로 색인된 text를 'Analyze'하고, 이렇게 분석한 데이터로 'Inverted Index'를 생성한다. 

다음 포스팅에서, inverted index와 이를 바탕으로한 analysis process를 살펴 보겠다.

to be continue...

댓글 없음:

댓글 쓰기