Dandi 프로젝트에서 엘라스틱서치의 Text 타입 데이터들을 Nori 플러그인을 사용해 한국어를 분석하고 여러 텀으로 쪼개 색인하는 과정을 거칩니다.
다만, 이 과정에서 예상치 못한 문제들이 발생했습니다.
Nori 토크나이저를 사용하면, 문장을 의미가 있는 가장 작은 단위인 term으로 쪼개 색인합니다.
즉, 베트남이라는 명사의 가장 작은 단위는 **베트남
**으로 베트
, 트남
처럼 검색하면 MySQL의 Like문이 했던 것 처럼 결과를 얻지 못합니다.
저희 서비스는 일기라는 특성을 가진 서비스이기 때문에 대부분의 사용자들은 사전에 없는 음식점 이름, 신조어 등 여러 단어를 입력할 것입니다.
이럴 경우 Nori 토크나이저는 단어를 예상치 못하게 파싱하는데, 예를들어 모했다구
같은 이상한 단어를 사용해 검색한다면, 모
라는 term으로 파싱하기 때문에 모
가 포함된 모든 결과를 반환할 수 있습니다.
GET /dandi-ary-redis/_search
{
"query" : {
"wildcard": { "content": "*베트*" }
}
}
엘라스틱서치도 MySQL이 지원하는 Like문과 같은 기능을 하는 wildcard
쿼리를 지원합니다.
위와같은 쿼리로 정말 간단히 MySQL의 Like문과 같이 기능을 구현할 수 있었고, wildcard 쿼리를 사용하면 앞에서 언급했던 문제 1, 2 모두 해결할 수 있을것만 같았지만 문제점이 존재합니다.