[컴] Elastic Search 의 분석(Analyze)과 query




Exploring Elasticsearch 를 번역한 내용이다. 자세하고 정확한 내용은 원본을 참고하자.


분석

자연어를 처리하는 elasticsearch 의 능력에서 분석은 중요한 부분이다.

효과적인 검색을 위해 단어들을 자를 수 있게 해주는 도구들을 모아놓은 커다란 tool box 를 가지고 있다. 이 도구들을 이용해서 검색범위를 줄이고 언어적으로 비슷한 용어를 사이에 공통점을 찾아낼 수 있다.

효과적인 찾기(look up) 을 위해 tree 비슷한 구조를 traverse 할 수 있다는 조건이 만족돼야 하는데 이 부분과 연관된 것이 elasticsearch index 이다.

snowball analyzer 를 이용해서 영어를 분석하는 것을 살펴보자.

Rellerblading 단어가 Snowball Analyzer 를 거치면 잘라서 stem 으로 만드는데 rollerblad 를 만들게 된다. Rollerblader/ Rollerbladed 도 Snowball Analyzer 를 거치면 똑같이 rollerblad 를 만들게 된다.

snowball analyzer 같은 녀석을 stemming analyzer 라고 하는데, 이 stemming analyzer 를 거치면 word 가 word 의 root 로 바뀐다.

이런 짧은 token 들로 word 를 줄이는 것이 text 를 정규분포화 하고, 빠르고 효과적인 검색(look up) 을 가능하게 해준다.

당신이 rollerblading 을 어떤 모습의 글자로 찾더라도 내부적으로는 단순히 rollerblad 를 찾게 된다.

document 가 analyze 되는 절차

  1. document update 나 create 은 PUT 또는 POST 를 통해 받게 된다.
  2. document 의 field 값들이 각각 analyzer 를 통과하면 analyzer 가 각각의 값을 0, 1, 또는 그 이상의 indexable token 으로 변환한다.
  3. tokenized 값들은 index 에 저장되게 되고, document 의 full version 을 가리키도록 해 놓게 된다.

이런 방법으로 효과적인 index 가 만들어진다.(efficient inverted index)

tree 에 저장된 값을 travering 하는 것은 prefix들과 정확히 맞는 값(exact match) 에게만 효과적이다. 그로므로 elastic search 에서 exact match 와 prefix 를 찾는 작업이 빠르다.

Analyze API

실제로 analysis가 동작하는 모습을 Analyze API 를 통해 확인해 볼 수 있다.

이 녀석(Analyze API)을 통해 나중에 자신의 query 가 원하는 대로 동작하지 않을 때 확인하는 등의 작업을 해 볼 수 있다.

Custom Analyzer 

자신의 원하는대로 Analyzer 를 만들수도 있다. 자세한 것은 아래를 참고하도록 하자.


Ranking Based on Similarity

search 를 2부분으로 나눠진다.

첫번째는 주어진 범위에 맞는 모든 documents 를 matching 하는 것
Information Retrieval 분야에서는 이것을 boolean search 라 부른다. 왜냐하면 result set 에 포함되느냐 배제되느냐로 정의되기 때문이다.

두번째는 document 에 비슷한 정도에 근거해서 점수(score) 를 매기고 점수가 높은 녀석부터 낮은 녀석순으로 정렬한 결과를 돌려주는 것이다.

ElasticSearch 에서 query 를 수행하면 result set 을 제한하고, 각 document 의 점수를 매기고, 그 score 로 descending order 로 정렬하는 것이다.

document 에 점수를 주는 알고리즘(algorithm)은 여러가지가 있고, 설정도 가능하다.

여기서 TFIDF similarity 알고리즘에 대한 간략한 설명을 확인할 수 있다.


facet

facet 은 검색어의 결과의 category 에 대한 정보등의 결과를 얻을 수 있다. 네이버 지식쇼핑등에서 신발을 치면, A라는 브랜드의 결과 몇개, B라는 브랜드 결과 몇개 이런식으로 표시되는 것과 같은 모습을 이야기 하는 듯 하다.


filtering

fiter 는 결과에서 어떤 document 가 보여질지를 표현한다. 그래서 이녀석은 query 의 수행 속도를 올려주는 효과가 있다.
이녀석을 이용해서 필요없는 field 들이 scoring 등의 비싼 작업을 수행하는 것을 방지할 수 있다.
그리고, query 와 다르게 filter 는 cache 된다. 그래서 자주 수행하게 되면 속도적으로 이득을 얻을 수 있다.

filter 는 3가지 방법으로 사용할 수 있다.
  1. filter element 를 사용하는 법
  2. query.filtered / query.constant_score 를 사용하는 법
  3. facet_filter 를 사용하는 법

filter 에 대한 설명은 아래를 참고하자.


term 과 match 의 차이

elasticsearch match vs term query - Stack Overflow
term 과 match 의 차이는 검색어(keyword) 가 위에서 설명한 Analyzer 를 거치고 난 후의 단어를 가지고 검색을 하느냐 그냥 검색어(keyword) 를 가지고 검색하느냐의 차이이다.

  • term : 검색어로 검색
  • match : 검색어 --> Analyzer --> analyzed 검색어 로 검색


aggregation 에서 terms


aggregation 에서 terms 를 이용해서 grouping 을 하면 analyzed 된 token 을 가지고 하기 때문에 원하는 대로 aggregation 이 되지 않는다. 이것을 극복하기 위해 not_analyzed 된 field 를 추가하라고 한다.


기존 RDBMS 와 elasticsearch query 와 차이점

elasticsearch 를 사용하면서 햇갈린 내용중 하나가 keyword 가 어떻게 적용되는지이다. 일반적인 db에서 query는 field 에 들어있는 값을 full 로 사용한다.

하지만 elasticsearch는 기본적으로 analyzed 된 값들(이녀석들을 token 이라하자.) 을 비교 대상으로 삼는다.

그렇기 때문에 query을 만들 때
"keyword와 같은 값을 가진 문서를 가져와"
보다는
"keyword 와 같은 token 이 있는 문서를 가져와"
와 비슷하다.

그렇기 때문에 일반적으로 사용하는 방법처럼 string 에 대한 query를 할려고 한다면, analyzed 되지 않은 필드인 raw 필드를 이용해야 한다.

그렇지 않고 token 에 대한 keyword 를 날리고자 한다면 내가 원하는 keyword 를  analyze 해본 후 어떤 값을 날려야 할지 결정하던지, analyze 를 하고 나온갑들 전부를 book.must 로 묶어서 query 를 하면 된다.






댓글 없음:

댓글 쓰기