편집거리(edit distance)를 사용해 비슷한 단어를 제안
문자열이 다른 문자열과 얼마나 비슷한가를 편집거리를 사용해 알아 볼 수 있음
편집거리 측정 방식은 단어를 삽입, 삭제, 치환 연산을 제공
측정 과정은 한 문자열을 다른 문자열로 바꾸는데 필요한 삽입, 삭제, 치환 연산의 수행 횟수
테스트 데이터 생성
PUT /_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" }
“lave” 검색
POST /movie_term_suggest/_search
{
"suggest": {
"spell-suggestion": {
"text": "lave",
"term": {
"field": "movieNm"
}
}
}
}
# 결과
{
...
"suggest": {
"spell-suggestion": [
{
"text": "lave",
"offset": 0,
"length": 4,
"options": [
{
"text": "love",
"score": 0.75,
"freq": 1
},
{
"text": "lover",
"score": 0.5,
"freq": 1
}
]
}
]
}
}
<aside> 💡 한글의 경우에는 Term Suggest를 이용해도 데이터가 추천되지 않음
</aside>
자동 완성을 위해 Completion Suggest API를 제공
응답 속도가 매우 중요
FST(Finite State Transducer)를 사용
자동완성 기능을 사용하기 위해서는 데이터 타입을 completion으로 설정
PUT /movie_term_completion
{
"mappings": {
"_doc": {
"properties": {
"movieNmEnComple": {
"type": "completion"
}
}
}
}
}
데이터 추가
PUT /_bulk
{ "index" : { "_index" : "movie_term_completion", "_id" : "1" } }
{ "movieNmEnComple" : "After Love" }
{ "index" : { "_index" : "movie_term_completion", "_id" : "2" } }
{ "movieNmEnComple" : "Lover" }
{ "index" : { "_index" : "movie_term_completion", "_id" : "3" } }
{ "movieNmEnComple" : "Love for a mother" }
{ "index" : { "_index" : "movie_term_completion", "_id" : "4" } }
{ "movieNmEnComple" : "Fall love" }
{ "index" : { "_index" : "movie_term_completion", "_id" : "5" } }
{ "movieNmEnComple" : "My lovely wife" }
“L”로 시작되는 모든 영화 제목을 검색
POST /movie_term_completion/_search
{
"suggest": {
"movie_completion": {
"prefix": "1",
"completion": {
"field": "movieNmEnComple",
"size": 5
}
}
}
}
자동완성 결과
부분일치를 하고 싶다면 분리해서 배열 형태로 만들어야 한다
PUT /_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"] } }