[elasticsearch] 검색의 연관성 좀 더 높여보기

32
Copyright All Rights Reserved © job planet 2014 v.1.0 20141230 Hosang Jeon [email protected] 검색의 연관성 좀 더 높여보기

Upload: hosang-jeon

Post on 15-Jul-2015

631 views

Category:

Software


5 download

TRANSCRIPT

Page 1: [Elasticsearch] 검색의 연관성 좀 더 높여보기

Copyright All Rights Reserved © job planet 2014

v.1.0����������� ������������������  20141230����������� ������������������  

!Hosang����������� ������������������  Jeon����������� ������������������  

[email protected]

검색의 연관성 좀 더 높여보기

Page 2: [Elasticsearch] 검색의 연관성 좀 더 높여보기

Copyright All Rights Reserved © job planet 2014

Table����������� ������������������  of����������� ������������������  Contents

1. 엘라스틱서치는����������� ������������������  스코어를����������� ������������������  어떻게����������� ������������������  계산하는가?����������� ������������������  

2. 부스팅����������� ������������������  (Boosting)����������� ������������������  이란?����������� ������������������  

3. function_score����������� ������������������  쿼리����������� ������������������  

4. 스코어����������� ������������������  결합하기

Page 3: [Elasticsearch] 검색의 연관성 좀 더 높여보기

Copyright All Rights Reserved © job planet 2014

1.����������� ������������������  엘라스틱서치는����������� ������������������  스코어를����������� ������������������  어떻게����������� ������������������  계산하는가?

Page 4: [Elasticsearch] 검색의 연관성 좀 더 높여보기

Copyright All Rights Reserved © job planet 2014

TF-IDF����������� ������������������  :����������� ������������������  스코어����������� ������������������  계산의����������� ������������������  필수����������� ������������������  요소

TF����������� ������������������  (Term����������� ������������������  Frequency)����������� ������������������  :����������� ������������������  용어����������� ������������������  빈도����������� ������������������  !• 하나의����������� ������������������  문서����������� ������������������  내에서의����������� ������������������  단어의����������� ������������������  빈도����������� ������������������  • 높을수록����������� ������������������  연관성이����������� ������������������  높음

IDF����������� ������������������  (Index����������� ������������������  Document����������� ������������������  Frequency)����������� ������������������  :����������� ������������������  역문서����������� ������������������  빈도����������� ������������������  !

• 전체����������� ������������������  문서에서����������� ������������������  해당����������� ������������������  단어의����������� ������������������  빈도����������� ������������������  • #����������� ������������������  of����������� ������������������  matched����������� ������������������  documents����������� ������������������  • 낮을수록����������� ������������������  연관성이����������� ������������������  높음

Page 5: [Elasticsearch] 검색의 연관성 좀 더 높여보기

Copyright All Rights Reserved © job planet 2014

Term����������� ������������������  Frequency����������� ������������������  (TF)

“직장인,����������� ������������������  회사원,����������� ������������������  봉급생활자는����������� ������������������  급여를����������� ������������������  받고����������� ������������������  일하는����������� ������������������  사람을����������� ������������������  총칭하는����������� ������������������  말이다.”

“이곳은����������� ������������������  뽐뿌����������� ������������������  직장인����������� ������������������  포럼입니다.����������� ������������������  직장이야기,����������� ������������������  직장인����������� ������������������  고민,����������� ������������������  직장인����������� ������������������  연봉,����������� ������������������  직장인����������� ������������������  일상����������� ������������������  등����������� ������������������  직장인들을����������� ������������������  위한����������� ������������������  이야기����������� ������������������  공간입니다.”

직장인

TF����������� ������������������  :����������� ������������������  1

TF����������� ������������������  :����������� ������������������  4

Page 6: [Elasticsearch] 검색의 연관성 좀 더 높여보기

Copyright All Rights Reserved © job planet 2014

Inverse����������� ������������������  Document����������� ������������������  Frequency����������� ������������������  (IDF)

