Elasticsearch 인덱스란 무엇인가?

info-retrieval-blog-720x420-v2.jpeg

인덱스라는 용어는 기술 세계에서 상당히 과부하가 걸려 있습니다. 대부분의 개발자에게 인덱스가 무엇인지 물어보면, 일반적으로 표와 관련된 관계형 데이터베이스(RDBMS)의 데이터 구조를 언급하며, 인덱스를 통해 데이터 검색 작업 속도가 향상된다고 합니다.

그러나 Elasticsearch® 인덱스란 무엇일까요? Elasticsearch 인덱스는 문서의 모음을 유지하는 논리적 네임스페이스이며, 각 문서는 필드의 모음이고, 필드는 데이터를 포함하는 키-값 쌍입니다.

Elasticsearch 인덱스는 관계형 데이터베이스와 어떻게 다를까요?

Elasticsearch 인덱스는 관계형 데이터베이스에서 찾아볼 수 있는 인덱스와 다릅니다. 표로 간주할 수 있는 많은 인덱스를 포함할 수 있으며 각 인덱스 내에 많은 문서가 있는 데이터베이스로 Elasticsearch 클러스터를 생각해 보세요.   

  • RDBMS => 데이터베이스 => 표 => 열/행
  • Elasticsearch => 클러스터 => 인덱스 => 샤드 => 키-값 쌍이 있는 문서

Elasticsearch는 JSON 문서를 저장하지만, 인덱스에 입력하는 내용은 놀랄 만큼 유연합니다. 이것은 사용 가능한 다양한 통합Beats를 사용하여 시작하고 실행하는 빠른 프로세스입니다. 또는 조금 더 나아가 수많은 프로세서와 플러그인의 도움을 받아 수집 파이프라인 또는 Logstash®를 사용하여 자신만의 ETL 프로세스를 정의할 수 있습니다.

관계형 데이터베이스와 다른 점은 데이터를 미리 정의할 필요 없이 가져올 수 있다는 것입니다. 동적 유형은 빠르게 시작하거나 문서에서 예기치 않은 필드를 설명하는 좋은 방법입니다. 그런 다음, 설정된 항목이 있으면 고정된 스키마로 전환하여 성능을 향상시킵니다. 

런타임 필드는 읽기 또는 쓰기 스키마를 수행할 수 있는 또 다른 흥미로운 기능입니다. 기존 문서에 추가하여 새 필드를 도출하는 데 사용할 수도 있고 쿼리 시 런타임 필드를 만들 수도 있습니다. 문서의 소스로 읽을 수 있는 스크립팅을 사용하여 계산된 값이라고 생각하세요.

효과를 확인할 준비가 되셨나요? 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 /kr/playwrights/

Elasticsearch에서 색인할 수 있는 데이터 유형은 무엇일까요?

Elasticsearch은 먼저 텍스트뿐만 아니라 숫자 및 지리적 위치 데이터와 같은 여러 유형의 데이터를 색인할 수 있습니다. 또한 유사성 검색에 사용되는 밀집 벡터를 저장할 수 있습니다. 이 각각을 차례로 살펴보겠습니다.

텍스트/어휘 검색을 위한 역 인덱스

Elasticsearch은 또한 특정 필드 유형에 사용할 최상의 기본 데이터 구조를 선택하게 됩니다. 예를 들어, 텍스트는 토큰화된 다음 역 인덱스에 저장됩니다. 이 구조는 모든 문서에 나타나는 모든 고유 토큰을 나열하고 각 단어가 발생하는 모든 문서를 식별하는 구조입니다.

다음 표는 역 인덱스의 일반적인 구성을 보여줍니다. "London"이라는 단어를 검색하면, 인덱스에서 이 단어가 6개의 다른 문서에서 나타난다는 것을 알 수 있습니다. 텍스트 쿼리를 매우 빠르게 수행할 수 있게 해주는 것이 이 역 인덱스입니다.

Token

Document ID

London

1,3,8,12,23,88

Paris

1,12,88

Madrid3,8,12
Berlin12,23

효율적인 공간 분석을 위한 수치 및 지리적 위치 검색 기능

수치 및 지리적 위치 데이터는 다차원 데이터의 효율적인 공간 색인 및 쿼리를 위해 엔지니어링 애플리케이션에 사용되는 데이터 구조인 Block KD-Tree 인덱스라고도 하는 BKD 트리에 저장됩니다. 데이터 포인트를 블록으로 구성하여 대규모 데이터 세트에서 빠른 범위 검색 및 최근접 유사 항목 쿼리를 허용하므로, 공간 데이터 분석 및 최적화를 다루는 엔지니어에게 유용한 도구가 됩니다.

NLP를 사용한 벡터/시맨틱 검색

벡터 검색에 대해 들어보셨을 수도 있는데, 벡터 검색이란 무엇일까요? 벡터 데이터베이스, 시맨틱 또는 코사인 검색으로 알려진 벡터 검색 엔진은 주어진(벡터화된) 쿼리에서 최근접 유사 항목을 찾습니다. 벡터 검색의 큰 장점은 위의 역 인덱스 예제에서 요구되는 것처럼 정확한 텍스트 일치가 아닌 유사한 문서를 발견한다는 점입니다. 대신 유사성 수준을 설명하는 벡터를 사용하기 때문입니다. 

자연어 처리(NLP) 커뮤니티는 단어와 문장을 숫자 벡터로 인코딩하는 텍스트 임베딩이라는 기법을 개발했습니다. 이러한 벡터 표현은 텍스트의 언어적 내용을 포착하도록 설계되었으며 쿼리와 문서 사이의 유사도를 평가하는 데 사용할 수 있습니다.

벡터 검색에 대한 몇 가지 일반적인 사용 사례는 다음과 같습니다. 

  • 질문에 대답하기
  • 이전에 답변한 질문에 대한 답변 찾기(질문이 텍스트 형식으로 유사하지만 완전히 동일하지는 않음) 
  • 추천하기 - 예를 들어, 기본 설정에 따라 유사한 노래를 찾는 음악 애플리케이션  

이러한 사용 사례는 모두 수만 개의 차원을 가진 벡터를 활용하여, 정확한 유사성 평가 및 타겟화된 추천을 위해 데이터의 포괄적인 표현을  제공합니다. 

Elasticsearch는 dense_vector 문서 유형을 통한 벡터 검색을 지원하며, 벡터로 변환된 후 문서의 벡터와 검색 용어 간의 유사성 검색을 실행할 수 있습니다. 

생성형 AI에 대해 조금 더 깊이 연구하고 싶으신 분을 위해, 인공 지능 기반 검색 애플리케이션을 구동하도록 설계된 Elasticsearch Relevance Engine™인 ESRE도 제공합니다. ESRE는 개발자들에게 정교한 검색 알고리즘의 전체 제품군 및 대규모 언어 모델(LLM)과 통합할 수 있는 기능을 제공합니다.

사용해 보세요!

보시다시피, Elasticsearch 인덱스는 Elastic의 공동 설립자이자 최고 기술 책임자인 Shay Banon이 아내를 위해 레시피 검색 엔진을 처음 작성한 이후 크게 발전했습니다. 훨씬 더 많은 것을 발견할 수 있으며, 좋은 시작점은 Elastic Cloud에 체험판 계정을 만드시는 것입니다. 바로 몇 분 안에 시작하실 수 있습니다. 또한 Elasticsearch 시작하기 웨비나를 확인해 보세요.

2013년 2월 24일 최초 게시, 2023년 7월 17일 업데이트.