[ElasticSearch] Ngram Tokenizer

Woong·2026년 2월 20일

ElasticSearch

목록 보기
30/30

ngram, edge ngram Tokenizer

  • 입력 텍스트를 고정 길이 n의 부분 문자열로 분해해 token을 생성하는 tokenizer 계열

    • 부분 일치 검색을 통해 Recall을 확보
    • 사용자의 불완전한 입력(미완성, 일부 입력)에 대응
  • 차이점

    • n-gram: 문자열 어디서든 잘라냄 (substring)
    • edge n-gram: 문자열 시작 지점(prefix) 에서만 잘라냄

1. n-gram Tokenizer

  • 문자열을 sliding window 방식으로 잘라 모든 위치의 부분 문자열을 token으로 생성

  • ex)

    • min_gram=2, max_gram=3 설정
"elastic"
→ el, la, as, st, ti, ic
→ ela, las, ast, sti, tic

주요 목적

  • substring 검색
    • 단어 중간 일부만 입력해도 매칭
  • 오타 / 누락 일부 허용
  • 띄어쓰기·형태소 경계가 불명확한 언어에서 Recall 보강
{
  "settings": {
    "analysis": {
      "tokenizer": {
        "ngram_tokenizer": {
          "type": "ngram",
          "min_gram": 2,
          "max_gram": 3,
          "token_chars": ["letter", "digit"]
        }
      },
      "analyzer": {
        "ngram_analyzer": {
          "type": "custom",
          "tokenizer": "ngram_tokenizer",
          "filter": ["lowercase"]
        }
      }
    }
  }
}
  • 장점

    • 중간 substring 매칭 가능
    • Recall 극대화
  • 단점

    • token 폭증
    • Precision 저하
    • 인덱스 크기·검색 비용 증가

edge n-gram Tokenizer

  • 문자열의 시작 지점(edge) 에서만 n-gram을 생성
  • prefix 기반 분해
  • ex)
    • min_gram=2, max_gram=4 설정시
"elastic"
→ el, ela, elas

주요 목적

  • autocomplete / search-as-you-type
  • 사용자가 앞에서부터 타이핑하는 UX에 최적화
  • prefix 기반 검색에서 Precision 유지
{
  "settings": {
    "analysis": {
      "tokenizer": {
        "edge_ngram_tokenizer": {
          "type": "edge_ngram",
          "min_gram": 2,
          "max_gram": 4,
          "token_chars": ["letter", "digit"]
        }
      },
      "analyzer": {
        "edge_ngram_analyzer": {
          "type": "custom",
          "tokenizer": "edge_ngram_tokenizer",
          "filter": ["lowercase"]
        }
      }
    }
  }
}
  • 장점

    • token 수 제한 → 비용 효율적
    • Precision 상대적으로 높음
    • autocomplete에 최적
  • 단점

    • substring 매칭 불가
    • 중간 입력(las)은 매칭되지 않음

매핑 패턴

  • index time에는 n-gram / edge n-gram
  • search time에는 standard analyzer
{
  "mappings": {
    "properties": {
      "name": {
        "type": "text",
        "analyzer": "standard",
        "fields": {
          "ngram": {
            "type": "text",
            "analyzer": "ngram_analyzer",
            "search_analyzer": "standard"
          },
          "edge": {
            "type": "text",
            "analyzer": "edge_ngram_analyzer",
            "search_analyzer": "standard"
          }
        }
      }
    }
  }
}

reference

0개의 댓글