text analysis와 elasticsearch settings 설정하기

쭈·2022년 12월 18일
0

Elasticsearch 적용기

목록 보기
2/3

1. 엘라스틱서치의 analyzer 역할

엘라스틱서치에서 분석기는 index timesearch time(query time)에 동작한다.

  • index time: document가 색인될 때, text 타입의 필드 값이 분석됨
    ex) The QUICK brown foxes jumped over the dog!
    -> [ quick, brown, fox, jump, over, dog ]

  • search time: text 타입 필드 기반으로 full text 쿼리를 날렸을 때, 사용자가 검색한 단어가 분석됨
    ex) "Quick fox" -> [quick, fox]

분석기는 각각 index analyzer, search anlyzer라고 불린다. 보통 같은 형태의 토큰으로 분석하기 위하여 index와 search를 같은 anlyzer로 설정하여 사용한다.

그렇다면 어떤 경우에 별도의 검색 분석기를 사용해야할까?

예를 들어 필드에 Apple이라는 값이 있을 때 [ a, ap, app, appl, apple] 형태로 인덱싱된다.
이때 사용자가 "appli"를 검색하면 이 값 또한 [ a, ap, app, appl, appli ] 형태로 인덱싱되기 때문에 appl로 시작하는 apple이라는 값이 결과에 포함된다.
(심지어 a로 시작하는 모든 단어까지)

하지만 사용자는 "appli"로 시작하는 단어만을 검색하고 싶다면 query 분석기를 별도로 설정하여 [appli]형태의 단일토큰을 인덱싱할 수 있도록 해야한다.

2. text analysis (텍스트 분석)

텍스트를 분석하기 위해 엘라스틱서치에서 제공하는 analyzer는 character filter, tokenizer, token filter로 구성된다.

character filter

tokenizers의 전단계로써, 기존에 입력한 단어가 공백처리되거나 특수문자가 제거되는 등의 역할을 한다.
(커스텀가능)

분석기는 하나 이상의 character filters를 가질 수 있고, 없을 수 있다. 만약 복수개의 필터를 가질 경우 settings에 작성된 순서되로 필터링된다.

  • Mapping Character Filter

tokenizer

토크나이저로 들어온 텍스트는 각각의 토큰으로 분리되어 저장된다.
ex) "Quick brown fox!" -> ["Quick", "brown", "fox!"]

반드시 하나의 토크나이저를 가지고 있어야한다.

  • Pattern Tokenizer

token filter

분석기는 하나 이상의 token filters를 가질 수 있고, 없을 수 있다. 만약 복수개의 필터를 가질 경우 settings에 작성된 순서되로 필터링된다.

  • LowerCase Token Filter
  • Stop Token Filter (불용어)

3. 예제) 자동완성 구현하기

https://www.elastic.co/guide/en/elasticsearch/reference/current/search-suggesters.html

Completion Suggest Api를 활용한 자동완성
1. Prefix Queries를 활용한 자동완성
2. Index 색인을 통한 Search

첫번째는 입력된 단어의 앞글자가 일치하면 검색결과에 나온다.

내가 원하는건 자소분리

현재 nori형태소 분석기만 설정해둔 상태이다.

{
  "analysis":{
    "tokenizer":{
      "nori_user_dict":{
        "type":"nori_tokenizer",
        "decompound_mode":"mixed"
      }
    },
    "analyzer":{
      "nori_analyzer":{
        "type":"custom",
        "tokenizer":"nori_user_dict"
      }
    },
    "filter": {
      "nori_posfilter": {
        "type": "nori_part_of_speech",
        "stoptags": [
          "E",
          "IC",
          "J",
          "MAG",
          "MM",
          "NA",
          "NR",
          "SC",
          "SE",
          "SF",
          "SH",
          "SL",
          "SN",
          "SP",
          "SSC",
          "SSO",
          "SY",
          "UNA",
          "UNKNOWN",
          "VA",
          "VCN",
          "VCP",
          "VSV",
          "VV",
          "VX",
          "XPN",
          "XR",
          "XSA",
          "XSN",
          "XSV"
        ]
      }
    }
  }
}

커스텀한 anaylzer가 없으면 text는 기본적으로 standard anlyzer로 색인되는데 토크나이저 필터에서 불용어, lowercase, whitespace로 색인된다.

나는 nori를 설치하고, 불용어 필터를 추가적으로 기입했기 때문에 형태소 분석과 불용어 처리만 되는 상태이다.

ngram filter를 추가로 사용하여 자동완성 키워드 기능을 구현하려고 한다.

mapping settings 설정

결과


https://www.elastic.co/guide/en/elasticsearch/reference/current/analyzer-anatomy.html

profile
🌱

0개의 댓글