본문 바로가기

ELK스택

[Elasticsearch] Query DSL : 풀텍스트(Full Text)

이번 글에서는 2가지를 정리해 보려고 합니다.

  • 풀텍스트 쿼리 (match, match_phrase, query_string)
  • Relevency (연관성/정확도)
풀텍스트 쿼리(match, match_phrase, query_string)

먼저 공부하기위해 사용할 데이터를 넣어줍니다.

    5가지의 데이터를 넣고 본격적으로 Elasticsearch에서 사용하는 주요 쿼리를 알아보겠습니다.
  • match

아래의 쿼리는 message필드에서 "dog"가 들어있는 데이터를 조회한 쿼리입니다.

 

match검색과 같은경우는 여러개의 검색어를 넣을경우 기본으로 OR연산을 실행합니다.

그 결과 quick이 들어간 데이터도 찾아서 뿌려주게되는 결과를 얻었습니다.

 

검색조건이 OR이 아닌 AND로 변경하고 싶을경우에는 operator옵션을 사용하되, 문법형식이 살짝 달라지게 됩니다.

이 경우는 message필드에 "quick" 과 "dog"가 모두 들어있는 데이터를 가져오게 됩니다.

 

  • match_phrase

match_phrase검색은 공백을 포함해 정확히 일치하는 내용을 검색할 때 사용되는 문법입니다.

아래와 같이 OR 혹은 AND조건이 아니라 정확하게 일치하는 검색어가 있어야 조회가 됩니다.

 

match_phrase쿼리는 검색조건이 너무 까다롭기 때문에 조금만 형식에 벗어나게 되면 해당 상품과 연관이 있음에도 불구하고 검색되지 않을 수도 있습니다. 이럴 경우, slop옵션을 주게되면 "lazzy"와 "dog"사이에 1개의 단어가 포함되어도 검색이 가능하게 해줌으로써 좀 더 유연한 검색이 가능하도록 합니다.

 

  • query_string

query_string은 URL에 q옵션을 줘서 검색하는 방식이랑 같은 방식입니다.

아래와 같은 경우는 "jumping"단어와 "lazy"단어가 모두 들어가거나 혹은 "quick dog"라는 구문이 들어간 것을 조회하라는 의미입니다. \" \""의 의미는 match_phrase문법으로 사용한다는 의미로 생각하시면 됩니다.

 

Relevency (연관성/정확도)

RDBMS와 같은 경우는 쿼리에 where절에 들어가는 검색조건에 부합하는 데이터를 출력하는게 전부일 뿐, 그 데이터가 얼마나 정확한지 판단하지는 못합니다. 반면에, Elasticsearch와 같은 풀텍스트 검색엔진은 검색조건과 얼마나 정확하게 일치하는지 판단하는 알고리즘을 가지고 있기 때문에 사용자들이 원하는 데이터를 보여줄 수 있습니다.

이러한 정확도는 "_score"라는 스코어점수로 산출되어 높은순으로 나타나게 되는데, 이러한 점수를 산출하는 기준은 3가지로 나뉘어 지게 됩니다.

 

  • TF (Term Frequency)

 예를들어 "25평 아파트"라는 단어를 검색했다고 생각해보겠습니다. "25평 아파트"라는 단어가 3번 들어있는 웹페이지 보다는 10번 들어있는 웹페이지가 사용자가 원하는 웹페이지일 확률이 높을 것입니다.

즉, 웹페이지에 검색된 단어(Term)이 많을수록 스코어점수가 올라가게 됩니다.

 

  • IDF (Inverse Document Frequency)

다시 "25평 아파트"라는 단어로 검색했다고 생각해보겠습니다. 검색결과 중에 "25평"이라는 단어가 포함된 결과는 5개 "아파트"라는 단어가 포함된 결과는 20개가 있다면, 많이 검색된 "아파트"라는 단어보다는 적게 검색된 "25평"이라는 단어에 좀 더 높은 점수를 부여하게 됩니다.

즉, 흔한 단어인 "아파트"보다는 희소성을 가진 "25평"이라는 단어가 스코어점수가 오르는데 있어 도움이 됩니다.

 

  • Field Length

블로그와 같은 웹페이지가 있을경우 검색하려는 단어가 제목과 내용에 모두 있을경우, 길이가 긴 내용필드보다는 짧은 제목필드에 검색단어를 포함하고 있는 경우에 더 높은 점수가 부여됩니다.

즉, 검색단어가 제목과 같은 짧은 필드에 들어가 있어야 스코어점수가 오르는데 있어 도움이 됩니다.

 

이렇게 풀텍스트쿼리에서 사용하는 문법들과 Relevency를 판단하는 3가지 방법을 정리해보았습니다.