Лексическая структура
В данном разделе описывается основная лексическая структура SQL, которая в основном будет напоминать ANSI SQL, поэтому подробные детали низкого уровня не рассматриваются.
Elasticsearch SQL в настоящее время принимает только одну команду за раз. Команда представляет собой последовательность токенов, завершающихся концом потока ввода.
Токен может быть ключевым словом, идентификатором (в кавычках или без кавычек), литералом (или константой) или символом специального символа (обычно разделителем). Токены обычно разделяются пробелами (будь то пробелы или табуляция), но в некоторых случаях, когда нет неоднозначности (обычно из-за символа), это не требуется — однако для повышения читаемости этого следует избегать.
Ключевые слова
Рассмотрим следующий пример:
SELECT * FROM table
Этот запрос содержит четыре токена: SELECT, *, FROM и table. Первые три, а именно SELECT, * и FROM, являются ключевыми словами, то есть словами, имеющими фиксированное значение в SQL. Токен table является идентификатором, то есть он идентифицирует (по имени) сущность внутри SQL, такую как таблица (в данном случае), столбец и т. д.
Как можно видеть, ключевые слова и идентификаторы имеют одинаковую лексическую структуру, и поэтому нельзя определить, является ли токен тем или другим, не зная языка SQL; полный список ключевых слов доступен в приложении с зарезервированными ключевыми словами. Обратите внимание, что ключевые слова нечувствительны к регистру, что означает, что предыдущий пример можно записать как:
select * fRoM table;
Однако идентификаторы нечувствительны к регистру — так как Elasticsearch чувствителен к регистру, Elasticsearch SQL использует полученное значение дословно.
Для лучшего различения между ними в документации ключевые слова SQL пишутся с заглавных букв, что, по нашему мнению, повышает читаемость, и мы рекомендуем это другим.
Идентификаторы
Идентификаторы могут быть двух типов: в кавычках и без кавычек:
SELECT ip_address FROM "hosts-*"
В этом запросе есть два идентификатора: ip_address и hosts-* (шаблон индекса). Поскольку ip_address не конфликтует ни с одним ключевым словом, его можно использовать дословно, а hosts-* — нет, так как он конфликтует с - (операция вычитания) и *, поэтому используются двойные кавычки.
Еще один пример:
SELECT "from" FROM "<logstash-{now/d}>" Первый идентификатор в запросе необходимо заключить в кавычки, так как в противном случае он будет конфликтовать с ключевым словом FROM (которое нечувствительно к регистру и может быть записано как from), а второй идентификатор с использованием поддержки Elasticsearch поддержки даты и времени в именах индексов и псевдонимов индексов в противном случае создал бы путаницу для парсера.
Поэтому, в общем, особенно при работе с пользовательским вводом, крайне рекомендуется использовать кавычки для идентификаторов. Это минимально увеличивает ваши запросы, но в ответ обеспечивает ясность и устранение неоднозначности.
Литералы (Константы)
Elasticsearch SQL поддерживает два типа неявных литералов: строки и числа.
Строковые литералы
Строковый литерал — это произвольное количество символов, ограниченных одиночными кавычками ': 'Giant Robot'. Чтобы включить одиночную кавычку в строку, экранируйте её ещё одной одиночной кавычкой: 'Captain EO''s Voyage'.
Экранированная одиночная кавычка — это не двойная кавычка ("), а одиночная кавычка ', повторяющаяся ('').
Числовые литералы
Числовые литералы принимаются как в десятичной, так и в научной записи с экспоненциальной частью (e или E), начиная с цифры или десятичной точки .:
1969 -- integer notation 3.14 -- decimal notation .1234 -- decimal notation starting with decimal point 4E5 -- scientific notation (with exponent marker) 1.2e-3 -- scientific notation with decimal point
Числовые литералы, содержащие десятичную точку, всегда интерпретируются как типа double. Те, что без, считаются integer, если они подходят, в противном случае их тип — long (или BIGINT в типах ANSI SQL).
Общие литералы
При работе с литералами произвольного типа объект создаётся путём приведения, как правило, строкового представления к нужному типу. Это можно сделать с помощью специального оператора приведения и функций:
123::LONG -- cast 123 to a LONG
CAST('1969-05-13T12:34:56' AS TIMESTAMP) -- cast the given string to datetime
CONVERT('10.0.0.1', IP) -- cast '10.0.0.1' to an IP Обратите внимание, что Elasticsearch SQL предоставляет функции, которые из коробки возвращают популярные литералы (такие как E()) или предоставляют специальную обработку для определённых строк.
Одиночные и двойные кавычки
Стоит отметить, что в SQL одинарные кавычки ' и двойные кавычки " имеют разное значение и не могут использоваться взаимозаменяемо. Одинарные кавычки используются для объявления строкового литерала, а двойные кавычки — для идентификаторов.
Например:
SELECT "first_name"
FROM "musicians"
WHERE "last_name"
= 'Carroll' | Двойные кавычки | |
| Одинарные кавычки |
Для экранирования одинарных или двойных кавычек необходимо использовать ту же самую кавычку ещё раз. Например, литерал John's может быть экранирован как SELECT 'John''s' AS name. То же самое относится к экранированию двойных кавычек — SELECT 123 AS "test""number" в результате отобразит столбец с именем test"number.
Специальные символы
Несколько символов, которые не являются буквенно-цифровыми, имеют специальное значение, отличное от значения оператора. Для полноты эти символы указаны ниже:
Символ | Описание |
| Звездочка (или символ подстановки) используется в некоторых контекстах для обозначения всех полей таблицы. Также может использоваться в качестве аргумента для некоторых агрегирующих функций. |
| Запятые используются для перечисления элементов списка. |
| Используется в числовых константах или для разделения квалификаторов идентификаторов (каталоги, таблицы, имена столбцов и т. д.). |
| Скобки используются для определённых команд SQL, объявлений функций или для установления приоритетов. |
Операторы
Большинство операторов в Elasticsearch SQL имеют одинаковый приоритет и являются левоассоциативными. Поскольку это делается во время парсинга, для принудительного изменения приоритета необходимо использовать скобки.
В следующей таблице указаны поддерживаемые операторы и их приоритет (от самого высокого к самому низкому);
Оператор/Элемент | Ассоциативность | Описание |
| слева | разделитель квалификатора |
| слева | приведение типов в стиле PostgreSQL |
| справа | унарный плюс и минус (знак числовой литералы) |
| слева | умножение, деление, остаток от деления |
| слева | сложение, вычитание |
| содержат диапазон, соответствие строк | |
| сравнение | |
| справа | логическое отрицание |
| слева | логическое И |
| слева | логическое ИЛИ |
Комментарии
Elasticsearch SQL позволяет использовать комментарии, которые представляют собой последовательность символов, игнорируемых анализаторами.
Поддерживаются два стиля:
- Одна строка
- Комментарии начинаются с двух дефисов
--и продолжаются до конца строки. - Несколько строк
- Комментарии, которые начинаются с
/*и заканчиваются*/(также известный как стиль C).
-- single line comment /* multi line comment that supports /* nested comments */ */
© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/8.17/sql-lexical-structure.html