문제점

Dandi 프로젝트에서 엘라스틱서치의 Text 타입 데이터들을 Nori 플러그인을 사용해 한국어를 분석하고 여러 텀으로 쪼개 색인하는 과정을 거칩니다.

다만, 이 과정에서 예상치 못한 문제들이 발생했습니다.

  1. 특정 명사를 검색하기 위해서는 해당 명사를 정확히 입력해야한다.

Untitled

Nori 토크나이저를 사용하면, 문장을 의미가 있는 가장 작은 단위인 term으로 쪼개 색인합니다.

즉, 베트남이라는 명사의 가장 작은 단위는 **베트남**으로 베트, 트남 처럼 검색하면 MySQL의 Like문이 했던 것 처럼 결과를 얻지 못합니다.

  1. 사전에 등록되지 않은 단어를 이상하게 분석한다.

Untitled

저희 서비스는 일기라는 특성을 가진 서비스이기 때문에 대부분의 사용자들은 사전에 없는 음식점 이름, 신조어 등 여러 단어를 입력할 것입니다.

이럴 경우 Nori 토크나이저는 단어를 예상치 못하게 파싱하는데, 예를들어 모했다구같은 이상한 단어를 사용해 검색한다면, 라는 term으로 파싱하기 때문에 가 포함된 모든 결과를 반환할 수 있습니다.

Wildcard Query를 사용해보쟈~

GET /dandi-ary-redis/_search
{
  "query" : {
    "wildcard": { "content": "*베트*" }
  }
}

엘라스틱서치도 MySQL이 지원하는 Like문과 같은 기능을 하는 wildcard쿼리를 지원합니다.

위와같은 쿼리로 정말 간단히 MySQL의 Like문과 같이 기능을 구현할 수 있었고, wildcard 쿼리를 사용하면 앞에서 언급했던 문제 1, 2 모두 해결할 수 있을것만 같았지만 문제점이 존재합니다.