Elasticsearch에서 두 인덱스를 조인하는 방법

Elasticsearch에서 두 인덱스를 결합하기 위해 쿼리, Logstash elasticsearch 필터, enrich 프로세서 및 ES|QL이라는 용어를 사용하는 방법을 설명합니다.

Elasticsearch가 처음이신가요? Elasticsearch 입문용 웨비나에 참여하세요. 지금 무료 클라우드 체험을 시작하거나, 내 기기에서 Elastic을 사용해 볼 수 있습니다.

Elasticsearch에서 두 인덱스를 조인하는 것은 기존 SQL 관계형 데이터베이스에서처럼 간단하지 않습니다. 그러나 Elasticsearch에서 제공하는 특정 기술과 기능을 사용하여 유사한 결과를 얻을 수 있습니다.

이전에는 많은 사람들이 서로 다른 인덱스를 결합하는 메커니즘으로 nested 필드 유형을 사용했습니다. 그러나 비용이 많이 드는 쿼리와 Kibana의 불완전한 지원, 특히 Lens 시각화로 인해 제한적이었습니다.

이 문서에서는 다음 접근 방식에 초점을 맞춰 Elasticsearch에서 두 인덱스를 결합하는 프로세스를 자세히 설명합니다:

  1. terms 쿼리 사용
  2. 수집 파이프라인에서 enrich 프로세서 사용
  3. Logstash elasticsearch 필터 플러그인
  4. ES|QL ENRICH
  5. ES|QL LOOKUP JOIN

용어 쿼리 사용

용어 쿼리는 Elasticsearch에서 두 인덱스를 결합하는 가장 효과적인 방법 중 하나입니다. 이 쿼리는 특정 필드에 하나 이상의 정확한 용어가 포함된 문서를 검색하는 데 사용됩니다. 여기서는 두 인덱스를 조인하는 데 사용하는 방법에 대해 설명합니다.

먼저 첫 번째 인덱스에서 필요한 데이터를 검색해야 합니다. 이는 간단한 GET 요청을 사용하여 _source 속성에서 값을 가져와서 수행할 수 있습니다.

첫 번째 인덱스의 데이터를 확보하면 이를 사용하여 두 번째 인덱스를 쿼리할 수 있습니다. terms 쿼리를 사용하여 일치시킬 필드와 값을 지정합니다.

다음은 그 예입니다:


이 예에서 field_in_second_index 은 두 번째 인덱스에서 첫 번째 인덱스의 값과 일치시키려는 필드입니다. value1_from_first_indexvalue2_from_first_index 는 두 번째 인덱스에서 일치시키려는 첫 번째 인덱스의 값입니다.

용어 조회는 용어 조회라는 기술을 사용하여 위의 두 단계를 한 번에 수행할 수 있는 기능도 지원합니다. Elasticsearch는 다른 인덱스에서 일치할 값을 투명하게 검색하는 작업을 처리합니다. 예를 들어 선수 목록이 포함된 팀 색인이 있는 경우입니다:

아래와 같이 팀1에서 플레이하는 모든 사람에 대한 사람 인덱스를 쿼리할 수 있습니다:

위의 예에서, Elasticsearch는 팀 인덱스에서 id가 team1인 문서에서 선수 이름을 투명하게 검색합니다(즉, 다음과 같이). "john", "bill", "michael")을 검색하여 이름 필드에 이러한 값이 포함된 모든 문서를 사람 색인에서 찾습니다.

궁금하신 분들을 위해 동등한 SQL 쿼리는 다음과 같습니다:

인리치 프로세서 사용

enrich 프로세서는 Elasticsearch에서 두 개의 인덱스를 조인하는 데 사용할 수 있는 또 다른 강력한 도구입니다. 이 프로세서는 미리 정의된 보강 색인에서 데이터를 추가하여 수신 문서의 데이터를 보강합니다.

인리치 프로세서를 사용하여 두 인덱스를 결합하는 방법은 다음과 같습니다:

1. 먼저 인라이크 정책을 만들어야 합니다. 이 정책은 보강에 사용할 인덱스, 일치시킬 필드, 들어오는 문서를 보강하는 데 사용할 필드를 정의합니다.

다음은 그 예입니다:

2. 정책이 생성되면 정책을 실행하여 새로 생성한 정책에서 색인 강화 인덱스를 생성해야 합니다:

이렇게 하면 강화하는 동안 사용될 새로운 숨겨진 강화 인덱스가 생성됩니다. 소스 인덱스의 크기에 따라 이 작업에는 다소 시간이 걸릴 수 있습니다. 다음 단계로 진행하기 전에 인라이크 정책이 완전히 구축되었는지 확인하세요.

3. 강화 정책이 구축된 후에는 수집 파이프라인에서 강화 프로세서를 사용하여 들어오는 문서의 데이터를 강화할 수 있습니다:

이 예에서 field_in_second_index 은 첫 번째 인덱스의 match_field 과 일치해야 하는 두 번째 인덱스의 필드입니다. enriched_field 는 첫 번째 인덱스의 enrich_fields 에서 보강된 데이터를 포함할 두 번째 인덱스의 새 필드입니다.

이 접근 방식의 한 가지 단점은 first_index 에서 데이터가 변경되면 보강 정책을 다시 실행해야 한다는 것입니다. 보강된 인덱스는 구축된 소스 인덱스에서 자동으로 업데이트되거나 동기화되지 않습니다. 하지만 first_index 이 비교적 안정적이라면 이 접근 방식이 잘 작동합니다.

Logstash 엘라스틱서치 필터 플러그인

Logstash를 사용하는 경우, 위에서 설명한 enrich 프로세서와 유사한 또 다른 옵션은 elasticsearch 필터 플러그인을 사용하여 지정된 쿼리를 기반으로 이벤트에 관련 필드를 추가하는 것입니다. Logstash 파이프라인의 구성은 my-pipeline.conf 과 같은 .conf 파일에 저장됩니다.

우리의 파이프라인이 elasticsearch 입력 플러그인을 사용하여 Elasticsearch에서 로그를 가져오고, 선택 범위를 좁히기 위한 쿼리를 사용한다고 가정해 보겠습니다:

주어진 인덱스의 정보로 이러한 메시지를 보강하려면 filter 섹션의 elasticsearch 필터 플러그인을 사용하여 로그를 보강할 수 있습니다:

위의 코드는 인덱스 index_name 에서 type 이 시작이고 작업 필드가 지정된 opid 과 일치하는 문서를 찾은 다음 @timestamp 필드의 값을 started 라는 새 필드에 복사합니다 .

그런 다음 보강된 문서는 적절한 출력 소스(이 경우 elasticsearch 출력 플러그인을 사용하여 Elasticsearch로)로 전송됩니다:

이미 Logstash를 사용하고 있는 경우, 이 옵션은 보강 로직을 한 곳에 통합하고 새로운 이벤트가 들어올 때 처리하는 데 유용할 수 있습니다. 그러나 그렇지 않은 경우 솔루션이 복잡해지고 실행 및 유지 관리해야 하는 또 다른 구성 요소가 추가됩니다.

ES|QL 리치

버전 8.14에서 정식 버전으로 출시된 ES|QL은 Elasticsearch에서 지원하는 파이핑 쿼리 언어로, 데이터를 필터링, 변환, 분석할 수 있게 해줍니다. ENRICH 처리 명령을 사용하면 강화 정책을 사용하여 기존 인덱스의 데이터를 추가할 수 있습니다.

원래의 인리치 프로세서 예제에서 동일한 정책 my_enrich_policy 을 사용하면 ES|QL 예제는 다음과 같이 됩니다:

이 예제에서는 각각 field_in_first_indexfield_to_enrich 인 일치 및 보강 필드를 재정의할 수도 있습니다:

강화 정책을 먼저 지정해야 한다는 분명한 한계가 있지만, ES|QL은 필요에 따라 필드를 조정할 수 있는 유연성을 제공합니다.

ES|QL 조회 조인

Elasticsearch 8.18에서는 LOOKUP JOIN 명령이라는 새로운 인덱스 조인 방법이 도입되었습니다. 이 명령은 조인의 오른쪽에 있는 새 조회 인덱스 모드를 사용하여 SQL 스타일의 LEFT OUTER JOIN으로 작동합니다.

이전 예제를 다시 살펴보면 새 쿼리는 다음과 같으며, match_fieldfirst_indexsecond_index 모두에 존재해야 합니다:

다른 접근 방식에 비해 조회 조인의 장점은 enrich 정책이 필요하지 않으므로 정책 설정과 관련된 추가 처리가 필요하지 않다는 점입니다. 이 글에서 설명하는 다른 접근 방식과 달리 자주 변경되는 보강 데이터로 작업할 때 유용합니다.

결론

결론적으로, Elasticsearch는 전통적인 조인 작업을 지원하지는 않지만, 유사한 결과를 얻기 위해 사용할 수 있는 다양한 기능을 제공합니다. 특히 다음을 사용하여 조인 작업을 수행하는 방법에 대해 설명했습니다:

  1. terms 쿼리
  2. 수집 파이프라인의 enrich 프로세서
  3. Logstash elasticsearch 필터 플러그인
  4. ES|QL ENRICH
  5. ES|QL LOOKUP JOIN

이러한 방법에는 한계가 있으므로 특정 요구 사항과 데이터의 특성에 따라 신중하게 사용해야 한다는 점에 유의하세요.

관련 콘텐츠

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

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

직접 사용해 보세요