OpenSearch 개요
OpenSearch 개요
OpenSearch는 분산 검색·분석 엔진이에요. 웹사이트의 검색창부터 보안 데이터 분석까지 다양한 용도로 쓰이는데, "분산"이라는 말이 핵심이에요. 여러 컴퓨터에서 실행할 수 있고, 데이터를 넣으면 그 데이터를 검색하고 분석할 수 있죠. 데이터 종류가 뭐든 OpenSearch에 넣어서 저장하고 분석할 수 있어요.
출처: https://docs.opensearch.org/latest/getting-started/intro/
문서(Document)와 인덱스(Index)
OpenSearch는 정보를 JSON 형식의 문서(document) 단위로 저장해요. 전통적인 데이터베이스에서 한 행(row)이 문서 하나에 해당한다고 보면 돼요. 예를 들어 학교 데이터베이스에서 학생 한 명이 문서 하나예요.
{
"name": "John Doe",
"gpa": 3.89,
"grad_year": 2022
}
**인덱스(index)**는 문서의 모음이에요. 데이터베이스의 테이블에 해당하죠. 검색하면 인덱스에 담긴 데이터를 조회하게 돼요.
클러스터와 노드, 샤드
OpenSearch는 하나 이상의 노드(데이터를 저장하고 검색 요청을 처리하는 서버)에서 실행되도록 설계됐어요. 노드들의 모임이 클러스터예요. 랩톱에서 로컬로 실행해도 되고, 데이터센터의 수백 대 머신으로 확장할 수도 있어요.
각 클러스터에는 클러스터 단위 작업(예: 인덱스 생성)을 조율하는 클러스터 매니저 노드가 하나 선출돼요. 노드끼리 통신해서, 요청이 특정 노드로 가면 그 노드가 다른 노드에 요청을 보내고 결과를 모아 최종 응답을 돌려줘요.
인덱스는 **샤드(shard)**로 나뉘어요. 각 샤드는 인덱스의 전체 문서 중 일부를 저장하죠. 예를 들어 400GB 인덱스 한 개가 너무 크다면, 40GB 샤드 10개로 나눠 10개 노드에 분산할 수 있어요. 각 샤드는 사실상 완전한 Lucene 인덱스라서 CPU와 메모리를 소비하는 프로세스예요. 따라서 샤드가 많다고 무조건 좋은 건 아니에요. 경험상 샤드 크기는 10~50GB로 제한하는 게 권장돼요.
각 샤드는 데이터의 원본인 프라이머리(primary) 샤드이거나, 그 복사본인 레플리카(replica) 샤드예요. 기본적으로 프라이머리마다 레플리카가 하나씩 만들어져요. 레플리카는 노드 장애 시 백업 역할을 하면서도 검색 요청 처리 속도도 높여줘요.
역색인(Inverted index)
OpenSearch의 인덱스는 역색인이라는 자료구조를 사용해요. 단어가 어느 문서에 등장하는지 매핑해 두는 거예요. 예를 들어 "Beauty is in the eye of the beholder"와 "Beauty and the beast" 두 문서가 있다면, 역색인은 각 단어가 어느 문서에 있는지 표로 보여줘요. 여기서 Beauty가 소문자 beauty로 저장되는 걸 볼 수 있는데, 기본 분석기(standard analyzer)가 모든 텍스트를 소문자로 만들기 때문이에요. 그래서 검색이 대소문자 구분 없이 동작해요.
관련도(Relevance) 점수
검색하면 각 문서는 쿼리와 얼마나 잘 매칭됐는지를 나타내는 관련도 점수를 받아요. 개별 검색어(term)는 대략 다음 규칙으로 점수가 매겨져요.
- 문서에서 자주 등장하는 검색어일수록 점수가 높아요 (term frequency)
- 더 많은 문서에 등장하는 검색어일수록 점수가 낮아요 (inverse document frequency)
- 긴 문서의 매치일수록 짧은 문서의 매치보다 점수가 낮아요 (length normalization)
OpenSearch는 BM25 랭킹 알고리즘으로 관련도 점수를 계산하고, 결과를 관련도순으로 정렬해 돌려줘요.