“직장인이����������� ������������������  10명����������� ������������������  중����������� ������������������  6명이����������� ������������������  명절����������� ������������������  전후����������� ������������������  이직을����������� ������������������  고려한다고����������� ������������������  한다.����������� ������������������  이유야����������� ������������������  어쨌든����������� ������������������  선물세트를����������� ������������������  2개나����������� ������������������  주어서����������� ������������������  양손은����������� ������������������  무겁지만…⋯"

“일단����������� ������������������  토론을����������� ������������������  잘하려����������� ������������������  리����������� ������������������  인지하는����������� ������������������  것이����������� ������������������  엇이고����������� ������������������  충분한����������� ������������������  면����������� ������������������  주제를����������� ������������������  정확히����������� ������������������  이해해야����������� ������������������  한다.����������� ������������������  찬성과����������� ������������������  반대����������� ������������������  입장����������� ������������������  모두의����������� ������������������  장단점을����������� ������������������  수렴할����������� ������������������  수����������� ������������������  있어야����������� ������������������  함은����������� ������������������  물론이다.”

“자연을����������� ������������������  가까이����������� ������������������  한다.����������� ������������������  후지산,����������� ������������������  카와구치코,����������� ������������������  사이코,����������� ������������������  쇼우지코,����������� ������������������  모토소코,����������� ������������������  아오키가하라쥬카이의����������� ������������������  대자연에����������� ������������������  둘러싸였습니다.����������� ������������������  한번은����������� ������������������  올라가봐야����������� ������������������  한다.”

한다DF : 1직장인 DF : 3 IDF = 1/DF

Page 7: [Elasticsearch] 검색의 연관성 좀 더 높여보기

Copyright All Rights Reserved © job planet 2014

Inverse����������� ������������������  Document����������� ������������������  Frequency����������� ������������������  (IDF)

DF����������� ������������������  는����������� ������������������  용어가����������� ������������������  등장하는����������� ������������������  문서의����������� ������������������  개수만을����������� ������������������  고려할����������� ������������������  뿐,����������� ������������������  하나의����������� ������������������  문서에서����������� ������������������  해당����������� ������������������  용어가����������� ������������������  얼마나����������� ������������������  자주����������� ������������������  등장하는지는����������� ������������������  고려하지����������� ������������������  않는다.

한다DF : 1직장인 DF : 3 IDF = 1/DF

Page 8: [Elasticsearch] 검색의 연관성 좀 더 높여보기

Copyright All Rights Reserved © job planet 2014

Lucene����������� ������������������  scoring����������� ������������������  formula

Score(q, d) =

q

t

TF(t,d) * IDF(t,d)2 * Norm(d, field) * Boost(t)

• q : query • d : document • t : term

Page 9: [Elasticsearch] 검색의 연관성 좀 더 높여보기

Copyright All Rights Reserved © job planet 2014

Lucene����������� ������������������  scoring����������� ������������������  formula

Score(q, d) =

q

t

TF(t,d) * IDF(t,d)2 * Norm(d, field) * Boost(t)

쿼리 q 에대한 문서 d 의 스코어는 쿼리상의 모든 용어 t 에 대하여 (TF의 제곱근 X IDF의 제곱 X 각 필드의 normalization factor X 용어 t의 부스팅) ! 값의 합이다.

사람이 이해할 수 있는 말로 표현하자면…

그냥 대략 이렇다는 정도만…

Page 10: [Elasticsearch] 검색의 연관성 좀 더 높여보기

Copyright All Rights Reserved © job planet 2014

2.����������� ������������������  부스팅����������� ������������������  (Boosting)����������� ������������������  이란?

Page 11: [Elasticsearch] 검색의 연관성 좀 더 높여보기

Copyright All Rights Reserved © job planet 2014

부스팅이란?

XX증권에����������� ������������������  대한����������� ������������������  뉴스를����������� ������������������  검색하고����������� ������������������  싶다면?

