ElasticSearch

GreenBean·2023년 2월 17일
1
post-thumbnail

ElasticSearch

이전 작성 글: ElasticSearch 란?
이전 작성 글: ElasticSearch 에 대한 정리

[ElasticSearch] 실무 가이드 - 검색 시스템
ElasticSearch 의 기본개념 및 장단점

기타 참고 자료
[MongoDB] 전문검색 ( Full text Search )
[MySQL] Full Text Search 전문검색 기능

검색과 쿼리

Elastic 가이드북: 검색과 쿼리 - Query DSL

검색 Search

  • 검색 ( Retrieval ) 의 사전적인 의미
    • 책이나 컴퓨터에 들어 있는 자료 중 필요한 자료를 찾아냄
    • 범죄나 사건을 밝히기 위한 단서나 증거를 찾기 위하여 살펴 조사함
  • 데이터 시스템에서의 검색
    • 수많은 대상 데이터 중에서 조건에 부합하는 데이터로 범위를 축소하는 행위
  • 인터넷 쇼핑몰에 상품이 100만개가 있을 때 검색창에 "무선 이어폰" 이라고 입력해서 시스템에 있는 전체 100만개의 상품들 중 무선 이어폰과 연관된 상품만 추려내는 과정을 검색이라고 할 수 있음
    • 검색 엔진 설정에 따라 상품명이 정확히 "무선 이어폰" 인 것만 보여줄지, "소니 무선 이어폰" 처럼 전체 상품명 중에 검색어를 포함하기만 하면 보여줄지 가격 ∙ 출시일 등과 같이 다른 조건들에 대해서는 어떻게 영향을 받도록 할 것인지 등을 결정할 수 있음
  • 상품명이 정확히 "무선 이어폰" 인 것만 검색 하도록 조건을 엄격하게 하면 표시되는 결과 수가 적어져서 내가 찾는 상품이 나타나지 않을 수 있음
    • 반대로 상품 설명에 "무선""이어폰" 이 하나라도 있는 상품을 모두 검색하도록 하면 "무선 리모컨""이어폰 케이스" 같은 상품까지 검색이 되면서 결과가 너무 많아져서 내가 찾는 상품이 묻혀 버릴 수 있음
    • 품질이 높은 검색 시스템을 구현하기 위해서는 이렇게 많은 부분들을 고민해야 함
  • Elasticsearch 는 사용자가 이런 여러가지 검색 조건들에 대해 목표로 하는 검색 기능을 구현할 수 있도록 다양한 기능들을 제공
    • Elasticsearch 는 데이터를 실제로 검색에 사용되는 검색어인 텀 ( Term ) 으로 분석 과정을 거쳐 저장하기 때문에 검색 시 대소문자 ∙ 단수나 복수 ∙ 원형 여부와 상관 없이 검색이 가능
    • 이러한 Elasticsearch 의 특징을 풀 텍스트 검색 ( Full Text Search ) 이라고 하며 한국어로 전문 검색 이라고도 함

Tip! Full Text Search ( 전문검색 ) 란?

  • 전문검색 이란 게시물의 내용이나 제목 등과 같이 문장이나 문서의 내용에서 키워드를 검색하는 기능
    • 전문검색 이란 내용 전체를 색인해서 특정 단어가 포함된 문서를 검색하는 것을 말함
  • 전문검색은 이름이나 별명과 같은 단어에서 일부만 일치하는 사용자를 검색하는 기능으로도 사용 가능
    • Like 기능과 같이 패턴 일치 검색 기능 ( 양쪽에 % % 을 사용한 ) 은 인덱스를 사용하지 못할 수도 있지만 전문검색은 일부만 검색하는 경우에도 전문검색 인덱스를 이용할 수 있기 때문에 Like %패턴% 과 같은 조회 요건에 대해서 더 빠른 검색이 가능

데이터 색인과 텍스트 분석

