Когда необходимо взаимодействовать с кластером Elasticsearch для выполнения сложного полнотекстового поиска или анализа данных, язык предметной области (DSL) — ваш лучший выбор. Являясь основанным на JSON языком запросов, родным для Elasticsearch, DSL позволяет ясно и точно выражать сложную логику запросов, предоставляя при этом детальный контроль над тем, как выполняются запросы.
Elasticsearch Query DSL — это JSON‑основанный язык запросов, определяющий структуру и семантику запросов поиска и извлечения данных. Он содержит два контекста:
Запросы DSL обычно выполняются в Dev Tools Kibana. И тело запроса, и возвращаемая информация находятся в формате JSON.
В этой теме перечислены некоторые из наиболее часто используемых клаузул DSL‑запросов. Подробнее см. Query DSL.
Используйте match_all для сопоставления всех документов в индексе. Это эквивалентно SELECT * FROM table в SQL. Применяйте его, когда необходимо искать по всем документам.
Например, выполните следующую команду, чтобы сопоставить все документы в индексе test:
123456GET /test/_search{"query": {"match_all": {}}}
Используйте bool‑запрос с клаузулами, такими как must и filter, для построения составных условий запроса. Это аналогично клаузуле where в SQL. Применяйте этот запрос, когда необходимо задать несколько условий для фильтрации документов.
Например, выполните следующую команду, чтобы получить все документы, у которых статус — published и поле publish_date позже 2015-01-01 (условие фильтра), а заголовок или содержание содержат Search (условие поиска).
GET /_search{"query": {"bool": {"must": [{"match": {"title": "Search"}},{"match": {"content": "search"}}],"filter": [{"term": {"status": "published"}},{"range": {"publish_date": {"gte": "2015-01-01"}}}]}}}
Различия между must и filter следующие:
Для условий, не требующих оценки релевантности (например, статус, диапазон времени и категория), используйте filter для повышения производительности запросов.
Структура aggs (например, terms aggregation) используется для выполнения запросов агрегации. Она аналогична оператору Group by в SQL. Используйте её, когда необходимо группировать документы для расчёта метрик.
Например, выполните следующую команду, чтобы подсчитать, сколько раз разные заголовки встречаются в индексе test:
GET /test/_search{"aggs": {"titles": {"terms": {"field": "title.keyword"}}}}
Причина использования title.keyword следующая:
По умолчанию кластер автоматически создаёт multi-fields для строк. Это означает, что title используется для поиска, а title.keyword — для агрегаций.