
search_as_you_type이라는 걸 활용해서 구현하는 방법을 배워보자. search_as_you_type이란? text 타입처럼 애널라이저(Analyzer)를 거쳐 토큰으로 분리된다. _2gram, _3gram이라는 멀티 필드(Multi Field)도 같이 만든다._2gram, _3gram은 어떻게 구성되어 있을까? search_as_you_type의 _2gram은 두 단어씩 묶어서 토큰을 만든다._3gram은 세 단어씩 묶어서 토큰을 만든다. 무슨 말인지 Analyze API를 활용해 직접 눈으로 확인해보자. DELETE /products PUT /products { "mappings": { "properties": { "name": { "type": "search_as_you_type", "analyzer": "nori" } } } }
GET /products/_analyze { "field": "name", "text": "You have the big banana" } GET /products/_analyze { "field": "name._2gram", "text": "you have the big banana" } GET /products/_analyze { "field": "name._3gram", "text": "you have the big banana" }
GET /products/_analyze { "field": "name", "text": "프리미엄 감귤 선물세트" } GET /products/_analyze { "field": "name._2gram", "text": "프리미엄 감귤 선물세트" } GET /products/_analyze { "field": "name._3gram", "text": "프리미엄 감귤 선물세트" }

DELETE /products PUT /products { "mappings": { "properties": { "name": { "type": "search_as_you_type", "analyzer": "nori" } } } }
POST /products/_doc { "name": "곱창 돌김생김" } POST /products/_doc { "name": "구운 돌김" } POST /products/_doc { "name": "완도 곱창 돌김 100매" } POST /products/_doc { "name": "삼성 노트북" } POST /products/_doc { "name": "Nike 신발" }
GET /products/_search { "query": { "multi_match": { "query": "돌김", "type": "bool_prefix", "fields": [ "name", "name._2gram", "name._3gram" ] } } }
multi_match : 여러 필드에 걸쳐서 데이터 검색bool_prefix : 앞쪽 단어는 match, 마지막 단어는 prefix matchyou have th라고 검색하면 앞쪽 단어인 you와 have는 역인덱스에 저장된 토큰과 일치하는 데이터를 찾고, 마지막 단어인 th는 역인덱스에 저장된 토큰 중에 th로 시작하는 데이터를 찾는다. name._2gram, name._3gram 필드에서도 검색을 하는 이유는 연속적으로 단어가 일치할수록 score를 더 높게 측정해 상위 노출되도록 만들기 위함이다. // 1글자로 검색해도 검색 잘 됨 GET /products/_search { "query": { "multi_match": { "query": "돌", "type": "bool_prefix", "fields": [ "name", "name._2gram", "name._3gram" ] } } } // 순서 바뀌어도 검색 잘 됨 GET /products/_search { "query": { "multi_match": { "query": "돌김 구운", "type": "bool_prefix", "fields": [ "name", "name._2gram", "name._3gram" ] } } } // 순서까지 일치하면 score가 더 높게 측정됨 GET /products/_search { "query": { "multi_match": { "query": "구운 돌김", "type": "bool_prefix", "fields": [ "name", "name._2gram", "name._3gram" ] } } }