Elastic 가이드북: 데이터 색인과 텍스트 분석

  • 풀 텍스트 검색 (=전문검색) 을 하기 위해서는 데이터를 검색에 맞게 가공하는 작업을 필요로 하는데 Elasticsearch데이터를 저장하는 과정에서 이 작업을 처리
    • 검색을 위해 텍스트 데이터를 어떻게 처리하고 데이터를 색인 할 때 Elasticsearch 에서 어떤 과정이 이루어지는지에 대해 살펴볼 예정

역 인덱스 ( Inverted Index )

  • 관계형 DB에서는 테이블에서 Textfox 가 포함된 행들을 가져온다고 하면 다음과 같이 Text 열을 한 줄씩 찾아 내려가면서 fox 가 있으면 가져오고 없으면 넘어가는 식으로 데이터를 가져 올 것

  • 전통적인 RDBMS 에서는 위와 같이 like 검색을 사용하기 때문에 데이터가 늘어날수록 검색해야 할 대상이 늘어나 시간도 오래 걸림
    • row 안의 내용을 모두 읽어야 하기 때문에 기본적으로 속도가 느림
  • Elasticsearch 는 데이터를 저장할 때 다음과 같이 역 인덱스 ( Inverted Index ) 라는 구조를 만들어 저장

  • 이 역 인덱스는 책의 맨 뒤에 있는 주요 키워드에 대한 내용이 몇 페이지에 있는지 볼 수 있는 찾아보기 페이지 에 비유할 수 있음
    • Elasticsearch 에서는 추출된 각 키워드를 ( Term ) 이라고 부름
    • 이렇게 역 인덱스가 있으면 fox 를 포함하고 있는 도큐먼트들의 ID 를 바로 얻어올 수 있음

  • Elasticsearch 는 데이터가 늘어나도 찾아가야 할 행이 늘어나는 것이 아니라 역 인덱스가 가리키는 ID 의 배열값이 추가되는 것 뿐이기 때문에 큰 속도의 저하 없이 빠른 속도로 검색이 가능
    • 이런 역 인덱스를 데이터가 저장되는 과정에서 만들기 때문에 Elasticsearch데이터를 입력할 때 저장이 아닌 색인을 한다고 표현

텍스트 분석 ( Text Analysis )

  • Elasticsearch저장되는 도큐먼트모든 문자열 ( Text ) 필드 별로 역 인덱스를 생성
    • 검색에 사용하는 경우에는 앞에서 설명한 역 인덱스의 예제는 실제로는 보통 아래와 같이 저장됨

  • Elasticsearch 는 문자열 필드가 저장될 때 데이터에서 검색어 토큰을 저장하기 위해 여러 단계의 처리 과정을 거침
    • 전체 과정을 텍스트 분석 ( Text Analysis ) 이라고 하고 이 과정을 처리하는 기능을 애널라이저 ( Analyzer ) 라고 함
    • Elasticsearch 의 애널라이저는 0-3개의 캐릭터 필터 ( Character Filter ) 와 1개의 토크나이저 ( Tokenizer ) 그리고 0-n개의 토큰 필터 ( Token Filter ) 로 이루어짐

  • 텍스트 데이터가 입력되면 가장 먼저 필요에 따라 전체 문장에서 특정 문자를 대치하거나 제거하는데 이 과정을 담당하는 기능이 캐릭터 필터
  • 다음으로는 문장에 속한 단어들을 텀 단위로 하나씩 분리 해 내는 처리 과정을 거치는데 이 과정을 담당하는 기능이 토크나이저
    • 토크나이저는 반드시 1개만 적용이 가능
    • 다음은 whitespace 토크나이저를 이용해서 공백을 기준으로 텀 들을 분리 한 결과

  • 다음으로 분리된 텀 들을 하나씩 가공하는 과정을 거치는데 이 과정을 담당하는 기능이 토큰 필터
    • 토큰 필터는 0개 부터 여러 개를 적용할 수 있음
    • 여기서는 먼저 lowercase 토큰 필터를 이용해서 대문자를 모두 소문자로 바꿔줌
      • 이렇게 하면 대소문자 구별 없이 검색이 가능하게 됨
      • 대소문자가 일치하게 되어 같은 텀이 된 토큰들은 모두 하나로 병합

  • 역 인덱스는 아래와 같이 변경됨

  • 텀 중에는 검색어로서의 가치가 없는 단어들이 있는데 이런 단어를 불용어 ( Stopword ) 라고 함
    • 보통 a, an, are, at, be, but, by, do, for, i, no, the, to 등의 단어들은 불용어로 간주되어 검색어 토큰에서 제외됨
    • stop 토큰 필터를 적용하면 우리가 만드는 역 인덱스에서 the 가 제거

  • 이제 형태소 분석 과정을 거쳐서 문법상 변형된 단어를 일반적으로 검색에 쓰이는 기본 형태로 변환하여 검색이 가능하게 함
    • 영어에서는 형태소 분석을 위해 snowball 토큰 필터를 주로 사용하는데 이 필터는 -s, -ing 등을 제거
    • 그리고 happy, lazy 와 같은 단어들은 happiness, laziness 와 같은 형태로도 사용되기 때문에 -y 를 -i 로 변경
    • snowball 토큰 필터를 적용하고 나면 jumps 와 jumping 은 모두 jump 로 변경되고 동일하게 jump 로 되었기 때문에 하나의 텀으로 병합

  • 필요에 따라서는 동의어를 추가 해 주기도 함
    • synonym 토큰 필터를 사용하여 quick 텀에 동의어로 fast 를 지정하면 fast 로 검색했을 때도 같은 의미인 quick 을 포함하는 도큐먼트가 검색되도록 할 수 있음
    • AWS 와 Amazon 을 동의어로 놓아 amazon 을 검색해도 AWS 를 찾을 수 있게 하는 등 실제로도 사용되는 사례가 많음

