SuggestAPI 소개

사용자가 키워드를 잘못 입력했거나 검색한 결과가 없을 경우

도큐먼트 내에 존재하는 단어를 대상으로 비슷한 키워드를 변경해서 제시하는 교정기능을 제공

  • Term Suggest API : 추천단어 제안
    잘못된 철자에 대해 해당 인덱스의 특정 필드에서 가장 유사한 단어를 추천해주는 오타교정 방법
  • Completion Suggest API : 자동완성 제안
    사용자가 입력을 완료하기 전에 자동완성을 사용해 검색어를 예측해서 보여주며, 사용자가 검색하는데 도움을 줌
  • Phrase Suggest API : 추천 문장 제안
  • Context Suggest API : 추천 문맥 제안

Term Suggest API

편집 거리를 사용해 비슷한 단어를 제안

편집거리 척도란 어떤 문자열이 다른 문자열과 얼마나 비슷한가를 편집거리를 사용해 알아볼 수 있으며, 두 문자열 사이의 편집 거리는 하나의 문자열을 다른 문자열로 바꾸는데필요한 편집 횟수를 말한다.

측정 과정에서 한 문자열을 다른 문자열로 바꿀때, 삽입, 삭제, 치환하는 연산을 포함해서 척도 측정

POST movie_term_suggest/_search
{
  "suggest":{
    "spell-suggestion": {
      "text": "lave",
      "term": {
        "field": "movieNm"
      }
    }
  }
}

Movie_term_suggest 인덱스 안에 lave가 존재 하지 않으므로 유사한 단어를 추출해서 제공 되는데, 여기서 love라는 단어와 lover이라는 단어가있을 경우에 문자치환 및 추가에 대한 척도가 적은 love가 우선순위의 점수로 매겨짐

한글은 ICU 분석기를이용하여 오타를 교정하는 것이 가능하다.

ICU 분석기 : 국제화 처리를 위해 특별히 개발된분석기

필터는 한국어 자소를 분해하는 기능과 자소를 합치는 기능을 모두 갖추고 있다.

Completion Suggest API

효율적인 검색을 위해 자동완성 기능을 제공

자동완성은 글자가 입력될 때마다 결과를 보여줘야 하기 때문에 응답 속도가 중요

엘라스틱 서치에서는 내부적으로 FST( Finite State Transducer) 를 사용

FST : 검색어가 모두 메모리에 로드되어 서비스되는 구조

색인중에 FST를 작성하여 성능 최적화를 한다.

자동완성을 위해서는 데이터 타입을 completion으로 설정 해서 인덱스를 생성해야한다.

completion 참고 사이트 (https://www.elastic.co/guide/en/elasticsearch/reference/6.5/search-suggesters-completion.html)

PUT name_completion
{
  "mappings":{
    "_doc":{
      "properties":{
        "name":{
            "type": "completion"          
        }
      }
    }
  }
}

예제 데이터

PUT name_completion/_doc/1
{
  "name": "morris kim"
}
PUT name_completion/_doc/2
{
  "name": "daniel kim"
}
PUT name_completion/_doc/3
{
  "name": "morris park"
}
PUT name_completion/_doc/4
{
  "name": "daniel park"
}
PUT name_completion/_doc/5
{
  "name": "maris kim"
}

Suggest api를 사용해보자 suggest 쿼리는 다음과 같다.

( completion에 다양한 속성을 지원한다.(Fuzzy, regex) elasticsearch api 참고)

POST name_completion/_search
{
  "suggest":{
    //name_completion은 이름변경 가능
    "name_completion":{
      "prefix": "m",
      "completion":{
        "field": "name",
        "size" :5
      }
    }
  }
}

Prefix : 전방 일치 검색기능이기 때문에 m으로 시작하는 단어만 검색이 된다.

그렇기 때문에 부분 검색을 하기 위해서는 텍스트를 나눠서 배열형태로 만들어야한다.

변경한 예제 데이터

PUT name_completion/_doc/1
{
  "name": {
    "input": [
      "morris",
      "kim"
    ]
  }
}
PUT name_completion/_doc/2
{
  "name": {
    "input": [
      "daniel",
      "kim"
    ]
  }
}
PUT name_completion/_doc/3
{
  "name": {
    "input": [
      "morris",
      "park"
    ]
  }
}
PUT name_completion/_doc/4
{
  "name": {
    "input": [
      "daniel",
      "park"
    ]
  }
}
PUT name_completion/_doc/5
{
  "name": {
    "input": [
      "maris",
      "kim"
    ]
  }
}

이제는 prefix 부분에 m 뿐만 아니라 k를 적어도 부분적으로 검색이 가능하다

참고 도서 :

https://wikibook.co.kr/practical-elasticsearch/

+ Recent posts