ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Elastic Search에 대한 고찰
    카테고리 없음 2022. 4. 19. 22:26

    ElasticSearch?


    Elastic Search는 Java 기반의 오픈소스 분산 검색 엔진이다.

    분산형 RESTful 검색 및 분석 엔진으로  Elastic Search를 단순히 검색엔진으로 단독으로 사용하는 경우도 있고, ELK Stack을 구성하여 사용이 되기도 한다.

     

    ELK 스텍이란

    • Logstash: DB, csv 파일 등의 로그 또는 트랜잭션 데이터를 수집, 가공 해서 Elastic Search로 전달한다.
    • ElasticSearch: Logstash로 부터 받은 데이터를 받거나 RESTful API 를 통해 데이터를 받아서 적재한다.
    • Kibana: 데이터를 시각화 및 모니터링 해주는 시스템 이다.

    다음과 같이 구분이 된다.

     

    출처 https://www.edureka.co/blog/elk-stack-tutorial/

    ElasticSearch VS RDB


    RDB는 ROW 형식으로 데이터를 저장한다. 엘라스틱서치는 단어를 기반으로 데이터를 저장한다.

    단어를 기반으로 데이터를 저장하는게 뭘까? 이는 역 인덱스 (inverted index) 형식으로 데이터를 저장한다.

    일단 index와 inverted index의 차이가 뭐냐 하면 책 맨 앞에 있는 목차가 index이고, 책 맨 뒤에 키워드를 통해 찾아볼 수 있도록 있는 것이 inverted index이다.

     

    index 출처: https://victorydntmd.tistory.com/308
    inverted index 출처: https://victorydntmd.tistory.com/308

    위에서 말했듯이 Elastic Search는 텍스트 방식으로 저장을 하는데 그 방법이 텍스트를 파싱해서 검색어 사전을 만든 다음 inverted index 방식으로 저장을 한다. 

    예를 들어 "I Learn Elastic Search and Node.js" 이 문장을 전부 파싱 한 다음 (I, Learn, Elastic, Search, ...) 단어를 저장한다.

    대문자는 소문자 처리, 유사어 체크 등의 작업을 통해 텍스트를 저장한다. 이 덕에 RDBMS 보다 성능이 빠를 수 밖에 없다.

     

    또한 용어 부분에서도 조금 차이가 있다.

    출처: https://www.slideshare.net/deview/2d1elasticsearch

     

    ElasticSearch 의 데이터 모델링


    기본적으로 RDBMS에서 테이블에 어떤 속성이 들어가고 어떤 필드를 사용하는지 정의를 한다.

    이와 동일하게 ElasticSearch에도 각 컬럼에 어떤 데이터가 들어갈지 데이터 타입을 정의를 해줘야한다.

     

    만약에 타입을 명시를 하지않으면 스키마리스 기능을 통해 자동으로 컬럼에 데이터 타입을 매핑하여 자동으로 생성이 되긴한다.

    하지만 잘못된 타입이 매핑될 수 있기에 지정을 해주는 것이 좋다.

     

    매핑 인덱스 생성

    PUT /users
    {
      "mappings": {
        "properties": {
          "userUuid" : {
            "type": "keyword"
          },
          "userName" : {
            "type": "text"
          },
          "userAge" : {
            "type": "integer"
          },
          "userEmail" : {
            "type": "keyword"
          }
        }
      }
    }

    위와같이 요청을 보내면 인덱스는 아래와 같이 생성된다.

    uuid userUuid keyword
    이름 userName text
    나이 userAge integer
    이메일 userEmail keyword

    인덱스가 제대로 생성이 되었는지 확인을 해보려면 다음과 같이 요청 하면 된다.

    GET /users/_mapping
    {}
    
    # 실행 결과
    {
      "users" : {
        "mappings" : {
          "properties" : {
            "userAge" : {
              "type" : "integer"
            },
            "userEmail" : {
              "type" : "keyword"
            },
            "userUuid" : {
              "type" : "keyword"
            },
            "userName" : {
              "type" : "text"
            }
          }
        }
      }
    }

     

    매핑 파라미터

    매핑 파라미터는 색인될 필드의 데이터를 어떻게 지정할것인지에 대한 옵션을 제공한다.

     

    - anlayzer

    - normalizer

    - coerce

    - copy_to

    - enabled

    - search_analyzer

    댓글

Designed by Tistory.