애널라이저 ( Analyzer )

  • Elasticsearch 에는 애널라이저를 조합하고 그 동작을 자세히 확인할 수 있는 API 들이 존재

캐릭터 필터 ( Character Filter )

  • 캐릭터 필터는 텍스트 분석 중 가장 먼저 처리되는 과정으로 색인된 텍스트가 토크나이저에 의해 텀으로 분리되기 전에 전체 문장에 대해 적용되는 일종의 전처리 도구
    • 7.0 버전 기준으로 캐릭터 필터는 HTML Strip, Mapping, Pattern Replace 총 3개가 존재
    • char_filter 항목에 배열로 입력하며 하나만 적용하거나 차례대로 입력해서 3개를 모두 적용할 수도 있음

토크나이저 ( Tokenizer )

  • 데이터 색인 과정에서 검색 기능에 가장 큰 영향을 미치는 단계가 토크나이저
    • 데이터 분석 과정에서 토크나이저는 반드시 한 개만 사용이 가능하며 tokenizer 항목에 단일값으로 설정
    • 토크나이저들 중 NGram, Lowercase 같은 토크나이저들은 대부분은 Standard 토크나이저에 같은 이름의 토큰 필터를 내장

Standard, Letter, Whitespace

  • 일반적으로 가장 많이 사용되고 기능이 유사하지만 분명히 다른 특징이 있는 Standard, Letter, Whitespace 3가지 토크나이저
  • 분석할 문장은 "THE quick.brown_FOx jumped! @ 3.5 meters."
  • Standard 토크나이저공백으로 텀을 구분하면서 "@"과 같은 일부 특수문자를 제거
    • "jumped!"의 느낌표, "meters."의 마침표 처럼 단어 끝에 있는 특수문자는 제거되지만 "quick.brown_FOx" 또는 "3.5" 처럼 중간에 있는 마침표나 밑줄 등은 제거되거나 분리되지 않는 것을 확인할 수 있음
  • Letter 토크나이저알파벳을 제외한 모든 공백, 숫자, 기호들을 기준으로 텀을 분리
    • "quick.brown_FOx" 같은 단어도 "quick", "brown", "FOx" 처럼 모두 분리된 것을 확인할 수 있음
  • Whitespace 토크나이저스페이스, 탭, 그리고 줄바꿈 같은 공백만을 기준으로 텀을 분리
    • 특수문자 "@" 그리고 "meters." 의 마지막에 있는 마침표도 사라지지 않고 그대로 남아있는 것을 확인할 수 있음
  • 3개의 토크나이저 중에 Letter 토크나이저의 경우 검색 범위가 넓어져서 원하지 않는 결과가 많이 나올 수 있고, 반대로 Whitespace 의 경우 특수문자를 거르지 않기 때문에 정확하게 검색을 하지 않으면 검색 결과가 나오지 않을 수 있음
    • 따라서 보통은 Standard 토크나이저를 많이 사용

