Перейти к основному содержимому
Версия: 2.0.x

Elasticsearch catalog

Selena поддерживает Elasticsearch catalogs начиная с версии v1.5.2.

Selena и Elasticsearch — это обе популярные аналитические системы с различными сильными сторонами. Selena превосходна в крупномасштабных распределённых вычислениях и поддерживает запрос данных из Elasticsearch через внешние таблицы. Elasticsearch известен своими возможностями полнотекстового поиска. Комбинация Selena и Elasticsearch обеспечивает более комплексное OLAP-решение. С помощью Elasticsearch catalogs вы можете напрямую анализировать все индексированные данные в вашем cluster Elasticsearch, используя SQL-операторы в Selena без необходимости миграции данных.

В отличие от catalogs для других источников данных, Elasticsearch catalog имеет только одну базу данных с именем default_db при создании. Каждый индекс Elasticsearch автоматически сопоставляется с таблицей данных и монтируется в базу данных default_db.

Создание Elasticsearch catalog

Синтаксис

CREATE EXTERNAL CATALOG <catalog_name>
[COMMENT <comment>]
PROPERTIES ("key"="value", ...)

Параметры

catalog_name

Имя Elasticsearch catalog. Соглашения об именовании следующие:

  • Имя может содержать буквы, цифры (0-9) и символы подчёркивания (_). Оно должно начинаться с буквы.
  • Имя чувствительно к регистру и не может превышать 1023 символа в длину.

comment

Описание Elasticsearch catalog. Этот параметр является опциональным.

PROPERTIES

Свойства Elasticsearch catalog. В следующей таблице описаны свойства, поддерживаемые для Elasticsearch catalogs.

ПараметрОбязательныйЗначение по умолчаниюОписание
hostsДаНетАдрес подключения к cluster Elasticsearch. Вы можете указать один или несколько адресов. Selena может разобрать версию Elasticsearch и распределение shard индекса по этому адресу. Selena взаимодействует с вашим cluster Elasticsearch на основе адреса, возвращённого операцией API GET /_nodes/http. Поэтому значение параметра hosts должно совпадать с адресом, возвращённым операцией API GET /_nodes/http. В противном случае BE или CN могут не иметь возможности взаимодействовать с вашим cluster Elasticsearch.
typeДаНетТип источника данных. Установите этот параметр в es при создании Elasticsearch catalog.
userНетПустоИмя пользователя, которое используется для входа в cluster Elasticsearch с включённой базовой HTTP-аутентификацией. Убедитесь, что у вас есть разрешения на доступ к путям, таким как /cluster/state/ nodes/http, и разрешения на чтение индекса.
passwordНетПустоПароль, который используется для входа в cluster Elasticsearch.
es.typeНет_docТип индекса. Если вы хотите запросить данные в Elasticsearch версии 8 и более поздних, вам не нужно настраивать этот параметр, потому что типы сопоставления были удалены в Elasticsearch версии 8 и более поздних.
es.nodes.wan.onlyНетFALSEУказывает, использует ли Selena только адреса, указанные в hosts, для доступа к cluster Elasticsearch и получения данных.
  • true: Selena использует только адреса, указанные в hosts, для доступа к cluster Elasticsearch и получения данных и не отслеживает узлы данных, на которых находятся shard индекса Elasticsearch. Если Selena не может получить доступ к адресам узлов данных внутри cluster Elasticsearch, вам нужно установить этот параметр в true.
  • false: Selena использует адреса, указанные в hosts, для отслеживания узлов данных, на которых находятся shard индексов cluster Elasticsearch. После того как Selena сгенерирует план выполнения запроса, BE или CN напрямую обращаются к узлам данных внутри cluster Elasticsearch для получения данных из shard индексов. Если Selena может получить доступ к адресам узлов данных внутри cluster Elasticsearch, мы рекомендуем сохранить значение по умолчанию false.
es.net.sslНетFALSEУказывает, можно ли использовать протокол HTTPS для доступа к cluster Elasticsearch. Только Selena v1.5.2 и более поздние версии поддерживают настройку этого параметра.
  • true: Оба протокола HTTPS и HTTP могут использоваться для доступа к вашему cluster Elasticsearch.
  • false: Только протокол HTTP может использоваться для доступа к вашему cluster Elasticsearch.
enable_docvalue_scanНетTRUEУказывает, получать ли значения целевых полей из столбцового хранилища Elasticsearch. В большинстве случаев чтение данных из столбцового хранилища превосходит чтение данных из строкового хранилища.
enable_keyword_sniffНетTRUEУказывает, отслеживать ли поля типа TEXT в Elasticsearch на основе полей типа KEYWORD. Если этот параметр установлен в false, Selena выполняет сопоставление после токенизации.

Примеры

Следующий пример создаёт Elasticsearch catalog с именем es_test:

CREATE EXTERNAL CATALOG es_test
COMMENT 'test123'
PROPERTIES
(
"type" = "es",
"es.type" = "_doc",
"hosts" = "https://xxx:9200",
"es.net.ssl" = "true",
"user" = "admin",
"password" = "xxx",
"es.nodes.wan.only" = "true"
);

Проталкивание предикатов

Selena поддерживает проталкивание предикатов, указанных в запросах к таблицам Elasticsearch, в Elasticsearch для выполнения. Это минимизирует расстояние между движком запросов и источником хранения и улучшает производительность запросов. В следующей таблице перечислены операторы, которые могут быть протолкнуты в Elasticsearch.

SQL-синтаксисСинтаксис Elasticsearch
=term query
interms query
>=, <=, >, <range
andbool.filter
orbool.should
notbool.must_not
not inbool.must_not + terms
esqueryES Query DSL

Примеры запросов

Функция esquery() может использоваться для проталкивания запросов Elasticsearch, таких как запросы match и geoshape, которые не могут быть выражены в SQL, в Elasticsearch для фильтрации и обработки. В функции esquery() первый параметр, который указывает имя столбца, используется для связи с индексом, а второй параметр — это JSON-представление запроса Elasticsearch на основе Elasticsearch Query DSL, заключённое в фигурные скобки ({}). JSON-представление может и должно иметь только один корневой ключ, такой как match, geo_shape или bool.

  • Запрос Match

    SELECT * FROM es_table WHERE esquery(k4, '{
    "match": {
    "k4": "Selena on elasticsearch"
    }
    }');
  • Запрос Geoshape

    SELECT * FROM es_table WHERE esquery(k4, '{
    "geo_shape": {
    "location": {
    "shape": {
    "type": "envelope",
    "coordinates": [
    [
    13,
    53
    ],
    [
    14,
    52
    ]
    ]
    },
    "relation": "within"
    }
    }
    }');
  • Запрос Boolean

    SELECT * FROM es_table WHERE esquery(k4, ' {
    "bool": {
    "must": [
    {
    "terms": {
    "k1": [
    11,
    12
    ]
    }
    },
    {
    "terms": {
    "k2": [
    100
    ]
    }
    }
    ]
    }
    }');

Примечания по использованию

  • Начиная с версии v5.x, Elasticsearch использует другой метод сканирования данных. Selena поддерживает только запрос данных из Elasticsearch v5.x и более поздних версий.
  • Selena поддерживает только запрос данных из clusters Elasticsearch, для которых включена базовая HTTP-аутентификация.
  • Некоторые запросы, такие как запросы с использованием count(), выполняются намного медленнее в Selena, чем в Elasticsearch, потому что Elasticsearch может напрямую читать метаданные, связанные с указанным количеством документов, соответствующих условиям запроса, без необходимости фильтровать запрошенные данные.