본문 바로가기

프로젝트/여행지 오픈 API

[ElasticSearch] 1. 도큐먼트와 인덱스

목차

    엘라스틱 스택 도서 1회차

    사전 지식

    엘라스틱 서치

    엘라스틱 서치 = 검색엔진 + 데이터베이스

    엘라스틱서치는 NoSQL과 유사하다고 생각하면 이해가 편할 것이다.

    엘라스틱 서치는 인덱싱 시점에서 분석을 거쳐 단어 단위로 분해된다.

    • 스코어링 : 유사도 점수 기반 스코어링을 통해 유사 검색어를 분류 가능
    • 분산 시스템과 클러스터링 : 여러 엔진을 클러스터링, 하나가 다운되어도 여분의 기능이 동작 가능
    • DSL 쿼리 채용 : JOIN 쿼리가 사실상 어려움, 반정규화를 기본으로 함
    • 인덱스가 불변하기에, 삭제 등 비용이 비싸다.

    하지만 이는 빠른 검색을 위한 것으로, 대용량 데이터에 대해 빠른 검색과 집계를 제공한다는 장점과 trade-off 된 것이다.

    키바나(Kibana)

    엘라스틱 서치의 시각화 도구. UI를 담당

    로그와 데이터들을 차트 등의 시각화 요소등으로 빠르게 제공한다.

    로그스태시(LogStash), 비츠 : 이벤트 수집과 정제를 위한 도구

    • Selenium과 로그스태시 차이
      1. 데이터 출처:
        • Selenium은 웹 페이지에서 데이터를 직접 스크래핑한다.
        • 로그스태시는 서버 로그, 이벤트 데이터 등을 다룬다.
      2. 데이터 형태:
        • Selenium은 보통 정형화되지 않은 데이터를 수집한다 (예: 웹 페이지의 텍스트, 이미지 등).
        • 로그스태시는 대체로 정형화된 로그 데이터나 이벤트 데이터를 수집한다.
      3. 복잡성과 세분화:
        • Selenium을 사용하면 웹 스크래핑 로직을 자세하게 커스터마이즈 할 수 있다.
        • 로그스태시는 데이터 파이프라인을 구성하므로 더 간단하고 일관된 방식으로 데이터를 수집하고 처리할 수 있다.
      4. 성능과 리소스:
        • Selenium은 웹 브라우저를 실제로 조작하기 때문에 리소스 사용이 상대적으로 높을 수 있다.
        • 로그스태시나 비츠는 경량화되어 있고, 리소스 사용이 효율적이다.
      5. 실시간 처리:
        • 로그스태시는 실시간 또는 거의 실시간으로 데이터를 수집, 처리할 수 있다.
        • Selenium은 스크래핑 자체가 일정 시간이 소요될 수 있으므로 실시간 처리에는 한계가 있다.
        따라서 사용하는 도구는 수집하려는 데이터의 종류, 필요한 처리 레벨, 성능 등에 따라 달라질 수 있다. 자체 스크래핑을 할 경우 더 세밀한 컨트롤이 가능하지만, 로그스태시나 비츠를 사용하면 표준화된 방법으로 빠르고 효율적으로 데이터를 수집할 수 있다.
    • Selenium 등으로 데이터 스크래핑을 하는 방식과 로그스태시를 사용하는 방식은 여러 면에서 다르다.

    간단한 설정으로 로그를 가공해서 유의미한 데이터로 수집

    비츠의 경우 경량 수집기로, 가볍고 부담 없이 간단한 정보를 수집하는데 유용하다.

    실습, 준비 작업 : 엘라스틱 서치 요청과 응답

    ES 역시도 기존 HTTP처럼 REST API를 베이스로 한다.

    간단하게 GET, POST로 요청하고 응답을 해 보자.

     

     

    기본 GET 예제 테스트 : curl -X GET "localhost:9200"

    POST의 경우 우분투 위에서 curl을 사용하여 간단하게 보내볼 수도 있다.

    JSON 메시지 타입을 잘 따를 것. 내용 자체는 Postman 등에서 항상 보았던 규격과 유사하다.

    curl -X POST "http://localhost:9200/{인덱스명}/_doc" -H "Content-Type: application/json" -d '{
      "필드명1": "값1",
      "필드명2": "값2",
      ...
    }'
    
    //혹은 사용자 아이디를 저장하려면
    curl -X POST "http://localhost:9200/test_idx/_doc/{사용자_지정_ID}" -H "Content-Type: application/json" -d '{
      "name": "sch",
      "content": "my first elastic search POST"
    }'

    curl -X POST "[http://localhost:9200/test_idx/_doc](http://localhost:9200/%7B%EC%9D%B8%EB%8D%B1%EC%8A%A4%EB%AA%85%7D/_doc)" -H "Content-Type: application/json" -d '{ "name": "sch", "content": "my first elastic search POST" }'

     

     

    인덱스와 도큐먼트

    ES에서 인덱스와 도큐먼트는 중요하다.

    인덱스는 도큐먼트를 저장하는 구분자이며, 도큐먼트는 실제 저장 단위이다.

     

    도큐먼트

    도큐먼트는 데이터의 기본 저장 단위로, Json형태이며 하나의 도큐먼트는 여러 필드와 값을 가진다.

    다음 형태의 데이터가 있다 가정해보자.
    name: mike
    age: 25
    gender: male 

    일반적인 RDBMS는 다음과 같은 SQL문처럼 저장할테지만, json은 늘 봤던 것처럼 키밸류쌍으로 저장된다.

    CREATE TABLE member (
        uid int not null AUTO_INCREMENT PRIMARY KEY,
        name varchar(50) not null,
        age int not null,
        gender varchar(6) not null
    );
    
    INSERT INTO member (name, age, gender) values ("mike", 25, "male");
    
    ////
    
    {
        "name" : "mike",
        "age" : 25,
        "gender" : "male"
    }

    RDBMS와의 비교

    MySQL 엘라스틱서치
    테이블 인덱스
    레코드 도큐먼트
    컬럼 필드
    스키마 매핑

     

    실습(도큐먼트)

    도큐먼트는 반드시 하나의 인덱스에 포함되어야 한다. 엘라스틱에서 도큐먼트를 인덱스에 포함시키는 것을 인덱싱이라고 한다.

    //도큐먼트 인덱싱 예시.
    //index2 : 인덱스 이름
    //_doc : 엔드포인트 구분을 위한 예약어
    //1 : 인덱스 ID, 미입력의 경우 자동 ID 생성 / 중복 id 입력시 새로운 도큐먼트로 덮여쓰여짐
    PUT index2/_doc/1
    {
        "name" : "mike",
        "age" : 25,
        "gender" : "male"
    }

    이렇게 넣은 이후 GET index2 로 조회해보면 다음과 같이 도큐먼트가 적용된 모습을 확인할 수 있다.

     

     

    인덱스

    도큐먼트를 저장하는 논리적 단위, 테이블과 유사한 개념

    하나의 인덱스는 여러 개의 도큐먼트를 포함할 수 있으며, 각 도큐먼트는 JSON 형식으로 저장된다. "인덱스 스키마" 또는 "매핑"을 통해 각 도큐먼트의 구조와 사용될 필드의 타입을 정의한다.

    일반적으로 스키마에 따라 인덱스를 구분한다. 인덱스 스키마는 매핑을 통해 정의된다.

    예시:
    상품 정보를 저장하는 온라인 쇼핑몰을 생각해보자.

    • "상품"이라는 인덱스를 생성한다.
    • 각 상품은 도큐먼트로 저장되며, 각 도큐먼트는 상품의 이름, 가격, 설명, 카테고리 등의 정보를 포함한다.
    • "상품" 인덱스의 매핑을 통해, "이름"은 문자열 타입, "가격"은 숫자 타입으로 정의된다.

    이렇게 인덱스, 도큐먼트, 매핑의 개념을 활용하여 엘라스틱서치에서 다양한 데이터를 효과적으로 저장하고 검색할 수 있다.

    실습(인덱스 CRUD)

     

    키바나 웹에서 Dev Tools를 통해 콘솔로 테스트를 해볼 수 있다.

    인덱스를 생성해보자.

     

     

    GET _cat/indices 를 통해 넣은 인덱스를 확인할 수 있다.

     

     

    PUT index1
    //
    GET index1
    //결과
    {
      "index1" : {
        "aliases" : { },
        "mappings" : { },
        "settings" : {
          "index" : {
            "routing" : {
              "allocation" : {
                "include" : {
                  "_tier_preference" : "data_content"
                }
              }
            },
            "number_of_shards" : "1",
            "provided_name" : "index1",
            "creation_date" : "1698048027731",
            "number_of_replicas" : "1",
            "uuid" : "wmr9wi7mQ5mON9mmI_I06Q",
            "version" : {
              "created" : "7110299"
            }
          }
        }
      }
    }
    //삭제
    DELETE index1