UAX URL Email

  • 주로 사용되는 Standard 토크나이저도 @, / 같은 특수문자는 공백과 마찬가지로 제거하고 분리
    • 그런데 요즘의 블로그 포스트나 신문기사 같은 텍스트 들에는 이메일 주소 또는 웹 URL 경로 등이 삽입되어 있는 경우가 상당히 많음
    • 이 경우 Standard 토크나이저를 사용하면 이메일 주소등이 정상적으로 인식되지 않아 문제가 될 수 있는데, 이를 방지하기 위해 사용 가능한 것이 UAX URL Email 토크나이저

Pattern

  • 앞에서 살펴본 토크나이저들은 다소 차이는 있지만 기본적으로는 공백을 기준으로 하여 텀 들을 분리
    • 분석 할 데이터가 사람이 읽는 일반적인 문장이 아니라 서버 시스템이나 IoT 장비 등에서 수집된 머신 데이터인 경우 공백이 아닌 쉼표나 세로선 같은 기호가 값 항목의 구분자로 사용되는 경우가 종종 있음
    • 이런 특수한 문자를 구분자로 사용하여 텀을 분리하고 싶은 경우 사용할 수 있는 것이 Pattern 토크나이저
  • Pattern 토크나이저는 분리할 패턴을 기호 또는 Java 정규식 형태로 지정할 수 있음
    • 구분자 지정은 pattern 항목에 설정
    • 다음은 인덱스 pat_tokenizer 에 슬래시 / 를 구분자로 하는 my_pat_tokenizer 라는 사용자 정의 토크나이저를 만들고 "/usr/share/elasticsearch/bin" 를 분석하는 예제
PUT pat_tokenizer
{
  "settings": {
    "analysis": {
      "tokenizer": {
        "my_pat_tokenizer": {
          "type": "pattern",
          "pattern": "/"
        }
      }
    }
  }
}
  • "pattern": "/" 같은 단일 기호 외에도 알파벳 대문자를 기준으로 텀을 분리하도록 하는 "pattern": "(?<=\\p{Lower})(?=\\p{Upper})" 와 같은 정규식 ( Regular Expression ) 으로도 설정 가능

Path Hierarchy

  • 디렉토리나 파일 경로 등은 흔하게 저장되는 데이터
    • 앞의 Pattern 토크나이저에서 "/usr/share/elasticsearch/bin" 를 실행했을 때는 디렉토리명 들이 각각 하나의 토큰으로 분리 된 것을 확인
    • 이 경우 다른 패스에 있는데 하위 디렉토리 명이 같은 경우 데이터 검색에 혼동이 올 수 있음
  • Path Hierarchy 토크나이저를 사용하면 경로 데이터를 계층별로 저장해서 하위 디렉토리에 속한 도큐먼트들을 수준별로 검색하거나 집계하는 것이 가능
    • 다음은 Path Hierarchy 토크나이저로 "/usr/share/elasticsearch/bin" 를 분석하는 예제
POST _analyze
{
  "tokenizer": "path_hierarchy",
  "text": "/usr/share/elasticsearch/bin"
}
  • delimiter 항목값으로 경로 구분자를 지정할 수 있음
    • 디폴트는 /
    • 그리고 replacement 옵션을 이용해서 소스의 구분자를 다른 구분자로 대치해서 저장하는 것도 가능
    • 다음은 인덱스 hir_tokenizer- 구분자를 / 구분자로 대치하는 my_hir_tokenizer 라는 사용자 정의 토크나이저를 만들고 "one-two-three" 문장을 분석하는 예제
PUT hir_tokenizer
{
  "settings": {
    "analysis": {
      "tokenizer": {
        "my_hir_tokenizer": {
          "type": "path_hierarchy",
          "delimiter": "-",
          "replacement": "/"
        }
      }
    }
  }
}
GET hir_tokenizer/_analyze
{
  "tokenizer": "my_hir_tokenizer",
  "text": [
    "one-two-three"
  ]
}