뉴스����������� ������������������  title에����������� ������������������  ‘XX증권’이라는����������� ������������������  단어가����������� ������������������  등장하는����������� ������������������  경우

뉴스����������� ������������������  description에����������� ������������������  ‘XX증권’이라는����������� ������������������  단어가����������� ������������������  등장하는����������� ������������������  경우

title����������� ������������������  에����������� ������������������  검색어가����������� ������������������  등장하는����������� ������������������  경우가����������� ������������������  XX증권에����������� ������������������  관련된����������� ������������������  뉴스일����������� ������������������  가능성이����������� ������������������  좀����������� ������������������  더����������� ������������������  높기����������� ������������������  때문에����������� ������������������  title����������� ������������������  필드를����������� ������������������  부스팅한다.

Page 12: [Elasticsearch] 검색의 연관성 좀 더 높여보기

Copyright All Rights Reserved © job planet 2014

부스팅����������� ������������������  값은����������� ������������������  어떻게����������� ������������������  사용되는가?

• 스코어����������� ������������������  계산식에서����������� ������������������  부스팅����������� ������������������  값은����������� ������������������  정규화(Normalization)����������� ������������������  되기����������� ������������������  때문에����������� ������������������  숫자����������� ������������������  그대로����������� ������������������  곱셈되지는����������� ������������������  않는다.����������� ������������������  

!• 하지만����������� ������������������  대략적으로����������� ������������������  특정����������� ������������������  필드의����������� ������������������  부스팅����������� ������������������  값은����������� ������������������  3이라고����������� ������������������  지정한다면����������� ������������������  그����������� ������������������  필

드가����������� ������������������  다른����������� ������������������  필드들에����������� ������������������  비하여����������� ������������������  대략����������� ������������������  세배정도����������� ������������������  중요하다고����������� ������������������  이해해도����������� ������������������  좋다.

Score(q, d) =

q

t

TF(t,d) * IDF(t,d)2 * Norm(d, field) * Boost(t)

Page 13: [Elasticsearch] 검색의 연관성 좀 더 높여보기

Copyright All Rights Reserved © job planet 2014

부스팅의����������� ������������������  두����������� ������������������  가지����������� ������������������  방법

1. 인덱싱����������� ������������������  시점에서의����������� ������������������  부스팅����������� ������������������  !2. 쿼리����������� ������������������  시점에서의����������� ������������������  부스팅

인덱싱����������� ������������������  시점에����������� ������������������  정의된����������� ������������������  부스팅은����������� ������������������  수정하기����������� ������������������  위해서����������� ������������������  문서를����������� ������������������  다시����������� ������������������  인덱싱해야하기����������� ������������������  때문에����������� ������������������  가급적����������� ������������������  쿼리����������� ������������������  시점에서����������� ������������������  부스팅을����������� ������������������  사용하기를����������� ������������������  권장한다.

Page 14: [Elasticsearch] 검색의 연관성 좀 더 높여보기

Copyright All Rights Reserved © job planet 2014

쿼리시점에서의����������� ������������������  부스팅

1. 필드별����������� ������������������  부스팅����������� ������������������  !2. 용어별����������� ������������������  부스팅

Page 15: [Elasticsearch] 검색의 연관성 좀 더 높여보기

Copyright All Rights Reserved © job planet 2014

필드별����������� ������������������  부스팅

curl -XPOST ‘localhost:9200/my-index/_search?pretty’ -d ‘{ “query”: { “multi_match”: { “query”: “직장인”, “fields”: [“title^3”, “description”] } }}’

title����������� ������������������  필드가����������� ������������������  3만큼����������� ������������������  부스팅����������� ������������������  되었다.

Page 16: [Elasticsearch] 검색의 연관성 좀 더 높여보기

Copyright All Rights Reserved © job planet 2014

용어별����������� ������������������  부스팅

curl -XPOST ‘localhost:9200/my-index/_search?pretty’ -d ‘{ “query”: { “query_string”: { “query”: “직장인^3 AND 연봉” } }}’

