Введение в язык запросов Query DSL

Язык запросов Query DSL (Domain Specific Language) основан на синтаксисе JSON.

Существуют следующие типы запросов:

  • Leaf query – поиск определенных значений в определенном поле;

  • Compound query – составные запросы, используются для логического объединения нескольких запросов.

Полнотекстовые запросы позволяют осуществлять поиск по анализируемым текстовым полям. Выделяют следующие основные виды полнотекстовых запросов:

  • Match query – возвращает документы, которые соответствуют указанному тексту, числу, дате или логическому значению;

  • Match phrase query – возвращает документы, которые соответствуют указанной фразе); в отличие от match query, в данном запросе строка интерпретируется как единое целое "this is a test";

  • Query string – возвращает документы на основе строки запроса, используя синтаксический анализатор со строгим синтаксисом); запрос использует синтаксис для анализа и разделения строки запроса на основе аналитиков "AND" и "OR"; затем независимо анализируется каждая разделенная часть текста.

Основными параметрами в запросе Match query являются:

  • field – поле, по значениям которого осуществляется поиск;

  • query – текст, число, дата или логическое значение, которое нужно найти в выбранном поле;

  • operator – один из логических аналитиков "AND" и "OR" (по умолчанию); при использовании аналитика "AND" запрос интерпретирует строку "this is a test" как "this AND is AND a AND test"; при использовании аналитика "OR" - как "this OR is OR a OR test":

GET /_search
{
    "query": {
        "match": {
            "message": {
                "query": "this is a test",
                "operator": "and"
            }
        }
    }
}

Основным параметром в запросе Match phrase query является: field – поле, по значениям которого осуществляется поиск:

GET /_search
{
    "query": {
        "match_phrase": {
            "message": "this is a test"
        }
    }
}

Основными параметрами в запросе Query string query являются:

  • query – строка запроса, которая используется для поиска;

  • default_field – поле, по значениям которого осуществляется поиск:

GET /_search
{
    "query": {
        "query_string": {
            "query": "(new york city) OR (big apple)",
            "default_field": "content"
        }
    }
}

Сложные запросы позволяют объединять более простые или другие сложные запросы и выводить обобщенные результаты. Среди них можно выделить тип запросов Bool.

Bool query – запрос, который осуществляет поиск с использованием логической комбинации других запросов. Запрос строится с использованием одного или нескольких логических предложений, каждое из которых имеет типизированное вхождение:

  • must – предложение должно появляться в документах;

  • filter – предложение должно появляться в документах;

  • must_not – предложение не должно появляться в документах;

  • should – предложение может появляться в документах:

GET _search
{
    "query": {
        "bool": {
            "must": {
                "term": { "user": "Admin" }
            },
            "filter": {
                "term": { "tag": "tech" }
            },
            "must_not": {
                "range": {
                    "age": { "gte": 10, "lte": 20 }
                }
            },
            "should": [
                { "term": { "tag": "wow" } },
                { "term": { "tag": "opensearch" } }
            ]
        }
    }
}

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

Запросы такого типа используются для поиска документов на основе точных значений в структурированных данных.

Выделяют следующие основные виды запросов на уровне терминов:

  • exists query – возвращает документы, которые содержат индексированное значение в указанном поле;

  • range query – возвращает документы, которые содержат значения в указанном диапазоне;

  • regexp query – возвращает документы, содержащие значения, соответствующие регулярному выражению;

  • term query – возвращает документы, которые содержат точное значение в указанном поле, не рекомендуется использовать для поиска по текстовым полям;

  • terms query – аналогичен term query, возвращает документы, содержащие одно или несколько точных значений в указанном поле;

  • wildcard – возвращает документы, содержащие значения, соответствующие указанному шаблону; в шаблоне аналитик "*" соответствует 0 и более символов, аналитик "?" соответствует одному любому символу.

Основным параметром в запросе Exists query является: field – поле, которое необходимо найти:

GET /_search
{
  "query": {
        "exists": {
          "field": "user"
        }
    }
}

Основными параметрами в запросе Range query являются:

  • field – поле, по значениям которого осуществляется поиск;

  • gt – аналитик "больше";

  • gte – аналитик "больше или равно";

  • lt – аналитик "меньше";

  • lte – аналитик "меньше или равно":

GET _search
{
    "query": {
        "range": {
            "age": {
                "gte": 10,
                "lte": 20
            }
        }
    }
}

Основными параметрами в запросе Regexp query являются:

  • field – поле, по значениям которого осуществляется поиск;

  • value – регулярное выражение для поиска значений:

GET /_search
{
    "query": {
        "regexp": {
            "user": {
                "value": "A.*n"
            }
        }
    }
}

Основными параметрами в запросе Term query являются:

  • field – поле, по значениям которого осуществляется поиск;

  • value – значение, которое нужно найти в выбранном поле:

GET /_search
{
    "query": {
        "term": {
            "user": {
                "value": "Admin"
            }
        }
    }
}

Основным параметром в запросе Terms query является: field – поле, по значениям которого осуществляется поиск:

GET /_search
{
    "query": {
        "terms": {
            "user": ["Admin ", "User"]
        }
    }
}

Основными параметрами в запросе Wildcard query являются:

  • field – поле, по значениям которого осуществляется поиск;

  • value – шаблон запроса, по которому нужно найти значение в выбранном поле:

GET /_search
{
    "query": {
        "wildcard": {
            "user": {
                "value": "Ad*n"
            }
        }
    }
}