토큰 필터 ( Token Filter )

  • 토크나이저를 이용한 텀 분리 과정 이후에는 분리된 각각의 텀 들을 지정한 규칙에 따라 처리를 해 주는데 이 과정을 담당하는 것이 토큰 필터
    • 토큰 필터filter ( token_filter 아님 ) 항목에 배열 값으로 나열해서 지정
      • 하나만 사용하더라도 배열 값으로 입력해야 하며 나열된 순서대로 처리되기 때문에 순서를 잘 고려해서 입력해야 함

Lowercase, Uppercase

  • 영어나 유럽어 기반의 텍스트는 대소문자가 있어 검색할 때는 대소문자에 상관 없이검색이 가능하도록 처리 해 주어야 함
    • 보통은 텀 들을 모두 소문자로 변경하여 저장하는데 이 역할을 하는 것이 Lowercase 토큰 필터
    • Lowercase 토큰 필터는 거의 모든 텍스트 검색 사례에서 사용되는 토큰 필터
  • Uppercase 토큰 필터는 모든 텀을 대문자로 변경하는 것 이며 Lowercase 와 동일하게 설정

Stop

  • 블로그 포스트나 뉴스 기사 같은 글에는 검색에서는 큰 의미가 없는 조사나 전치사 등이 많음
    • 영문에서도 the, is, a 같은 단어들은 대부분 검색어로 쓰이지 않는데 이런 단어를 한국어로는 불용어, 영어로는 Stopword 라고 함
    • Stop 토큰 필터를 적용하면 불용어에 해당되는 텀 들을 제거
  • stopwords 항목에 불용어로 지정할 단어들을 배열 형태로 나열하거나 "_english_", "_german_" 같이 언어를 지정해서 해당 언어팩에 있는 불용어를 지정할 수도 있음
    • 지원되는 언어팩은 공식 도큐먼트에서 확인할 수 있으며 한, 중, 일어 등은 별도의 형태소 분석기를 사용해야 함
    • 불용어 목록을 별도의 텍스트 파일로 저장하고 저장된 파일 경로를 stopwords_path 항목의 값으로 지정하여 사용하는 것도 가능

Synonym

  • 검색 서비스에 따라서 동의어 검색을 제공해야 하는 경우가 있습니음
    • 예를 들면 클라우드 서비스 관련 정보를 검색하는 시스템에서 "AWS" 라는 단어를 검색했을 때 "Amazon" 또는 한글 "아마존" 도 같이 검색을 하도록 하면 관련된 정보를 더 많이 찾을 수 있을 것
    • 이 때 Synonym 토큰 필터를 사용하면 텀의 동의어 저장이 가능
  • 동의어를 설정하는 옵션은 synonyms 항목에서 직접 동의어 목록을 입력하는 방법과 동의어 사전 파일을 만들어 synonyms_path 로 지정하는 방법이 있음
  • 동의어 사전 명시 규칙에는 다음의 것들이 존재
    • "A, B => C"
      • 왼쪽의 A, B 대신 오른쪽의 C 텀을 저장
      • A, B 로는 C 의 검색이 가능하지만 C 로는 A, B 가 검색되지 않음
    • "A, B"
      • A, B 각 텀이 A 와 B 두개의 텀을 모두 저장
      • A 와 B 모두 서로의 검색어로 검색이 됨

NGram, Edge NGram, Shingle

