Cloud/ElasticSearch

[실습] Elasticsearch로 inverted index 추출하기, reindex 하기

y-seo 2023. 12. 29. 11:21

실습 개요

목적 : 데이터셋에 검색을 했을 때 내가 원하는 내용만 나올 수 있도록 튜닝하기

제목 : Elasticsearch를 사용하여 데이터로부터 적절한 inverted index를 추출한다.

 

1. Elasticsearch에 data 넣기

(1) Elasticsearch에 로그인한다.

(2) Machine Learning > File 에 접근하여 데이터를 import한다.

(3) Discover 메뉴에서 방금 추가한 데이터셋을 선택하면 내용을 볼 수 있다.

 

2. Inverted Index 확인해보기

(1) DevTools > Console에 접근한다.

(2) analyze API를 이용해 테스트한다.

POST /_analyze
{
  "text" : "The quick brown fox jumps over the lazy dog",
  "analyzer" : "standard"
  
}

원본 텍스트를 standard라는 analyzer에 통과시켰을 때 term(token)들이 생성된다. 이런 term들에 추후 doc ID가 붙는다.

 

3. 여러 가지 Built-in Analyzer 사용하기

(1) english analyzer 사용하기

POST _analyze
{
  "text": "The quick brown fox jumps over the lazy dog",
  "analyzer": "english"
}

  • 순서대로 token이 만들어지지 않는다.
  • the 같이 사람들이 안할 것들은 token에 포함시키지 않는다. → 저장공간이 절약된다.
  • 영어를 대상으로 analyzer한다.
  • 복수형도 기본형으로 바꾸어 token으로 뽑는다. → 진행형, 과거형도 마찬가지이다. (Ex. jump)
    • 활용형이 기본형과 다른 단어들도 시스템 내에 그 규칙과 예시가 저장되어 있으므로 검색에 문제가 없다. (Ex. buy)

(2) Tokenizer와 Token Filter 지정하기

POST _analyze
{
  "text": "The quick brown fox jumps over the lazy dog",
  "tokenizer" : "standard",
  "filter" : [
    "lowercase", "stop"
    ]
}

(3) Nori Analyzer 사용하기

POST _analyze
{ 
  "text" :"인생 최고의 영화",
  "analyzer" : "nori"
}

만약 Error가 난다면 Nori plug-in을 elasticsearch 페이지 설정에서 설치해주어야 한다.

(4) nori 관련 tokenizer, filter 지정하기

POST _analyze
{
  "text": "사천만 國民이 다 봐야 하는 영화 입니다. ",
  "tokenizer": "nori_tokenizer",
  "filter": [
    "nori_part_of_speech","nori_readingform","nori_number"
    ]
}

nori_tokenizer은 한글을 token으로 분리한다. (현재로서는 유일하다.)

nori_part_of_speech는 한글 한정으로 불용어(Ex. 조사, 부사)를 제거한다.

nori_readingform은 한자를 한글로 바꾼다.

nori_number은 숫자를 읽은 한글을 숫자로 바꾼다.

(5) nori_tokenizer의 옵션 사용하기

DELETE nori_sample
PUT nori_sample
{
  "settings": {
    "index": {
      "analysis": {
        "tokenizer": {
          "nori_user_dict": { //tokenizer custom
            "type": "nori_tokenizer", //기존에 있는 것을 가져오기
            "decompound_mode": "mixed", //option
            "discard_punctuation": "false", //option
            "user_dictionary_rules": ["세종시 세종 시"] //추가 rule 등록, 사용자 정의 사전
           }
        },
        "analyzer": {
          "my_analyzer": { //analyzer name
            "type": "custom",
            "tokenizer": "nori_user_dict" //tokenzier name
          }
        }
      }
    }
  }
}

GET nori_sample/_analyze
{
  "analyzer": "my_analyzer",
  "text": "세종시."  
}

. token은 필요 없으므로 수정한다. discard_punctuation을 true로 한다.

(6) nori filter의 option 지정하기

 

DELETE nori_sample
PUT nori_sample
{
  "settings": {
    "index": {
      "analysis": {
        "tokenizer": {
          "nori_user_dict": {
            "type": "nori_tokenizer",
            "decompound_mode": "mixed",
            "discard_punctuation": "false",
            "user_dictionary_rules": ["세종시 세종 시"]
          }
        },
        "filter": {
          "my_posfilter": {
            "type": "nori_part_of_speech",
            "stoptags": [
              "NR"   
            ]
          }
        },
        "analyzer": {
          "my_analyzer": {
            "type": "custom",
            "tokenizer": "nori_user_dict",
            "filter": [
              "my_posfilter"
            ]
          }
        }
      }
    }
  }
}

GET nori_sample/_analyze
{
  "analyzer": "my_analyzer",
  "text": "여섯 용이 세종시를 떠났다."  
}

 

3. reindex 하기

reindex란 말그대로 인덱싱을 새로 한다는 뜻으로, 기존의 인덱스에서 새로운 인덱스로 새롭게 데이터를 색인하는 것이다.

(1) Devtools의 console에서 아래 코드를 실행한다.

DELETE nori_sample
PUT nori_sample
{
  "settings": {
    "index": {
      "analysis": {
        "tokenizer": {
          "nori_user_dict": {
            "type": "nori_tokenizer",
            "decompound_mode": "mixed",
            "discard_punctuation": "false",
            "user_dictionary_rules": ["세종시 세종 시"]
          }
        },
        "filter": {
          "my_posfilter": {
            "type": "nori_part_of_speech",
            "stoptags": [
              "NR"   
            ]
          }
        },
        "analyzer": {
          "my_analyzer": {
            "type": "custom",
            "tokenizer": "nori_user_dict",
            "filter": [
              "my_posfilter"
            ]
          }
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "document" : {
        "type": "text",
        "analyzer": "my_analyzer"
      }
    }
  }
}

POST _reindex
{
  "source": {
    "index": "ratings_train"
  },
  "dest": {
    "index": "nori_sample"
  }
}

(2) Discover 에서 Create a data view 를 클릭한다.

(3) 방금 생성한 index를 불러온다.

(4) 아래와 같이 검색 결과를 볼 수 있다.