엘라스틱서치의 주요 검색 쿼리 정리

ElasticSearch Nori 형태소 분석기 사용해보기

(참고하면 좋을 블로그)

참고😄

text vs keyword


✏️ text 타입으로 데이터를 저장하면 elastic search가 제공하는 tokenizer에 의해 넣고자하는 데이터의 값이 특정 패턴(공백, 특수문자, etc)로 문자들이 tokenize이 되어 저장된다. 만약 사용자가 “안녕하세요 제 이름은 춘식이입니다.”라는 문자열을 text타입으로 저장한다면 이 문자열이 “안녕하세요”,”제”,”이름은”,”춘식이입니다” 이런 4개의 문자열로 tokenize가 된다. (elasticsearch의 Default tokenizer은 공백 특수문자 등으로 문자열을 tokenize된다고 한다.) 우리 팀은 도서 데이터들을 검색하기 때문에 이런 기본 tokenizer로 데이터를 검색하면 만족한 결과가 잘 나오지 않기 때문에 기본 tokenizer가 아닌 Elastic serach에서 제공하는 한글 형태소 분석기인 “nori”를 사용하였다. “nori” 형태소 분석기가 무엇인지는 차후의 글로 다루겠다.

✏️ keyword 타입은 text타입과는 다르게 원래의 데이터 값 그대로 elastic search에 저장이 된다. 그러면 왜 keyword나 text로 굳이 저장 데이터의 형식을 나누는 것일까.? keyword는 아까 서술했 듯이 데이터의 값을 그대로 저장하기 때문에 명확하지 않은 검색 키워드로 정보를 검색할 때 많이 불리하다. 예를 들어 “A B C”라는 keyword로 형식으로 저장되어 있는 데이터가 있다고 할 때 “A”라는 검색 키워드로 데이터를 검색해본다 하면 그 결과는 어떻게 나올까? 결과는 “검색이 되지 않다” 이다. 왜 그러는 것일까? 말 그대로 keyword형식으로 데이터를 저장했 듯이 이 데이터의 원래의 값과 정확히 일치하지 않다면 검색 결과에 배제되기 때문이다. 이러한 이유 때문에 전체의 데이터 값으로 검색하는 것이 아니라 특정 값으로 정보를 검색할 때에는 keyword 보다 text로 인덱스를 구성하는 것이 유리하다. (데이터가 고유의 값을 가지고 있을 때. ex.일련번호 etc.. 이러한 값으로 검색을 할때 그 고유의 값을 keyword 타입으로 지정하는 게 유리하다. )

(현재 페이지는 elastic search에서 제공되는 query들을 소개하는 글이기 때문에 spring환경에서는 쿼리를 어떻게 작성하는 지에 대한 글은 다루지 않는다.)


Text type 검색 Query


1.Match

말 그대로 match, 검색하고자 하는 단어가 해당 필드의 parsing된 text들과 match되는 것이 있다면 해당 document들이 검색이 된다. 만약 인덱스 안의 document들 중 “bookName”이라는 필드 안에 “마시멜로 이야기”라는 값이 있다고 가정을 하자.(이때 elastic search에서 제공하는 tokenizer로 인해 “마시멜로 이야기”는 “마시멜로”, “이야기” 이 두개의 토큰으로 tokenize 된다.) 검색 단어로는 “이야기”를 사용한다고 하자. 그러면 “마시멜로 이야기”가 가지고 있는 “이야기”토큰과 검색어의 “이야기”가 match 되기 때문에 검색 결과로 가지게 된다.

쿼리문으로 작성하면 다음과 같다.