NGram

  • Elasticsearch빠른 검색을 위해 검색에 사용될 텀 들을 미리 분리해서 역 인덱스에 저장
    • 하지만 과학 용어집 검색 같은 특정한 사용 사례에 따라 텀이 아닌 단어의 일부만 가지고도 검색해야 하는 기능이 필요한 경우도 있음
    • RDBMS의 LIKE 검색 처럼 사용하는 wildcard 쿼리나 regexp (정규식) 쿼리도 지원을 하지만, 이런 쿼리들은 메모리 소모가 많고 느리기 때문에 Elasticsearch 의 장점을 활용하지 못함
    • 이런 사용을 위해 검색 텀의 일부만 미리 분리해서 저장을 할 수 있는데 이렇게 단어의 일부를 나눈 부위NGram 이라고 함
    • 보통은 unigram (유니그램 – 1글자), bigram (바이그램 - 2자) 등으로 부름
  • ElasticsearchNGram 을 처리하는 토큰 필터를 제공하며 설정은 "type": "nGram" 으로 함
    • "house" 라는 단어를 2 글자의 NGram ( bigram ) 으로 처리하면 다음과 같이 "ho", "ou", "us", "se" 총 4개의 토큰들이 추출
    • ngram 토큰 필터를 사용하면 이렇게 2글자씩 추출된 텀들이 모두 검색 토큰으로 저장
    • 이제 이 인덱스의 경우에는 검색어를 "ho" 라고만 검색을 해도 house 가 포함된 도큐먼트들이 검색됨

Tip! 주의 사항

  • NGram 토큰 필터를 사용하면 저장되는 텀의 갯수도 기하급수적으로 늘어나고 검색어를 "ho" 로 검색 했을 때 house, shoes 처럼 검색 결과를 예상하기 어렵기 때문에 일반적인 텍스트 검색에는 사용하지 않는 것이 좋음
  • NGram 을 사용하기 적합한 사례는 카테고리 목록이나 태그 목록과 같이 전체 개수가 많지 않은 데이터 집단자동완성 같은 기능을 구현하는 데에 적합
  • NGram 토큰 필터에는 min_gram (디폴트 1), max_gram (디폴트 2) 옵션이 있음
    • 짐작할 수 있듯이 최소, 최대 문자수의 토큰을 구분하는 단위
    • house"min_gram": 2, "max_gram": 3 으로 설정하면 다음과 같이 분석되어 총 7개의 토큰을 저장

Edge NGram

  • 검색을 위해 NGram 을 저장하더라도 보통은 단어의 맨 앞에서부터 검색하는 경우가 많음
    • 텀 앞쪽의 NGram 만 저장하기 위해서는 Edge NGram 토큰 필터를 이용
      • 설정 방법은 "type": "edgeNGram"
      • edgeNGram 의 옵션을 "min_gram": 1, "max_gram": 4 으로 설정하고 "house" 를 분석하면 다음과 같이 "h", "ho", "hou", "hous" 4개의 토큰이 생성됨

Shingle

  • NGramEdge NGram 은 모두 하나의 단어로부터 토큰을 확장하는 토큰 필터
    • 문자가 아니라 단어 단위로 구성된 묶음을 Shingle 이라고 하며 "type": "shingle" 토큰 필터의 이용이 가능
    • "this is my sweet home" 라는 문장을 분리해서 2 단어씩 Shingle 토큰 필터를 적용하면 다음과 같은 4개의 Shingle 들이 생성됨

  • Shingle 토큰 필터에서 사용 가능한 옵션
    • min_shingle_sizemax_shingle_size
      • Shingle 의 최소 ∙ 최대 단어 개수를 지정
      • 디폴트는 모두 2
    • output_unigrams
      • Shingle 외에도 각각의 개별 토큰 ( unigram ) 도 저장 하는지의 여부를 설정
      • 디폴트는 true
    • output_unigrams_if_no_shingles
      • Shingle 을 만들 수 없는 경우에만 개별 토큰을 저장하는지의 여부를 설정
      • 디폴트는 false
    • token_separator
      • 토큰 구분자를 지정
      • 디폴트는 " " ( 스페이스 )
    • filler_token
      • Shingle 을 만들 텀이 없는 경우 대체할 텍스트를 지정
        • 보통은 stop 토큰 필터와 함께 사용되어 offset 위치만 있고 텀이 없는 경우
      • 디폴트는 _

Tip! 주의 사항

  • NGram, Edged NGram 그리고 Shingle 토큰 필터는 보통 일반적인 텍스트 분석에 사용하기는 적합하지 않음
  • 하지만 자동 완성 기능을 구현하거나 프로그램 코드 안에서 문법이나 기능명을 검색하는 것과 같이 특수한 요구사항을 충족해야 하는 경우 유용하게 사용될 수 있음

