Suggest API
SuggestAPI에서 사용되는 Suggester는 색인이 된 대상을 FST(유한상태 변화기)라는 데이터 구조를 만들어 In-Memory에 올려 일반 검색 API보다 훨씬 응답이 빠르다. 이때, 인메모리에 올라가니 변경이 적은 것이 좋다. FST Type을 사용하고 싶으면 mapping에서 completion type으로 지정하면 된다.
단, suggester api는 중간 키워드로는 검색이 안되기 때문에 검색을 원하는 대상을 배열로 지정하는 것이 필요하다.
ex) ["서울시 강남구 청담동", "강남구", "강남구 청담동", "청담동"]
Suggest API의 종류
Suggest API 종류는 많지만, 제일 일반적이고 많이 쓰이는 2개만 소개합니다.
1. Term Suggest API
사용자들이 쇼핑몰에서 자주 오타가 포함된 검색어를 입력한다고 가정해보자. 이때, Term Suggest API를 이용하여 가장 가까운 단어를 추천하도록 오타 보정이 가능하다.
POST /products/_search
{
"suggest": {
"term-suggest": {
"text": "sneekers", // 사용자가 잘못 입력한 단어
"term": {
"field": "product_name", // 검색할 필드
"suggest_mode": "always"
}
}
}
}
2. Completion Suggest API
아마 Suggest API를 쓰는 가장 큰 이유일 것이다. 검색어 자동완성 기능을 제공해준다. 검색어별 가중치도 설정 가능하고 size로 추천어의 최대 개수도 제한 가능하다. 전 글에서 언급한 것 처럼 fuzziness 옵션을 주어서 오타에 대해서 고려하여 자동 검색어 완성도 가능하다.
자동완성 기능을 구현할 때, Completion Suggester를 이용하는 방법 말고도 이전에 언급한 N-gram Tokenizer 또는 Edge N-gram Tokenizer로 형태소 분석을 거친 뒤, Prefix Search Query로 날려서 구현도 가능은 하다. 하지만 해당 방법은 메모리에 올려두는 FST 구조와 다르게 하드 디스크에서 조회를 진행하다 보니깐 상대적으로 느리다. 빠른 반응 속도를 요구하는 자동 검색어 완성 특성상 이는 치명적이기 때문에 Completion Suggester가 더 유리하다.
또한, search-as-you-type 필드를 이용하는 방법도 있다. 이렇게 하면 저렇게 하나하나 넣어줄 필요 없이 자동으로 중간 검색도 가능하게 해준다. (prefix가 아닌 infix 방식) 그런데 해당 방법은 결국 Edge-Ngram을 이용하여 작동하고, 이는 FST 기반이 아닌 HardDisk 기반이기 때문에 상대적으로 빠른 검색을 추구해야 되는 경우 성능이 떨어질 수 있는 것 같다(?) 공식 문서를 읽어봤을 때의 내 의견이고.... 100% 정확한 것은 아님을 유의하자!
POST test-completion-suggester/_search
{
"_source": ["my_field"],
"suggest": {
"address-suggest": {
"text": "정",
"completion": {
"field": "my_field",
"size": 5
}
}
}
}
위 코드처럼 Completion suggester를 날릴 수 있다.
POST test-fuzzy/_search
{
"suggest": {
"song-suggest": {
"text": "누진스",
"completion": {
"field": "suggest",
"fuzzy": {
"fuzziness": 1
}
}
}
}
}
이 처럼 Fuzzy Query와 조합하여 오타를 고려한 자동 완성도 가능하다.
만약에 한글 데이터로 구축하고 싶다고 가정을 해보자. 이전에도 말한 것 처럼 한글 자동 완성은 좀 더 심오한데... 예를 들어 내가 "국"이라는 단어를 입력했다고 해보자. 그러면 "구글" 또는 "국밥" 이런식으로 검색될 수 있다. ㄱ이 종성이 될 수도 있고 초성이 될 수도 있기 때문이다. 따라서, 한글 형태소 분석이 따로 필요하다.
PUT /autocomplete
{
"settings": {
"analysis": {
"analyzer": {
"nori_analyzer": {
"type": "custom",
"tokenizer": "nori_tokenizer",
"filter": ["lowercase"]
}
}
}
},
"mappings": {
"properties": {
"suggest": {
"type": "completion",
"search_analyzer": "nori_analyzer"
}
}
}
}
그러면 인덱스 설정을 위처럼 해줘야 한다. nori 형태소 분석기를 사용하여 한글 형태소 분석기를 적용해주고, 이는 search_analyzer를 이용하여 사용자가 검색시, 해당 analyzer가 적용될 수 있도록 하는 것이다. 이렇게 하면 사용자가 국을 입력하면 suggest 필드의 국밥, 구글 이렇게 검색해서 알려줄 수 있다.
실제 Spring에서 구현하는 과정은 따로 글을 작성한게 있으니 참고 바란다.
이외에는 추천 문장 제안에 쓰이는 Pharse Suggest API와 추천 문맥 제안에 쓰이는 Context Suggest API 등이 있다.
'BackEnd > DB' 카테고리의 다른 글
[DB] ElasticSearch의 Search API (1) | 2024.11.19 |
---|---|
[DB] 백엔드 개발자를 위한 효율적인 데이터베이스 선택 가이드 (1) | 2024.11.17 |
[DB] CSV 파일 데이터 DB에 업로드 (8) | 2024.11.13 |
[DB] ElasticSearch Index 설정과 텍스트 분석 (0) | 2024.11.08 |
[DB] Elastic Search의 기초 (9) | 2024.11.07 |