Язык запросов DQL
Язык запросов Dashboards (DQL) — это простой текстовый язык запросов, используемый для фильтрации данных в "Панелях мониторинга".
Настройка
В качестве примера для настройки необходимо выполнить следующие шаги:
- Шаг 1: Настроить сопоставления для индекса
В главном меню выбрать "Управление Инструменты разработки". Отправить следующий запрос для создания сопоставлений индексов:
PUT testindex
{
"mappings" : {
"properties" : {
"date" : {
"type" : "date",
"format" : "yyyy-MM-dd"
}
}
}
}
- Шаг 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"
}
- Шаг 3: Создать шаблон индекса
Выполнить следующие действия, чтобы создать шаблон индекса для индекса:
- в главном меню выбрать "Управление Управление Dashboards";
- выбрать "Шаблоны индексов", а затем нажать Создать шаблон индексов;
- в поле "Название шаблона индекса" ввести "testindex*"; выбрать "Следующий шаг";
- в поле "Время" выбрать "I don't want to use the time filter";
- нажать Создать шаблон индекса.
- Шаг 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}}