4.1 Suggest API 소개
- document 내 존재하는 단어를 대상으로 비슷한 키워드를 변경해서 제시하는 교정 기능 제공
- 검색 결과와 비슷한 내용을 보여줄 수 있는 방안 중 하나가 단어의 철자를 수정해서 다른 단어를 제안하거나 제안된 내용을 보여 주는 맞춤법 검사기(Spell Checker) 기능
- Suggest API를 통한 4가지 방식 제공
- Term Suggest API: 추천 단어 제안
- 편집거리를 사용해 비슷한 단어 제안
- 측정 과정 진행 시 한 문자열을 다른 문자열로 바꾸는데 필요한 삽입, 삭제, 치환 연산의 총 수햇 횟수의 합계를 편집거리라 한다.
- 한글의 경우에는 이를 이용해도 데이터가 추천되지 않음.
- 한글 유니코드 체계가 복잡하기 때문인데, 한글의 자소를 분해해서 문서를 처리한 후 색인할 경우에는 추천 기능 구현 가능
- Completion Suggest API: 자동완성 제안
- 자동완성을 위해 제공하는 기능
- 자동완성은 글자가 입력 될 때 마다 보여줘야 하기에 응답 속도가 매우 중요
- 자동완성 기능을 사용하기 위해서는 데이터 타입을 completion으로 설정해서 인덱스를 생성해야 한다.
- completion을 사용하려면 필드에 데이터를 넣을 때 검색이 가능해지는 형태로 가공해서 넣어야 한다.
- 내부적으로 FST(Finite State Transducer) 사용
- 검색어가 모두 메모리에 로드되어 서비스되는 구조
- 즉시 로드하면 리소스 측면에서 많은 비용이 한꺼번에 발생하기에 성능 최적화를 위해 색인 중에 FST를 작성하게 된다.
- 전방일지 방식 밖에 지원하지 않는다.
- Phrase Suggest API: 추천 문장 제안
- Context Suggest API: 추천 문맥 제안
7.2 맞춤법 검사기
- Suggest API가 한글에서는 잘 작동하지 않기에 자바카페 플러그인 설치하여 오타 교정 기능 구현
- 입력된 단어와 비슷한 단어를 찾기 위해 javacafe_spell 필터는 내부적으로 색인된 모든 데이터를 자소 단위로 분해 후 생성한다. 요청된 검색어도 자소로 분해하여 비슷한 데이터를 찾는다. 모든 데이터가 자소 단위로 분해됐기 때문에 편집거리 계산이 가능해진다.
- search_keyword 인덱스에 키워드 자체가 존재하지 않는다면 오타 교정이 불가능하기 때문에 검색어에 대한 모니터링의 수행이 수시로 필요하다.
- 검색 질의 시 로그 등을 활용해 logstash에 저장하고 검색어와 검색 결과가 0건인 경우를 늘 모니터링해야 검색 품질을 높일 수 있다.
7.3 한글 키워드 자동완성
7.3.2 Suggest API를 이용한 한글 자동완성의 문제점
- 부분 일치 불가
- 키워드의 일부분으로는 자동완성 결과 제공 X
- Completion Suggest API는 내부적으로 Prefix 방식의 매칭만 지원
- 한글 초성 검색 불가
- 초성 검색이 가능해지려면 한글의 자모 분석이 먼저 이루어져야 한다.
- 한글 자모 검색 불가
- 받침이 있는 글자가 이어지는 경우 이 받침 때문에 타이핑 과정에서 문제 발생
- 한글의 경우 검색어를 자음과 모음으로 분리해서 요청해야 키워드를 입력하는 도중에도 정확한 결과가 노출된다.
7.3.3 직접 구현해보는 한글 자동완성
엘라스틱서치는 Completion Suggest API로 생성된 인덱스의 전체 데이터를 메모리에 올려 캐시로 생성하고 요청이 올 때 마다 메모리에서 연산을 수행하는 방식으로 동작한다.
다만 이 방식의 큰 문제점은 키워드에 대한 Prefix 매칭만 지원한다는 점이다.
- Completion Suggest API 이용
- 루씬을 이용해 직접 구현