Elasticsearch 인덱스 생성

Elasticsearch에서 매우 중요한 두 가지 개념은 문서와 인덱스입니다.

문서는 관련 값이 있는 필드의 모음입니다. Elasticsearch로 작업하려면 데이터를 문서로 정리한 다음 모든 문서를 인덱스에 추가해야 합니다. 인덱스란 효율적인 검색을 수행하도록 고도로 최적화된 형식으로 저장된 문서 모음이라고 생각하시면 됩니다.

다른 데이터베이스로 작업해 본 적이 있다면 많은 데이터베이스에서 저장하려는 모든 필드와 그 유형에 대한 설명인 스키마 정의가 필요하다는 것을 알고 있을 것입니다. 원하는 경우 스키마로 Elasticsearch 인덱스를 구성할 수 있지만, 데이터 자체에서 스키마를 자동으로 도출할 수도 있습니다. 이 섹션에서는 텍스트, 숫자, 날짜와 같은 간단한 데이터 유형에 대해 매우 잘 작동하는 Elasticsearch가 스스로 스키마를 알아내도록 할 것입니다. 나중에 더 복잡한 데이터 유형을 소개한 후에는 명시적인 스키마 정의를 제공하는 방법을 배우게 됩니다.

색인 만들기

Python 클라이언트 라이브러리를 사용하여 Elasticsearch 인덱스를 생성하는 방법입니다:

이 예제에서 self.esElasticsearch 클래스의 인스턴스이며, 이 튜토리얼에서는 search.py의 Search 클래스에 저장됩니다. 위의 예에서 my_documents 같은 이름으로 각각 식별되는 여러 인덱스를 저장하는 데 Elasticsearch 배포를 사용할 수 있습니다.

인덱스도 삭제할 수 있습니다:

기존 인덱스에 이미 할당된 이름으로 인덱스를 만들려고 하면 오류가 발생합니다. 인덱스의 이전 인스턴스가 있는 경우 자동으로 삭제하는 인덱스를 만드는 것이 유용할 때가 있습니다. 인덱스를 여러 번 다시 생성해야 할 가능성이 높기 때문에 애플리케이션을 개발할 때 특히 유용합니다.

search.py에 create_index() 헬퍼 메서드를 추가해 보겠습니다. 코드 편집기에서 이 파일을 열고 기존 내용은 그대로 둔 채 하단에 다음 코드를 추가합니다:

create_index() 메서드는 먼저 my_documents 이라는 이름의 인덱스를 삭제합니다. ignore_unavailable=True 옵션을 사용하면 인덱스 이름을 찾을 수 없을 때 이 호출이 실패하지 않습니다. 메서드의 다음 줄은 동일한 이름의 새 인덱스를 만듭니다.

이 튜토리얼에 소개된 예제 애플리케이션에는 단일 Elasticsearch 인덱스가 필요하므로 인덱스 이름을 my_documents 로 하드코딩합니다. 여러 인덱스를 사용하는 더 복잡한 애플리케이션의 경우 인덱스 이름을 인수로 받아들이는 것을 고려할 수 있습니다.

색인에 문서 추가

Python용 Elasticsearch 클라이언트 라이브러리에서 문서는 키/값 필드의 사전으로 표현됩니다. 문자열 값이 있는 필드는 전체 텍스트 및 키워드 검색을 위해 자동으로 색인되지만 문자열 외에도 숫자, 날짜, 부울과 같은 다른 필드 유형을 사용할 수 있으며, 필터링과 같은 효율적인 작업을 위해 색인화할 수도 있습니다. 필드가 목록이나 하위 항목이 있는 사전으로 설정된 복잡한 데이터 구조를 구축할 수도 있습니다.

인덱스에 문서를 삽입하려면 Elasticsearch 클라이언트의 index() 메서드가 사용됩니다. 예를 들어

index() 메서드의 반환 값은 Elasticsearch 서비스에서 반환하는 응답입니다. 이 응답에서 반환되는 가장 중요한 정보는 문서가 색인에 삽입될 때 문서에 할당된 고유 식별자를 나타내는 키 이름이 _id 인 항목입니다. 식별자는 문서를 검색, 삭제 또는 업데이트하는 데 사용할 수 있습니다.

이제 문서를 삽입하는 방법을 알았으니 search.py에서 유용한 헬퍼 라이브러리를 계속 구축해 보겠습니다, 를 Search 클래스에 대한 새로운 insert_document() 메서드로 대체합니다. search.py의 맨 아래에 이 메서드를 추가합니다:

이 메서드는 호출자로부터 Elasticsearch 클라이언트와 문서를 수락하고 my_documents 인덱스에 문서를 삽입하여 서비스에서 응답을 반환합니다.

참고: 이러한 작업은 이 자습서에서 다루지 않지만 Elasticsearch 클라이언트에서도 문서를 수정하고 삭제할 수 있습니다. 사용 가능한 모든 작업에 대해 알아보려면 Python 라이브러리 설명서의 Elasticsearch 클래스 참조를 참조하세요.

JSON 파일에서 문서 수집하기

새 Elasticsearch 인덱스를 설정할 때 많은 양의 문서를 가져와야 할 가능성이 높습니다. 이 튜토리얼의 시작 프로젝트에는 JSON 형식의 일부 데이터가 포함된 data.json 파일이 포함되어 있습니다. 이 섹션에서는 이 파일에 포함된 모든 문서를 색인으로 가져오는 방법을 알아봅니다.

