Перейти к основному содержимому

Elasticsearch catalog

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

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

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

Создание 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ДаNoneАдрес подключения к Elasticsearch кластеру. Вы можете указать один или несколько адресов. Selena может определить версию Elasticsearch и распределение шардов индекса по этому адресу. Selena взаимодействует с вашим Elasticsearch кластером на основе адреса, возвращаемого API-операцией GET /_nodes/http. Поэтому значение параметра hosts должно совпадать с адресом, возвращаемым API-операцией GET /_nodes/http. В противном случае BE или CN могут не иметь возможности взаимодействовать с вашим Elasticsearch кластером.
typeДаNoneТип источника данных. Установите этот параметр в es при создании Elasticsearch catalog.
userНетEmptyИмя пользователя, используемое для входа в Elasticsearch кластер с включенной HTTP basic аутентификацией. Убедитесь, что у вас есть разрешения на доступ к путям, таким как /cluster/state/ nodes/http, и разрешения на чтение индекса.
passwordНетEmptyПароль, используемый для входа в Elasticsearch кластер.
es.typeНет_docТип индекса. Если вы хотите запрашивать данные в Elasticsearch 8 и более поздних версиях, вам не нужно настраивать этот параметр, поскольку типы сопоставления были удалены в Elasticsearch 8 и более поздних версиях.
es.nodes.wan.onlyНетFALSEУказывает, использует ли Selena только адреса, указанные в hosts, для доступа к Elasticsearch кластеру и получения данных.
  • true: Selena использует только адреса, указанные в hosts, для доступа к Elasticsearch кластеру и получения данных и не сканирует узлы данных, на которых находятся шарды Elasticsearch индекса. Если Selena не может получить доступ к адресам узлов данных внутри Elasticsearch кластера, вам нужно установить этот параметр в true.
  • false: Selena использует адреса, указанные в hosts, для сканирования узлов данных, на которых находятся шарды индексов Elasticsearch кластера. После того как Selena генерирует план выполнения запроса, BE или CN напрямую обращаются к узлам данных внутри Elasticsearch кластера для получения данных из шардов индексов. Если Selena может получить доступ к адресам узлов данных внутри Elasticsearch кластера, мы рекомендуем сохранить значение по умолчанию false.
es.net.sslНетFALSEУказывает, можно ли использовать протокол HTTPS для доступа к Elasticsearch кластеру. Только Selena v2.4 и более поздние версии поддерживают настройку этого параметра.
  • true: Для доступа к вашему Elasticsearch кластеру можно использовать как протоколы HTTPS, так и HTTP.
  • false: Для доступа к вашему Elasticsearch кластеру можно использовать только протокол HTTP.
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": "StarRocks 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 поддерживает только запросы данных из Elasticsearch кластеров с включенной HTTP basic аутентификацией.
  • Некоторые запросы, такие как запросы с участием count(), выполняются намного медленнее в Selena, чем в Elasticsearch, поскольку Elasticsearch может напрямую читать метаданные, связанные с указанным количеством документов, которые соответствуют условиям запроса, без необходимости фильтрации запрашиваемых данных.