Elasticsearch 커넥터

Elasticsearch 커넥터 (Elasticsearch connector)

Elasticsearch 커넥터는 Trino에서 Elasticsearch 데이터에 접근할 수 있게 해 줘요. 이 문서는 Elasticsearch 커넥터로 카탈로그를 구성해 Elasticsearch에 대해 SQL 쿼리를 실행하는 방법을 설명해요.

출처: 문서

본문

요구사항 (Requirements)

  • Elasticsearch 7.x 또는 8.x
  • Trino 코디네이터와 워커에서 Elasticsearch 노드로 네트워크 접근.

설정 (Configuration)

Elasticsearch 커넥터를 구성하려면 etc/catalog/example.properties 카탈로그 속성 파일을 만들고, 속성을 환경에 맞게 바꿔 다음 내용을 넣으세요:

connector.name=elasticsearch
elasticsearch.host=localhost
elasticsearch.port=9200
elasticsearch.default-schema-name=default

배열 필드 매핑

Elasticsearch는 기본적으로 배열 요소의 타입을 추론하지 못해, 배열 필드를 식별하려면 _meta 매핑을 사용해야 해요. 예를 들어 다음과 같은 문서의 배열 필드를 매핑한다면:

{
    "array_string_field": ["trino","the","lean","machine-ohs"],
    "long_field": 314159265359,
    "id_field": "564e6982-88ee-4498-aa98-df9e3f6b6109",
    "timestamp_field": "2025-09-17T06:22:48.000Z",
    "object_field": {
        "array_int_field": [86,75,309],
        "int_field": 2
    }
}

isArray 표시로 배열 필드를 지정할 수 있어요:

curl --request PUT \
    --url search.example.com:9200/doc/_mapping \
    --header 'content-type: application/json' \
    --data '
{
    "_meta": {
        "trino":{
            "array_string_field":{
                "isArray":true
            },
            "object_field":{
                "array_int_field":{
                    "isArray":true
                }
            }
        }
    }
}'

키워드 타입의 배열 필드는 properties 매핑으로도 지정할 수 있어요:

curl --request PUT \
    --url search.example.com:9200/doc/_mapping \
    --header 'content-type: application/json' \
    --data '
{
    "properties": {
        "array_string_field":{
            "type": "keyword"
        }
    }
}'

중첩 배열이 있는 문서:

[
    {
        "array_string_field": "trino"
    },
    {
        "array_string_field": ["trino","is","the","best"]
    },
    {
        "array_string_field": ["trino",["is","the","best"]]
    },
    {
        "array_string_field": ["trino",["is",["the","best"]]]
    }
]

배열 필드를 원본 JSON으로 노출하려면 asRawJson을 쓰세요:

curl --request PUT \
    --url search.example.com:9200/doc/_mapping \
    --header 'content-type: application/json' \
    --data '
{
    "_meta": {
        "trino":{
            "array_string_field":{
                "asRawJson":true
            }
        }
    }
}'

쿼리 예시

공백이나 특수 문자가 있는 인덱스 이름은 큰따옴표로 감싸야 해요:

SELECT * FROM "tweets: +trino SQL^2"

와일드카드 인덱스 접근:

SELECT *
FROM example.web."page_views_*";

테이블 함수로 원시 Elasticsearch 쿼리를 보낼 수도 있어요:

SELECT
  *
FROM
  TABLE(
    example.system.raw_query(
      schema => 'sales',
      index => 'orders',
      query => '{
        "query": {
          "match": {
            "name": "ALGERIA"
          }
        }
      }'
    )
  );

더 알아보기 (Learn more)

다른 검색 엔진 커넥터가 궁금하다면 OpenSearch 커넥터 문서를 이어서 읽어 보세요.