Elasticsearch 인덱스는 무엇인가요?

기술 세계에서 인덱스라는 용어는 상당히 과부하가 걸려 있습니다. 대부분의 개발자에게 인덱스가 무엇인지 물어보면, 일반적으로 표와 관련된 관계형 데이터베이스(RDBMS)의 데이터 구조를 언급하며, 인덱스를 통해 데이터 검색 작업 속도가 향상된다고 합니다.
그렇다면 Elasticsearch® 인덱스란 무엇일까요? Elasticsearch 인덱스는 문서 모음을 보유하는 논리적 네임스페이스로, 각 문서는 필드의 모음이며, 필드는 다시 데이터를 포함하는 키-값 쌍으로 구성됩니다.
Elasticsearch 인덱스는 관계형 데이터베이스와 어떻게 다를까요?
Elasticsearch 인덱스는 관계형 데이터베이스에서 찾아볼 수 있는 인덱스와 다릅니다. Elasticsearch 클러스터를 표로 간주할 수 있는 많은 인덱스를 포함할 수 있는 데이터베이스로 생각해 보세요. 각 인덱스 내에는 많은 문서가 있습니다.
- RDBMS => 데이터베이스 => 표 => 열/행
- Elasticsearch => 클러스터 => 인덱스 => 샤드 => 키-값 쌍이 있는 문서
Elasticsearch는 JSON 문서를 저장하지만, 인덱스에 입력하는 내용은 매우 유연합니다. 사용 가능한 수많은 통합 및 Beats를 사용하여 빠르게 시작하고 실행할 수 있습니다. 또는 조금 더 나아가서 인제스트 파이프라인 또는 Logstash®를 사용하여 수많은 프로세서와 플러그인의 도움을 받아 자체 ETL 프로세스를 정의할 수도 있습니다.
관계형 데이터베이스와의 또 다른 차이점은 사전 스키마 정의 없이도 데이터를 가져올 수 있다는 점입니다. 동적 타입은 빠르게 시작하거나 문서의 예상치 못한 필드를 고려하는 데 아주 좋습니다. 그리고 설정이 끝나면 고정 스키마로 전환해 성능을 향상할 수 있죠.
런타임 필드는 읽기나 쓰기 시 스키마를 수행할 수 있게 해주는 또 다른 흥미로운 기능입니다. 기존 문서에 추가하여 새 필드를 도출하거나, 쿼리 시점에 런타임 필드를 생성할 수도 있습니다. 문서 소스를 읽을 수 있으며 스크립트를 이용한 계산된 값으로 생각하면 됩니다.
지금 Elasticsearch와 관계형 데이터베이스의 차이점을 알아보세요. 지금 바로 Elastic Cloud 체험판 계정으로 무료로 사용해 보세요.
Elasticsearch의 사용자 친화적인 API와 데이터가 상호작용하는 방법
Elasticsearch는 문서 데이터와 상호작용하기 위한 RESTful JSON 기반 API를 제공합니다. 적절한 클러스터 엔드포인트에 HTTP 요청을 전송하여 문서를 색인, 검색, 업데이트 및 삭제할 수 있습니다. 이러한 CRUD와 유사한 작업은 개별 문서 수준 또는 인덱스 수준 자체에서 수행할 수 있습니다. 원하는 경우, 직접 REST 대신 사용할 수 있는 언어별 클라이언트 라이브러리도 있습니다.
다음 예제에서는 1의 document_id가 할당된 playwrights라는 인덱스에 문서를 만듭니다. 스키마나 선행 구성을 만들 필요가 없습니다. 데이터를 삽입하기만 하면 됩니다.
POST /playwrights/_doc/1
{
"firstname": "William",
"lastname": "Shakespeare"
}원하는 대로 문서 및 필드를 추가할 수 있습니다. 이는 관계형 데이터베이스로는 쉽게 수행할 수 없는 작업입니다.
POST /playwrights/_doc/2
{
"firstname": "Samuel",
"lastname": "Beckett",
"year_of_birth": 1906
}이제 검색 엔드포인트를 사용하여 모든 문서를 쿼리할 수 있습니다.
GET /playwrights/_search
{
"query": {
"match_all": {}
}
}또는 특정 출생연도를 쿼리할 수도 있습니다.
GET /playwrights/_search
{
"query": {
“match": {
“year_of_birth": 1906
}
}
}기본 쿼리 작업 외에도, Elasticsearch는 퍼지 매칭, 어간 추출(스테밍), 정확도 점수, 강조 표시, 그리고 텍스트를 토큰이라고 불리는 더 작은 단위로 나누는 토큰화와 같은 고급 검색 기능을 제공합니다. 대부분의 경우, 이러한 토큰은 개별 단어이지만 사용할 수 있는 다양한 토크나이저가 있습니다.
비정규화된 데이터 키가 데이터 검색 속도를 높이는 이유는 무엇일까요?
관계형 데이터베이스에서는 데이터 중복을 제거하고 데이터 일관성을 보장하기 위해 정규화를 적용하는 경우가 많습니다. 예를 들어, 고객, 제품 및 주문에 대한 표가 별도로 있을 수 있습니다.
Elasticsearch에서 비정규화는 일반적인 관행입니다. 여러 표에 걸쳐 데이터를 분할하는 대신, 하나의 JSON 문서에 모든 관련 정보를 저장합니다. 별도의 제품 및 고객 인덱스를 참조하는 외부 키를 보유한 주문 문서 대신 주문 문서에는 고객 정보와 제품 정보가 포함됩니다. 이를 통해 검색 작업 중 Elasticsearch에서 데이터를 더 빠르고 효율적으로 검색할 수 있습니다. 일반적인 경험 법칙으로, 데이터를 결합하는 데 필요한 계산 비용보다 저장 비용이 더 저렴할 수 있습니다.
Elasticsearch는 분산 시스템에서 어떻게 확장성을 보장할까요?
각 인덱스는 고유한 이름으로 식별되며, 하나 이상의 샤드로 분할됩니다. 샤드는 인덱스의 더 작은 하위 집합으로, Elasticsearch 노드 클러스터 전반에 걸쳐 병렬 처리와 분산 저장을 가능하게 합니다. 샤드에는 기본 및 복제본 샤드가 있으며, 복제본은 하드웨어 장애로부터 보호하고 문서 검색 또는 찾아서 가져오기와 같은 읽기 요청을 처리할 수 있는 용량을 늘리기 위해 데이터의 중복 복사본을 제공합니다.
클러스터에 노드를 더 많이 추가하면 색인 및 검색을 위한 용량이 늘어나는데, 관계형 데이터베이스에서는 이를 쉽게 달성할 수 없습니다.
위의 playwrights 예제로 돌아가서, 다음을 실행하면 Elasticsearch가 자동으로 유추한 유형 매핑과 인덱스가 할당한 샤드 및 복제본 수를 볼 수 있습니다.
GET /playwrights/
Elasticsearch에서 색인할 수 있는 데이터 유형은 무엇일까요?
Elasticsearch은 여러 유형의 데이터를 색인할 수 있는데, 먼저 텍스트이며 숫자 및 지리적 위치 데이터도 포함됩니다. 또한 유사성 검색에 사용되는 밀집 벡터를 저장할 수 있습니다. 각각을 차례로 살펴보겠습니다.
텍스트/어휘 검색을 위한 역 인덱스
Elasticsearch은 특정 필드 유형에 사용할 최상의 기본 데이터 구조를 선택합니다. 예를 들어, 텍스트는 토큰화된 후 역 인덱스에 저장되는데, 역 인덱스는 모든 문서에 나타나는 모든 고유 토큰을 나열하고 각 단어가 등장하는 모든 문서를 식별하는 구조입니다.
다음 표는 역 인덱스의 일반적인 구성을 보여줍니다. 'London'이라는 단어를 검색하면, 인덱스에서 이 단어가 6개의 다른 문서에서 나타난다는 것을 알 수 있습니다. 텍스트 쿼리를 매우 빠르게 수행할 수 있게 해주는 것이 이 역 인덱스입니다.
토큰 | 문서 ID |
London | 1,3,8,12,23,88 |
Paris | 1,12,88 |
| Madrid | 3,8,12 |
| Berlin | 12,23 |
효율적인 공간 분석을 위한 수치 및 지리적 위치 검색 기능
수치 및 지리적 위치 데이터는 다차원 데이터의 효율적인 공간 색인 및 쿼리를 위해 엔지니어링 애플리케이션에서 사용되는 데이터 구조인 Block KD-Tree 인덱스라고도 하는 BKD 트리에 저장됩니다. 데이터 포인트를 블록으로 구성하여 대규모 데이터 세트에서 빠른 범위 검색 및 최근접 이웃 쿼리를 가능하게 하므로, 공간 데이터 분석 및 최적화를 다루는 엔지니어에게 유용한 도구입니다.
NLP를 사용한 벡터/시맨틱 검색
벡터 검색에 대해 들어보셨을 수도 있는데, 벡터 검색이란 무엇일까요? 벡터 데이터베이스, 시맨틱, 코사인 검색이라고 알려진 벡터 검색 엔진은 주어진(벡터화된) 쿼리에서 최근접 이웃을 찾습니다. 벡터 검색의 큰 장점은 위의 역 인덱스 예제에서 요구되는 것처럼 정확한 텍스트 일치가 아닌 유사한 문서를 발견한다는 점입니다. 대신 유사성 수준을 설명하는 벡터를 사용하기 때문입니다.
관련: 벡터 검색이란 무엇인가요?
벡터 검색에 대한 몇 가지 일반적인 사용 사례는 다음과 같습니다.
- 질문에 대답하기
- 이전에 답변한 질문에 대한 답변 찾기(질문이 텍스트 형식으로 유사하지만 완전히 동일하지는 않음)
- 추천하기(예: 사용자의 선호도에 따라 유사한 노래를 찾는 음악 애플리케이션)
이러한 모든 사용 사례는 수만 개의 차원을 가진 벡터를 활용하여, 정확한 유사성 평가와 타겟화된 추천을 위해 데이터에 대한 포괄적인 표현을 제공합니다.
Elasticsearch는 dense_vector 문서 유형을 통한 벡터 검색을 지원하며 벡터로 변환된 후 문서의 벡터와 검색 용어 간의 유사성 검색을 실행할 수 있습니다.
생성형 AI에 대해 조금 더 깊이 연구하고 싶으신 분을 위해, 인공 지능 기반 검색 애플리케이션을 구동하도록 설계된 Elasticsearch Relevance Engine™인 ESRE도 제공합니다. ESRE는 개발자들에게 정교한 검색 알고리즘의 전체 제품군과 대규모 언어 모델(LLM)과 통합할 수 있는 기능을 제공합니다.
다음에 해야 할 일
준비가 되면, 비즈니스에 데이터를 가져오는 데 도움이 되는 세 가지 방법을 확인해 보세요.
- 무료 체험판을 시작하고 Elastic Cloud가 비즈니스에 어떻게 도움이 되는지 알아보세요.
- Elasticsearch 시작하기 웨비나를 확인해 보세요.
- Elastic 제품을 둘러보고 Elasticsearch 플랫폼이 어떻게 작동하는지와 솔루션이 여러분의 요구 사항에 어떻게 부합하는지 알아보세요.
2013년 2월 24일 최초 게시, 2023년 7월 17일 업데이트.