엘라스틱서치 실무 가이드 4
🙊

엘라스틱서치 실무 가이드 4

Created
May 20, 2024 01:47 AM
Last edited time
Last updated May 20, 2024
Tags
ElasticSearch
Language
URL

Intro::

엘라스틱서치 실무 가이드 7장 정리본입니다.
 

Suggest API 소개

엘라스틱서치에서 제공하는 API 중 Suggest API를 이용하면 텀과 정확히 일치하지 않는 단어도 자동으로 인식해서 처리할 수 있으며 이를 통해 좀 더 사용자 친화적인 검색 서비스를 제공할 수 있다.
Suggest API는
  • Term Suggest API: 추천 단어 제안
  • Phrase Suggest API: 자동완성 제안
  • Completion Suggest API: 추천 문장 제안
  • Context Suggest API: 추천 문맥 제안
 

Term Suggest API

// 데이터 추가 POST _bulk { "index": { "_index": "movie_term_suggest", "_id": "1" } } {"movieNm": "lover"} { "index": { "_index": "movie_term_suggest", "_id": "2" } } {"movieNm": "Fall love"} { "index": { "_index": "movie_term_suggest", "_id": "3" } } {"movieNm": "lovely"} { "index": { "_index": "movie_term_suggest", "_id": "4" } } {"movieNm": "lovestory"} // suggest 사용 POST movie_term_suggest/_search { "suggest": { "spell-suggestion": { "text": "lave", "term": { "field": "movieNm" } } } } // 응답 { "took" : 12, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 0, "relation" : "eq" }, "max_score" : null, "hits" : [ ] }, "suggest" : { "spell-suggestion" : [ { "text" : "lave", "offset" : 0, "length" : 4, "options" : [ { "text" : "love", "score" : 0.75, "freq" : 1 }, { "text" : "lover", "score" : 0.5, "freq" : 1 } ] } ] } }
결과는 세가지 필드로 제공되어진다.
  • text
    • 제안한 문자
  • score
    • 제안하고자 하는 텍스트가 원본과 얼마나 가까운지
  • freq
    • 전체 문서에서 해당 텀의 빈도
 
한글의 경우 Term Suggest를 이용해도 데이터가 추천되지 않는다. 기본적으로 한글 유니코드 체계가 복잡하기 때문이다. 하지만 한글의 자소를 분해해서 문서를 처리한 후 색인할 경우 영문과 동일하게 추천 기능을 구현하는 것이 가능해진다.
 

Completion Suggest API

엘라스틱서치에서는 자동완성을 위해 Completion Suggest API를 제공한다. 자동완성은 글자가 입력될 때마다 검색 결과를 보여줘야 하기 때문에 Term Suggest API와 달리 응답 속도가 매우 중요하다. 때문에 내부적으로 FST(Finite State Transducer)를 사용한다. FST는 검색어가 모두 메모리에 로드되어 서비스되는 구조이며, 즉기 FST를 로드하게 되면 리소스 측면에서 많은 비용이 한꺼번에 발생하기 때문에 성능 최적화를 위해 색인 중에 FST를 작성하게 된다.
자동완성 기능을 사용하기 위해서 데이터 타입을 completion으로 설정해서 인덱스를 생성해야 한다.
// 인덱스 생성 PUT movie_term_completion { "mappings": { "properties": { "movieNmEnComple": { "type": "completion" } } } } // 데이터 추가 POST _bulk {"index":{"_index":"movie_term_completion","_id":"1"}} {"movieNmComple":"After Love"} {"index":{"_index":"movie_term_completion","_id":"2"}} {"movieNmComple":"Lover"} {"index":{"_index":"movie_term_completion","_id":"3"}} {"movieNmComple":"Love for a mother"} {"index":{"_index":"movie_term_completion","_id":"4"}} {"movieNmComple":"Fall love"} {"index":{"_index":"movie_term_completion","_id":"5"}} {"movieNmComple":"My lovely wife"} // 자동완성 기능 테스트 POST movie_term_completion/_search { "suggest": { "movie_completion": { "prefix": "l", "completion": { "field": "movieNmEnComple", "size": 5 } } } }
prefix를 사용하게 되면 전방일치 검색기능 때문에 영화 제목이 반드시 L로 시작해야만 자동완성 결과로 제공된다. 이를 통해 부분일치되는 데이터까지 검색되게 하려면 prefix만으로는 해결되지 않는다는 사실을 알 수 있다. completion을 사용하려면 필드에 데이터를 넣을 때 검색이 가능해지는 형태로 가공해서 넣어야 한다.
// 부분일치 고려 POST _bulk {"index":{"_index":"movie_term_completion","_id":"1"}} {"movieNmEnComple":{"input":["After","Love"]}} {"index":{"_index":"movie_term_completion","_id":"2"}} {"movieNmEnComple":{"input":["Lover"]}} {"index":{"_index":"movie_term_completion","_id":"3"}} {"movieNmEnComple":{"input":["Love","for","a","mother"]}} {"index":{"_index":"movie_term_completion","_id":"4"}} {"movieNmEnComple":{"input":["Fall","Love"]}} {"index":{"_index":"movie_term_completion","_id":"5"}} {"movieNmEnComple":{"input":["My","lovely","wife"]}}
단어 단위로 잘라서 배열 형태로 넣었기 떄문에 모두 prefix에 의한 전방일치에 의해 검색이 이뤄졌다.
 

References::

Loading Comments...