Unique

  • "white fox, white rabbit, white bear" 같은 문장을 분석하면 "white" 텀은 총 3번 저장됨
    • 역 색인에는 텀이 1개만 있어도 텀을 포함하는 도큐먼트를 가져올 수 있기 때문에 중복되는 텀 들은 삭제 해 주어도 검색에는 보통 무방
    • 이 경우 Unique 토큰 필터를 사용해서 중복되는 텀 들은 하나만 저장하도록 할 수 있음

Tip! 주의 사항

  • match 쿼리를 사용해서 검색하는 경우 Unique 토큰 필터를 적용한 필드는 텀의 개수가 1개로 되기 때문에 TF ( Term Frequency ) 값이 줄어들어 스코어 점수가 달라질 수 있음
  • match 쿼리를 이용해 정확도 ( Relevancy ) 를 따져야 하는 검색의 경우에는 Unique 토큰 필터는 사용하지 않는 것이 바람직

형태소 분석 ( Stemming )

  • 우리가 사용하는 언어들은 영어만 보더라도 문법에 따라 명사 뒤에 -s, -ness 등이 붙거나 동사 뒤에 -ing, -ed 등이 붙는 등 변화가 많음
    • 검색을 할 때는 보통 이런 문법에 따른 단어의 변형에 상관 없이 검색이 가능해야 하기 때문에 텍스트 데이터를 분석할 때 각각의 텀에 있는 단어들을 기본 형태인 어간을 추출하는 과정을 진행해야 함
    • 과정을 보통 어간 추출 또는 형태소 분석 이라고 하며 영어로는 Stemming 이라고 함
    • 그리고 형태소 분석을 하는 도구형태소 분석기, 영어로는 Stemmer 라고 함
  • Elasticsearch 에서는 다양한 형태소 분석기들을 지원하며 공식적으로 지원하지 않는 국가의 언어들도 플러그인 형태로 사용 가능하도록 오픈소스로 배포되는 분석기들이 많이 있음
    • Elasticsearch 에서 사용 가능한 형태소 분석기 중에서 가장 많이 알려진 형태소 분석 알고리즘Snowball한글 형태소 분석기Nori 에 대해 살펴볼 예정

Snowball

  • Snowball 은 2000년 경에 정보 검색의 선구자인 마틴 포터 박사가 개발하여 무료로 공개한 형태소 분석 알고리즘
    • 보통 -ing, -s 등을 제거하여 문장에 쓰인 단어들을 기본 형태로 변경
    • Elasticsearch 에서 Snowball애널라이저, 토크나이저, 토큰 필터가 모두 정의되어 있으며 사용 방법은 용자 정의 애널라이저 부분에 설명되어 있음

노리 (Nori) 한글 형태소 분석기

  • 한글은 형태의 변형이 매우 복잡한 언어
    • 특히 복합어, 합성어 등이 많아 하나의 단어도 여러 어간으로 분리해야 하는 경우가 많아 한글을 형태소 분석을 하려면 반드시 한글 형태소 사전이 필요
  • 오픈 소스 커뮤니티에서 개발되어 Elasticsearch 에서 사용 가능한 한글 형태소 분석기는 다음과 같은 것들이 존재
    • 아리랑 ( Arirang )
    • 은전한닢 ( Seunjeon )
    • Open Korean Text
  • 6.6 버전 부터 공식적으로 Nori (노리) 라고 하는 한글 형태소 분석기를 개발해서 지원을 하기 시작
    • 특이하게 Nori 는 프랑스 엔지니어인 Jim Ferenczi 에 의해 처음 개발이 되었음
      • Jim 은 아파치 루씬의 커미터이며 Elasticsearch 의 일본어 형태소 분석기인 Kuromoji (구로모지) 역시 Jim 이 처음 개발
    • Nori 는 은전한닢에서 사용하는 mecab-ko-dic 사전을 재 가공 하여 사용하고 있음
profile
🌱 Backend-Dev | hwaya2828@gmail.com

0개의 댓글