“직장인”����������� ������������������  검색어가����������� ������������������  “연봉”����������� ������������������  검색어보다����������� ������������������  3만큼����������� ������������������  부스팅����������� ������������������  되었다.

Page 17: [Elasticsearch] 검색의 연관성 좀 더 높여보기

Copyright All Rights Reserved © job planet 2014

3.����������� ������������������  function_score����������� ������������������  쿼리

Page 18: [Elasticsearch] 검색의 연관성 좀 더 높여보기

Copyright All Rights Reserved © job planet 2014

function_score����������� ������������������  쿼리

• 용어나����������� ������������������  필드를����������� ������������������  부스팅하여����������� ������������������  스코어를����������� ������������������  조정하는����������� ������������������  것은����������� ������������������  한계를����������� ������������������  가지고����������� ������������������  있다.����������� ������������������  ����������� ������������������  !• 좀더����������� ������������������  유연하게����������� ������������������  스코어링을����������� ������������������  조절할����������� ������������������  수����������� ������������������  있는����������� ������������������  방식이����������� ������������������  바로����������� ������������������  function_score를����������� ������������������  이용한����������� ������������������  쿼리이다.

Page 19: [Elasticsearch] 검색의 연관성 좀 더 높여보기

Copyright All Rights Reserved © job planet 2014

function_score����������� ������������������  쿼리의����������� ������������������  구조

curl -XPOST ‘localhost:9200/my-index/_search?pretty’ -d ‘{ “query”: { “function_score”: { “query”: { “match”: { “description”: “직장인” } }, “functions”: [] } }}’

아무런����������� ������������������  스코어링도����������� ������������������  하지����������� ������������������  않는����������� ������������������  function_score����������� ������������������  쿼리����������� ������������������  예시

“functions”����������� ������������������  에����������� ������������������  정의될����������� ������������������  함수들은����������� ������������������  쿼리의����������� ������������������  결과에����������� ������������������  대해서만����������� ������������������  적용된다.

Page 20: [Elasticsearch] 검색의 연관성 좀 더 높여보기

Copyright All Rights Reserved © job planet 2014

function_score����������� ������������������  쿼리에서����������� ������������������  사용하는����������� ������������������  함수의����������� ������������������  유형

1. boost_factor����������� ������������������  !2. field_value_factor����������� ������������������  !3. script_score����������� ������������������  !4. random_score����������� ������������������  !5. decay����������� ������������������  functions

Page 21: [Elasticsearch] 검색의 연관성 좀 더 높여보기

Copyright All Rights Reserved © job planet 2014

boost_factor����������� ������������������  함수

• 가장����������� ������������������  간단한����������� ������������������  함수로서,����������� ������������������  단순히����������� ������������������  상수를����������� ������������������  곱한다.����������� ������������������  • 필터를����������� ������������������  이용하여����������� ������������������  부스팅할����������� ������������������  문서를����������� ������������������  결정한다.