data.json에 포함된 문서의 구조는 다음과 같습니다:

  • name문서 제목
  • url외부 사이트에서 호스팅되는 문서의 URL입니다.
  • summary문서 내용에 대한 간략한 요약 정보
  • content문서 본문
  • created_on생성 날짜
  • updated_at업데이트 날짜(문서가 업데이트되지 않은 경우 누락될 수 있음)
  • category문서 카테고리( github, sharepoint 또는 teams
  • rolePermissions역할 권한 목록

이 시점에서 편집기에서 data.json을 열어 작업할 데이터에 익숙해지는 것이 좋습니다.

본질적으로 많은 수의 문서를 가져오는 것은 포루프 내에서 하나의 문서를 가져오는 것과 다르지 않습니다. data.json 파일의 전체 내용을 가져오려면 다음과 같이 할 수 있습니다:

이 접근 방식은 효과적이지만 확장성이 좋지 않습니다. 매우 많은 수의 문서를 삽입해야 하는 경우, Elasticsearch 서비스에 많은 호출을 해야 합니다. 안타깝게도 각 API 호출에는 성능 비용이 발생하며, 서비스에는 많은 수의 호출이 매우 빠르게 이루어지지 않도록 하는 속도 제한이 있습니다. 이러한 이유로, 한 번의 API 호출로 여러 작업을 서비스에 전달할 수 있는 Elasticsearch 서비스의 대량 삽입 기능을 사용하는 것이 가장 좋습니다.

아래 표시된 insert_documents() 메서드는 search.py의 하단에 추가해야 합니다, 는 bulk() 메서드를 사용하여 한 번의 호출로 모든 문서를 삽입합니다:

이 메서드는 문서 목록을 허용합니다. 각 문서를 개별적으로 추가하는 대신 operations 라는 단일 목록을 작성한 다음 bulk() 메서드로 목록을 전달합니다. 각 문서에 대해 operations 목록에 두 개의 항목이 추가됩니다:

  • 수행할 작업에 대한 설명으로, index 로 설정하고 인덱스 이름을 인수로 지정합니다.
  • 문서의 실제 데이터

대량 요청을 처리할 때, Elasticsearch 서비스는 처음부터 작업 목록을 살펴보고 요청된 작업을 수행합니다.

색인 다시 생성하기

이 튜토리얼을 진행하는 동안 인덱스를 몇 번 다시 생성해야 합니다. 이 작업을 간소화하려면 search.py에 reindex() 메서드를 추가하세요:

이 메서드는 앞서 만든 create_index()insert_documents() 메서드를 결합하여 한 번의 호출로 이전 인덱스(존재하는 경우)를 삭제하고 새 인덱스를 생성하여 다시 채울 수 있습니다.

참고: 매우 많은 수의 문서를 색인할 때는 문서 목록을 작은 집합으로 나누고 각 집합을 개별적으로 가져오는 것이 가장 좋습니다.

이 메서드를 더 쉽게 호출할 수 있도록 flask 명령어를 통해 노출해 보겠습니다. 코드 편집기에서 app.py를 열고 하단에 다음 함수를 추가합니다:

@app.cli.command() 데코레이터는 Flask 프레임워크에 이 함수를 사용자 지정 명령으로 등록하도록 지시하며, 이 명령은 flask reindex 으로 사용할 수 있습니다. 명령의 이름은 함수 이름에서 가져온 것이며, Flask가 --help 문서에서 사용하므로 여기에 문서 문자열이 포함되어 있습니다.

reindex() 함수의 응답, 즉 Elasticsearch 클라이언트의 bulk() 메서드의 응답에는 멋진 상태 메시지를 구성하는 데 사용할 수 있는 몇 가지 유용한 항목이 포함되어 있습니다. 특히 response['took'] 은 통화 시간(밀리초)을, response['items'] 은 각 작업의 개별 결과 목록으로, 실제로 직접적으로 유용하지는 않지만 목록의 길이를 통해 삽입된 문서 수를 확인할 수 있습니다.

터미널 세션에서 flask --help 을 실행하여 Python 가상 환경이 활성화되어 있는지 확인해보세요(터미널 세션에서 여전히 Flask 애플리케이션을 실행 중인 경우 두 번째 터미널 창을 열면 됩니다). 도움말 화면 끝부분에 Flask 프레임워크에서 제공하는 다른 옵션과 함께 reindex 옵션이 사용 가능한 명령으로 포함되어 있는 것을 볼 수 있습니다:

이제 깨끗한 인덱스를 생성하려면 flask reindex 을 실행하기만 하면 됩니다.

최첨단 검색 환경을 구축할 준비가 되셨나요?

충분히 고급화된 검색은 한 사람의 노력만으로는 달성할 수 없습니다. Elasticsearch는 여러분과 마찬가지로 검색에 대한 열정을 가진 데이터 과학자, ML 운영팀, 엔지니어 등 많은 사람들이 지원합니다. 서로 연결하고 협력하여 원하는 결과를 얻을 수 있는 마법 같은 검색 환경을 구축해 보세요.

직접 사용해 보세요