기록하는 습관

Elasticsearch (11) - 색인기 본문

개발/Elasticsearch

Elasticsearch (11) - 색인기

로그뉴 2022. 7. 13. 12:21

Tokenizer 

: 문장을 정해진 기준(공백 등)으로 분리하여 token을 생성하는 작업.

  1. nori tokenizer
    1. nori 형태소 분석기를 사용하는 토크나이저
  2.  whitespace
    1. 공백 기준으로 분리하는 토크나이저
  3.  keyword
    1. 입력된 문장이나 단어 그 자체를 토큰으로 만드는 토크나이저
  4.  standard
    1. lowercase + whitespace 를 수행하는 토크나이저 

Token Filter 

: Tokenizer로 분리된 token들을 원하는 형태로 가공하는 작업.  

# index 구성 

  1. nori_crawl, nori_crawl_hanspell
    1.  Tokenizer
      1. type: nori_tokenizer를 사용하여 nori 형태소 분석기로 토크나이징 진행
      2. user_dictionary: 사용자 사전을 정의했다. 
      3. decompound_mode: mixed로 설정을 하면, 복합어를 분석한 결과와 원래 결과를 함께 저장해준다.
    2.  filter
      1. nori_readingform: 한자를 한글로 바꿔주는 필터
      2. nori_posfilter: 원하는 품사만 걸러주는 필터
      3. lowercase: 소문자로 변환해주는 필터
      4. remove_duplicates: 중복 제거해주는 필터
    3.  char_filter:
      1. 전처리 필터로 , html_strip을 적용했다.
    4.  stopwords
      1. _korean_ : 한국어의 불용어를 처리해준다.
  2.   magic_khaiii, magic_khaiii_hanspell
    1. analyzer (space_analyzer) 
      1. tokenizer whitespace로 한 이유는 현재 khaiii가 ES에 내장되어 있지 않고 외부에 있기 때문에, khaiii를 거친 데이터가 다시 DB에 저장되고 ES로 색인된다. 따라서, 공백 기준으로 분리를 해야만 khaiii 형태소 분석을 적용한 색인을 할 수가 있다.
      2. filter lowercase로 둔 이유는, 한글에는 관계 없지만 영어가 들어왔을 때 소문자로 색인이 되어야 대/소문자 관계없는 색인이 가능하기 때문이다.
    2.  analyzer (keyword_trim)
      1. tokenizer keyword로 한 이유는 nickname은 형태소 분석을 하면 안되기 때문이고, 크롤링 데이터를 보면 양쪽 공백이 들어가 있기 때문에 ‘trim filter’를 통해서 제거해주기 위해 위와 같은 analyzer 구성을 했다.
    3. properties
      1. text type은 형태소 분석을 할 수 있는 타입으로, title, content 필드에 설정을 해주고 space_analyzer를 적용했다.
      2. nickname은 원래 keyword type으로 지정하고 analyzer를 사용하면 안되는데, 앞에서 말한 이유로 text type으로 설정한 후에 keyword_trim analyzer를 적용했다.
  3.  fscore_khaiii_multi
    1.  analyzer 
      1. space_analyzer
        1. 위와 동일
      2.  keyword_trim
        1. 위와 동일
      3. edge_analyzer
        1. whitespace tokenizer token을 생성한 후에, edge_ngram filter를 적용한다.
        2. 사용자 사전에 없는 단어를 잡기 위해 생각한 방법으로, 만약 “마술양품점은” 단어를 기준으로 edgeNgram을 적용한다면 ‘마술’, ‘마술양’, ‘마술양품’, ‘마술양품점’ 과 같이 분석될 것이다. 한글 특성상 조사 등은 단어 뒤에 붙기 때문에 edgeNgram을 적용했다.
    2. filter
      1. edgeNgram
        1. 한 글자까지 넣게 되면 색인된 데이터가 많아지게 되므로 min_gram 2로 설정했고, max_gram 10으로 설정했다.
    3. properties 
      1. multi_field를 사용하여 같은 데이터를 2가지 방법으로 색인해 field에 저장했다.
      2. title content에 대해 space_analyzer, edge_analyzer를 적용했다.
      3. nickname은 위와 동일하게 keyword_trim 분석기를 적용했다.
  4. autocomplete
    1.  index는 자동완성을 위한 인덱스이다. 티몬에서 개발한 코드를 이용해 플러그인을 만들었고, 해당 플러그인을 사용해 색인을 진행했다.
    2. analyzer 
      1. jamo_analyzer
        1. 자동완성을 위해 색인할 때 적용하는 분석기이다.
        2. keyword tokenizer를 사용하고, jamo_split, edge10Gram, lowercase filter를 적용한다.
        3. test
        4.  
        5. ‘자동완서’ 분석 시, ‘ㅈ’, ‘ㅈㅏ’, ‘ㅈㅏㄷ’… 이런 식으로 모두 색인이 된다.
      2. jamo_srch_analyzer
        1. 자동완성 검색할 때 사용하는 분석기이다.
        2. ‘자동완서’ 검색 시, jamo_srch_analyzer에 의해 ‘ㅈㅏㄷㅗㅇㅇㅘㄴㅅㅓㅇ’으로 분석된다. 
      3. chosung_analyzer
        1. 초성 색인을 위해 사용하는 분석기이다.
        2. ‘자동완서’ 색인 시, ‘ㅈ’, ‘ㅈㄷ’, ‘ㅈㄷㅇ’, ‘ㅈㄷㅇㅅ’이 색인된다.
      4.  chosung_srch_analyzer
        1. 초성검색 할 때 사용하는 분석기이다.
        2. ‘ㅈㄷㅇㅅ’ 검색 시, 그대로 검색해야 하므로 keyword 토크나이저를 사용한다.
      5.  fscore_khaiii_shinedge
        1. 정확도를 높이기 위해 고안된 색인 방법. 지금까지 space, edge,  title, content를 분석했지만 여전히 예외 케이스들과 구멍이 있었다. 
        2. analyzer 
          1. space_analyzer
            1. 위와 동일
          2. ngram_analyzer
            1. ngram tokenizer를 적용
          3. shingle_analyzer
            1. shingle tokenizer를 적용. shingle tokenizer는 단어별 ngram이라고 생각하면 된다. ngram은 단어 안에서 한글자 별로 분리하는 반면, shingle tokenizer는 단어별로 분리를 해준다.
          4. edge_analyzer
            1. 위와 동일
          5. shingle_edge_analyzer
            1. shingle filter를 적용후, edge_ngram filter를 적용했다. 

 

Comments