curl -XPOST ‘localhost:9200/my-index/_search?pretty’ -d ‘{ “query”: { “function_score”: { “query”: { “match”: { “description”: “직장인” } }, “functions”: [ { “boost_factor”: 1.5, “filter”: {“term”: {“description”: “연봉”}} } ] }

“직장인”����������� ������������������  검색결과에서����������� ������������������  description에����������� ������������������  “연봉”����������� ������������������  이라는����������� ������������������  용어를����������� ������������������  포함하고����������� ������������������  있는����������� ������������������  문서의����������� ������������������  스코어를����������� ������������������  1.5배����������� ������������������  한다.

Page 22: [Elasticsearch] 검색의 연관성 좀 더 높여보기

Copyright All Rights Reserved © job planet 2014

field_value_factor����������� ������������������  함수

• 숫자형����������� ������������������  필드의����������� ������������������  값을����������� ������������������  스코어에����������� ������������������  이용����������� ������������������  •좋아요����������� ������������������  버튼을����������� ������������������  누른����������� ������������������  카운트����������� ������������������  등을����������� ������������������  검색결과에����������� ������������������  이용할����������� ������������������  때����������� ������������������  사용

curl -XPOST ‘localhost:9200/my-index/_search?pretty’ -d ‘{ “query”: { “function_score”: { “query”: { “match”: { “description”: “직장인” } }, “functions”: [ { “field_value_factor”: { “field”: “review_count”, “factor”: 2.5, “modifier”: “log” } ] } }}’

_score����������� ������������������  =����������� ������������������  log(2.5����������� ������������������  X����������� ������������������  doc[‘review_count’].value)

Page 23: [Elasticsearch] 검색의 연관성 좀 더 높여보기

Copyright All Rights Reserved © job planet 2014

script_score����������� ������������������  함수����������� ������������������  

• 가장����������� ������������������  자유도가����������� ������������������  높은����������� ������������������  스코어링����������� ������������������  방식

curl -XPOST ‘localhost:9200/my-index/_search?pretty’ -d ‘{ “query”: { “function_score”: { “query”: { “match”: { “description”: “직장인” } }, “functions”: [ { “script_score”: { “script”: “Math.log(doc[\”salaries\”].values.size() * myweight”, “params”: { “myweight”: 2 } } } ] } }}’

Page 24: [Elasticsearch] 검색의 연관성 좀 더 높여보기

Copyright All Rights Reserved © job planet 2014

random_score����������� ������������������  함수

• 문서를����������� ������������������  랜덤하게����������� ������������������  정렬하고����������� ������������������  싶을����������� ������������������  때����������� ������������������  사용����������� ������������������  • seed����������� ������������������  값을����������� ������������������  동일하게����������� ������������������  주면����������� ������������������  동일한����������� ������������������  결과가����������� ������������������  나타남

curl -XPOST ‘localhost:9200/my-index/_search?pretty’ -d ‘{ “query”: { “function_score”: { “query”: { “match”: { “description”: “직장인” } }, “functions”: [ { “random_score”: { “seed”: 1234 } } ] } }}’

Page 25: [Elasticsearch] 검색의 연관성 좀 더 높여보기

Copyright All Rights Reserved © job planet 2014

decay����������� ������������������  함수들

• 특정����������� ������������������  필드의����������� ������������������  값을����������� ������������������  이용하여����������� ������������������  스코어를����������� ������������������  점진적으로����������� ������������������  줄여나가는����������� ������������������  함수����������� ������������������  !

• Ex)����������� ������������������  시간이����������� ������������������  오래된����������� ������������������  정보일����������� ������������������  수록����������� ������������������  스코어를����������� ������������������  줄여나가기����������� ������������������  !

• Ex)����������� ������������������  거리상����������� ������������������  먼����������� ������������������  위치일����������� ������������������  수록����������� ������������������  스코어를����������� ������������������  줄여나가기

Page 26: [Elasticsearch] 검색의 연관성 좀 더 높여보기

Copyright All Rights Reserved © job planet 2014

decay����������� ������������������  함수들

1. linear����������� ������������������  2. gauss����������� ������������������  3. exp

세����������� ������������������  가지����������� ������������������  종류의����������� ������������������  decay����������� ������������������  함수들

스코어가����������� ������������������  줄어드는����������� ������������������  곡선의����������� ������������������  형태를����������� ������������������  결정

Page 27: [Elasticsearch] 검색의 연관성 좀 더 높여보기

Copyright All Rights Reserved © job planet 2014

decay����������� ������������������  함수들

모든����������� ������������������  decay����������� ������������������  함수들은����������� ������������������  아래와����������� ������������������  같은����������� ������������������  형식을����������� ������������������  따름

{ “TYPE”: { “FIELD_NAME”: { “origin”: “…”, “offset”: “…”, “scale”: “…”, “decay”: “…” } }}

Page 28: [Elasticsearch] 검색의 연관성 좀 더 높여보기

Copyright All Rights Reserved © job planet 2014

decay����������� ������������������  함수들

origin����������� ������������������  :����������� ������������������  함수����������� ������������������  곡선의����������� ������������������  중심.����������� ������������������  즉,����������� ������������������  가장����������� ������������������  스코어가����������� ������������������  높은����������� ������������������  지점.����������� ������������������  ����������� ������������������  예를����������� ������������������  들어,����������� ������������������  geo-location����������� ������������������  을����������� ������������������  이용하는����������� ������������������  경우����������� ������������������  사용자의����������� ������������������  현재����������� ������������������  위치가����������� ������������������  origin����������� ������������������  이����������� ������������������  됨

offset����������� ������������������  :����������� ������������������  origin으로부터����������� ������������������  스코어가����������� ������������������  줄어들지����������� ������������������  않는����������� ������������������  구간의����������� ������������������  거리.����������� ������������������  ����������� ������������������  예를����������� ������������������  들어,����������� ������������������  offset이����������� ������������������  1km����������� ������������������  이면����������� ������������������  origin으로부터����������� ������������������  1km����������� ������������������  이내의����������� ������������������  거리에서는����������� ������������������  스코어가����������� ������������������  줄어들지����������� ������������������  않는다.

scale����������� ������������������  &����������� ������������������  decay����������� ������������������  :����������� ������������������  이����������� ������������������  두����������� ������������������  값의����������� ������������������  조합으로����������� ������������������  스코어값이����������� ������������������  줄어드는����������� ������������������  기준이����������� ������������������  정해진다.����������� ������������������  예를����������� ������������������  들어,����������� ������������������  scale����������� ������������������  값이����������� ������������������  3km����������� ������������������  이고����������� ������������������  decay����������� ������������������  값이����������� ������������������  0.3이면����������� ������������������  origin에서부터����������� ������������������  3km����������� ������������������  멀어질����������� ������������������  수록����������� ������������������  스코어가����������� ������������������  0.3배로����������� ������������������  줄어든다.

Page 29: [Elasticsearch] 검색의 연관성 좀 더 높여보기

Copyright All Rights Reserved © job planet 2014

decay����������� ������������������  함수들

gaussian����������� ������������������  decay����������� ������������������  함수����������� ������������������  예제

curl -XPOST ‘localhost:9200/my-index/_search?pretty’ -d ‘{ “query”: { “function_score”: { “query”: { “match”: { “description”: “직장인” } }, “functions”: [ { “gauss”: { “geolocation”:{ “origin”: “23.232112,-42.324211”, “offset”: “100m”, “scale”: “2km”, “decay”: 0.5 } } } ] }

Page 30: [Elasticsearch] 검색의 연관성 좀 더 높여보기

Copyright All Rights Reserved © job planet 2014

4.����������� ������������������  스코어����������� ������������������  결합하기

Page 31: [Elasticsearch] 검색의 연관성 좀 더 높여보기

Copyright All Rights Reserved © job planet 2014

스코어����������� ������������������  결합하기

SCORE_MODE

• “functions”����������� ������������������  배열����������� ������������������  안의����������� ������������������  여러����������� ������������������  함수의����������� ������������������  스코어들을����������� ������������������  결합하는����������� ������������������  방법����������� ������������������  ����������� ������������������  • multiply(default),����������� ������������������  first,����������� ������������������  sum,����������� ������������������  avg,����������� ������������������  max,����������� ������������������  min

• 함수의����������� ������������������  스코어를����������� ������������������  쿼리����������� ������������������  결과의����������� ������������������  스코어와����������� ������������������  결합하는����������� ������������������  방법����������� ������������������  • multiply(default),����������� ������������������  replace,����������� ������������������  sum,����������� ������������������  avg,����������� ������������������  max,����������� ������������������  min

BOOST_MODE

Page 32: [Elasticsearch] 검색의 연관성 좀 더 높여보기

Copyright All Rights Reserved © job planet 2014

감사합니다.