Язык запросов DQL

Язык запросов Dashboards (DQL) — это простой текстовый язык запросов, используемый для фильтрации данных в "Панелях мониторинга".

Настройка

В качестве примера для настройки необходимо выполнить следующие шаги:

  1. Шаг 1: Настроить сопоставления для индекса

В главном меню выбрать "Управление Инструменты разработки". Отправить следующий запрос для создания сопоставлений индексов:

PUT testindex
{
"mappings" : {
"properties" :  {
"date" : {
"type" : "date",
"format" : "yyyy-MM-dd"
}
}
}
}
  1. Шаг 2: Вставить документы в индекс

В "Инструменты разработки" добавить в индекс следующие документы:

PUT /testindex/_doc/1
{
"title": "The wind rises",
"description": "A biographical film",
"media_type": "film",
"date": "2013-07-20",
"page_views": 100
}
PUT /testindex/_doc/2
{
"title": "Gone with the wind",
"description": "A well-known 1939 American epic historical film",
"media_type": "film",
"date": "1939-09-09",
"page_views": 200
}
PUT /testindex/_doc/3
{
"title": "Chicago: the historical windy city",
"media_type": "article",
"date": "2023-07-29",
"page_views": 300
}
PUT /testindex/_doc/4
{
"article title": "Wind turbines",
"media_type": "article",
"format": "2*3"
}
  1. Шаг 3: Создать шаблон индекса

Выполнить следующие действия, чтобы создать шаблон индекса для индекса:

  1. в главном меню выбрать "Управление Управление Dashboards";
  2. выбрать "Шаблоны индексов", а затем нажать Создать шаблон индексов;
  3. в поле "Название шаблона индекса" ввести "testindex*"; выбрать "Следующий шаг";
  4. в поле "Время" выбрать "I don't want to use the time filter";
  5. нажать Создать шаблон индекса.
  6. Шаг 4: Перейти к поиску и выбрать шаблон индекса

В главном меню выбрать "Обнаружение". В левом верхнем углу выбрать "testindex*" из выпадающего списка "Шаблоны индекса". На главной панели отобразятся документы в индексе, и можно будет опробовать запросы DQL, описанные в этом пункте.

Примечание – В секциях "Поля объектов" и "Вложенные поля" есть ссылки на дополнительную настройку, необходимую для выполнения запросов в этих разделах.

По умолчанию DQL выполняет поиск в поле, заданном в качестве поля по умолчанию в индексе. Если поле по умолчанию не задано, DQL выполняет поиск во всех полях. Например, следующий запрос ищет документы, содержащие слова rises или wind в любом из этих полей:

rises wind

Предыдущий запрос соответствует документам, в которых встречается любое поисковое выражение, независимо от порядка. По умолчанию DQL объединяет поисковые выражения с помощью "or".

Чтобы выполнить поиск по фразе (упорядоченной последовательности слов), необходимо заключить текст в кавычки. Например, следующий запрос ищет точный текст "wind rises":

"wind rises"

Следует обратить внимание, что дефисы являются зарезервированными символами в Lucene, поэтому, если поисковый запрос содержит дефисы, DQL может предложить перейти на синтаксис Lucene. Чтобы этого избежать, нужно заключить поисковый запрос в кавычки при поиске по фразе или пропустить дефис при обычном поиске.

Зарезервированные символы

Ниже приведен список зарезервированных символов в DQL:

\ ( ) : < > " *

Рекомендуется использовать обратную косую черту "" для экранирования зарезервированных символов. Например, чтобы найти выражение "2*3", следует указать запрос как "2*3".

Поиск в поле

Чтобы выполнить поиск текста в определенном поле, нужно указать название поля перед двоеточием:

title: rises wind

Анализатор поля, по которому выполняется поиск, разбивает текст запроса на токены и сопоставляет документы, в которых встречаются любые из этих токенов.

DQL игнорирует символы пробела, поэтому "title:rises wind" и "title: rises wind" – это одно и то же.

Рекомендуется использовать подстановочные знаки для обозначения имен полей, содержащих пробелы. Например, "article*title" соответствует полю "article title".

Имена полей

Имя поля указывают перед двоеточием. В таблице 14 приведены примеры запросов с именами полей.

Подстановочные знаки

DQL поддерживает подстановочные знаки (только "*" ) как в условиях поиска, так и в названиях полей, например:

t*le: *wind and rise*

Диапазоны

DQL поддерживает числовые неравенства с помощью операторов >, <, >= и <=, например:

page_views > 100 and page_views <= 300

Можно использовать операторы диапазона для дат. Например, следующий запрос ищет документы, содержащие даты в диапазоне 2013–2023 гг., включительно:

date >= "2013-01-01" and date < "2024-01-01"

Можно выполнить запрос "не равно" с помощью not и имени поля, например:

not page_views: 100

Следует обратить внимание, что предыдущий запрос возвращает документы, в которых либо поле page_views не содержит 100, либо поле отсутствует. Чтобы отфильтровать документы, содержащие поле page_views, используют следующий запрос:

page_views:* and not page_views: 100

Логические операторы

DQL поддерживает логические операторы and, or, и not. DQL не чувствителен к регистру, поэтому AND и and — это одно и то же. Например, следующий запрос представляет собой конъюнкцию двух логических предложений:

title: wind and description: epic

Логические операторы следуют логическому порядку приоритета not, and, и or, поэтому в следующем примере "title: wind and description: epic" вычисляется первым:

media_type: article or title: wind and description: epic

Чтобы задать порядок вычисления, нужно заключить логические выражения в скобки. Например, в следующем запросе выражение в скобках вычисляется первым:

(media_type: article or title: wind) and description: epic

Префикс поля относится к токену, который следует сразу за двоеточием. Например, следующий запрос ищет документы, в которых поле title содержит windy или документы, содержащие слово historical в любом из своих полей:

title: windy or historical

Чтобы найти документы, в которых поле title содержит windy или historical, следует объединить термины в скобках:

title: (windy or historical)

Предыдущий запрос эквивалентен этому:

title: windy or title: historical

Чтобы инвертировать запрос, используют оператор not . Например, следующий запрос ищет документы, которые содержат слово wind в поле title, не относятся к media_type article и не содержат epic в поле description:

title: wind and not (media_type: article or description: epic)

Запросы могут содержать несколько уровней группировки, например:

title: ((wind or windy) and not rises)

Поля объектов

Чтобы обратиться к внутреннему полю объекта, нужно указать путь к полю с помощью точек.

Чтобы выполнить поиск по полю name объекта patient, используют следующий синтаксис:

patient.name: john

Вложенные поля

Чтобы сослаться на вложенный объект, нужно указать JSON-путь к полю.

Для поиска по полю name объекта patients используют следующий синтаксис:

patients: {name: john}

Чтобы получить документы, соответствующие нескольким полям, требуется указать все поля.

Дважды вложенные поля

Рассмотрим документ с вложенным полем. В этом документе поля patients и names имеют тип nested:

{
"patients": [
{
"names": [
{ "name": "John Doe", "age": 56, "smoker": true },
{ "name": "Mary Major", "age": 85, "smoker": false}
]
}
]
}

Для поиска по полю name объекта patients используют следующий синтаксис:

patients: {names: {name: john}}