자동 완성 기능을 구현하기 위해 search_as_you_type을 활용하자.
DELETE /products
PUT /products
{
"settings": {
"analysis": {
// 필터 정의
"filter": {
"product_synonyms": {
"type": "synonym",
"synonyms": [
"samsung, 삼성",
"apple, 애플",
"노트북, 랩탑, 컴퓨터, computer, laptop, notebook",
"전화기, 휴대폰, 핸드폰, 스마트폰, 휴대전화, phone, smartphone, mobile phone, cell phone",
"아이폰, iphone",
"맥북, 맥, macbook, mac"
]
}
},
// 커스텀 애널라이저 정의
"analyzer": {
"products_name_analyzer": {
"char_filter": [],
"tokenizer": "nori_tokenizer",
"filter": [
"nori_part_of_speech",
"nori_readingform",
"lowercase",
"product_synonyms"
]
},
"products_description_analyzer": {
"char_filter": ["html_strip"],
"tokenizer": "nori_tokenizer",
"filter": [
"nori_part_of_speech",
"nori_readingform",
"lowercase"
]
},
"products_category_analyzer": {
"char_filter": [],
"tokenizer": "nori_tokenizer",
"filter": [
"nori_part_of_speech",
"nori_readingform",
"lowercase"
]
}
}
}
},
"mappings": {
"properties": {
"id": {
"type": "long"
},
"name": {
"type": "text", // 유연한 검색 필요
"analyzer": "products_name_analyzer",
// 멀티 필드로 search_as_you_type 타입을 추가
"fields": {
"auto_complete": {
"type": "search_as_you_type",
"analyzer": "nori"
}
}
},
"description": {
"type": "text", // 유연한 검색 필요
"analyzer": "products_description_analyzer"
},
"price": {
"type": "integer" // 10억 이하의 정수
},
"rating": {
"type": "double" // 실수(소수점을 가진 숫자 포함)
},
"category": {
"type": "text", // 유연한 검색 필요
"analyzer": "products_category_analyzer",
// 멀티 필드로 keyword 타입을 추가
"fields": {
"raw": {
"type": "keyword"
}
}
}
}
}
}
자동 완성 기능이 잘 구현됐는 지 테스트하기 위해 더미 데이터부터 넣자.
POST /products/_doc
{
"id": 1,
"name": "삼성 스마트 TV 65인치",
"description": "<p>선명한 화질과 뛰어난 스마트 기능을 갖춘 삼성 TV입니다.</p>",
"price": 4500,
"rating": 4.6,
"category": "가전제품"
}
POST /products/_doc
{
"id": 2,
"name": "삼성 스마트 냉장고",
"description": "<p>스마트 기능과 대용량 저장공간을 제공하는 삼성 냉장고입니다.</p>",
"price": 5000,
"rating": 4.7,
"category": "가전제품"
}
자동 완성 기능이 잘 작동하는 지 아래 쿼리를 실행시켜보자.
GET /products/_search
{
"query": {
"multi_match": {
"query": "삼", // 삼, 삼성, 삼성 스
"type": "bool_prefix",
"fields": [
"name.auto_complete",
"name.auto_complete._2gram",
"name.auto_complete._3gram"
]
}
}
}
GET /products/_search
{
"query": {
"multi_match": {
"query": "스", // 스, 스마, 스마트
"type": "bool_prefix",
"fields": [
"name.auto_complete",
"name.auto_complete._2gram",
"name.auto_complete._3gram"
]
}
}
}