Data Engineering/Distributed System

[OpenSearch] - 1. OpenSearch 구조와 동작방식 알아보기 & CRUD 등 여러 동작 실습하기

cstory-bo 2024. 1. 4. 15:22

OpenSearch 구성 요소

opensearch는 RDBMS와 사용하는 용어가 다르다.

테이블 -> 인덱스
레코드 -> 도큐먼트
컬럼 -> 필드
스키마 -> 매핑

인덱스란 말이 어색할 수도 있는데,
RDBMS에서 인덱스는 보통 빠른 검색을 위해 유니크한 값을 주는 것이었다면,
여기서는 테이블과 같은 데이터들이 모여있는 것을 말하며

인덱싱은 검색 엔진에서 빠른 검색을 위해 데이터를 구조화하는 방법을 말한다. 그래서 데이터가 들어오면 인덱싱을 한 후에 인덱스에 저장된다.

그리고 이 인덱싱 전에 매핑이 일어난다. 매핑 정의에 따라 입력받은 도큐먼트를 OpenSearch가 이해할 수 있는 데이터 구조로 변환하는 과정이다. 어떤 타입들이 있는지는 공식문서에서 확인 가능하다.

 

OpenSearch documentation

Documentation for OpenSearch, the Apache 2.0 search, analytics, and visualization suite with advanced security, alerting, SQL support, automated index management, deep performance analysis, and more.

opensearch.org

명시적 매핑다이나믹 매핑 두 가지의 매핑 방식이 있다.

명시적 매핑은 사용자가 직접 데이터 타입을 정의하는 것이고
다이나믹 매핑은 OpenSearch가 자동으로 필드의 데이터 타입을 정의하는 것이다.

도큐먼트는 인덱스에 저장되는 문서 단위로 JSON 형식이며 고유ID를 사용하여 식별한다.

 

환경 세팅

이전 글을 참고한다.

2023.12.27 - [Data Engineering/Distributed System] - EFK(ELK) 구축 해보기!! (서버 로그 수집) - 4. OpenSearch와 Open Dashboard 설치하기

 

EFK(ELK) 구축 해보기!! (서버 로그 수집) - 4. OpenSearch와 Open Dashboard 설치하기

우선 Fluentd를 진행 중이선 서버1은 놔두고 서버2로 들어간다. Fluentd에서 OpenSearch로 로그를 보내려면 서버 2에 OpenSearch가 설치되어있어야 하기 때문에 서버2에 OpenSearch 설치와 함께 Dashboard까지 설

cstory-bo.tistory.com

그리고 크롬 확장프로그램인 Elasticvue에 Opensearch 서버를 연동하여 쉽게 정보를 확인하고 REST로 request를 보낼 수 있다.

https://chromewebstore.google.com/detail/hkedbapjpblbodpgbajblpnlpenaebaa

 

Elasticvue

Elasticsearch frontend

chrome.google.com

 

직접 curl로 요청을 날려보고 싶어서 Elasticvue가 아닌 cli로 진행했다.

편의를 위해 환경변수를 지정하고 진행했다.

export OPENSEARCH_REST_API=http://{public ip 주소}:9200

인덱스 생성

curl -XPUT $OPENSEARCH_REST_API/{인덱스명}

인덱스 확인

curl --head $OPENSEARCH_REST_API/{인덱스명}

위의 명령어로 인덱스의 유무를 확인할 수 있다.

인덱스 조회

GET으로 movie 인덱스 정보를 조회한다.

curl -XGET "$OPENSEARCH_REST_API/{인덱스명}?pretty=true"

명시적 Mapping 

매핑 후 인덱스를 다시 조회하면 매핑 정보도 같이 뜬다.

필드 추가

PUT으로 새로운 매핑을 넣어준다.

그리고 다시 조회해보면 업데이트 된 것을 확인할 수 있다.

keyword 타입

계속해서 text와 keyword 타입 비교가 나올거지만,
간단하게 말하자면 나중에 검색 시, keyword는 해당 단어 전체를 이용하여 저장하고 검색한다.
한마디로 romantic이라는 정보가 keyword 타입으로 저장됐다면 rom으로 검색 불가하다는 것이다.
하지만 이러한 방식은 text보다 검색속도가 빠르다는 장점이 있으며
주의 사항으로는 keyword는 cardinality에 취약하기에 조심해야한다.

필드타입 변경 불가

PUT으로 다시 다른 타입으로 필드 타입을 수정하려고 하면 400에러가 발생한다.
opensearch에서 필드타입을 변경하고 싶으면, 새로운 인덱스를 만들거나 reindex API를 사용해야한다.

Document 생성

curl -XPOST "$OPENSEARCH_REST_API/movie/_doc?pretty=true" \
  -H "Content-Type: application/json" \
  -d '
{
  "title": "Love Actually",
  "genre": "Drama"
} '

Opensearch는 nullable이기 때문에 꼭 title genre 모두 넣지 않아도 된다.

특정 Document 정보 확인

/{index}/_doc/{_id} 로 _id의 document 정보를 확인할 수 있다.

다이나믹 mapping

매핑 정보로 주지 않았던 필드로 데이터를 입력하면 자동으로 다이나믹 mapping이 일어난다.

확인해보면 

"director" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        }

이렇게 text와 keyword type이 둘다 생겼다. 다이나믹 매핑 시 문자열로 입력하면 이렇게 두 가지 모두 생긴다.

문자열이 아니라 숫자로도 다이나믹 매핑이 가능하다.

데이터 타입을 잘못 입력한 도큐먼트

만약 string 타입으로 지정한 필드에 숫자로 데이터를 넣게되면
자연스럽게 string 타입으로 형변환하여 값이 들어간다.
하지만 GET으로 값을 확인하면 따옴표 없이 출려된다.

아래 이미지에서 rate를 보면 알 수 있다.

Search

/{index}/_search&q={query} 로 찾는다.
/{index}/_search 여기까지만 하면 해당 인덱스의 모든 document들을 조회할 수 있다.

Update

document를 수정하고 싶으면 post를 이용한다.

/{index}/_update/{id} 코맨드로 업데이트한다.

*데이터를 추가하고 싶어도 update로 넣어줘야한다. 만약 put으로 넣으면 해당 데이터로 덮어씌워져서 기존 값이 없어진다.

rate2와 genre, rank를 업데이트 했더니
조회하니까 덮어씌워진 것이 아니라 기존에 있던 director 데이터도 남아있었다.

 

Delete

DELETE로 /{index}/_doc/{_id} 로 document를 삭제한다.

Close & OPEN

POST /{index}/_close 로 인덱스를 닫을 수 있으며
POST /{index}/_open 으로 열 수도 있다.

닫는 다는 것은 삭제처럼 조회, 검색, 변경 등 안되지만 
삭제와는 다르게 다시 열면 돌아온다. 닫게되면 힙 메모리에 로드되지 않아 오버헤드를 주지 않아 성능을 높여준다.

BULK 로 대량의 도큐먼트 생성, 수정, 삭제

인덱싱 성능을 높이기 위해 bulk api를 사용할 수도 있다.

한 번의 요청으로 다량의 document들을 생성, 수정, 삭제하여 네트워크 오버헤드를 줄이고, 더 많은 인덱싱 throughput을 확보할 수 있다.

각 요청별로 성공할 수도 실패할 수도 있기에 응답메시지를 잘 확인해야한다.