Научимся сохранять область действия условий в nested и геопоиске.
- Одна nested-область
- Отрицание и родительский уровень
- География и связи
Научимся сохранять область действия условий в nested и геопоиске.
Курс ориентирован на Elasticsearch 9.4.3. Разборы упражнений используют публичный набор products; остальные запросы показывают отдельные учебные индексы и могут требовать подготовки или прав, недоступных в тренажёре. Ответы сокращены, score может меняться. Для расширенных функций проверяйте лицензию и вариант развёртывания.
Одна nested-область
seller=A и price<60 должны находиться внутри одного nested query по offers. Два независимых nested query могут совпасть с разными предложениями. inner_hits показывает найденные дочерние объекты; корневой _source сам по себе не ограничивается ими. score_mode определяет, как дочерние оценки влияют на родителя, а none полезен, когда nested нужен только как ограничение.
СамопроверкаОтрицание и родительский уровень
must_not внутри nested запрещает условие для конкретного предложения, но товар может пройти через другое предложение. Чтобы исключить все товары, у которых есть запрещённый продавец, nested с этим продавцом помещают в корневой must_not. Это пример того, как место отрицания меняет квантор: «есть подходящий» и «нет запрещённых» логически различаются.
СамопроверкаГеография и связи
geo_point хранит координату, geo_distance отбирает в радиусе; geo_shape предназначен для пространственных форм. Проверяйте порядок координат: массив GeoJSON использует longitude, latitude. Геофильтр не обязан означать сортировку по расстоянию — её задают отдельно. Parent-child запросы применяют, когда стоимость join и требования routing оправданы моделью обновлений.
Оба ограничения проверяются на одном предложении продавца.
{
"query": {
"nested": {
"path": "offers",
"score_mode": "none",
"query": {
"bool": {
"filter": [
{
"term": {
"offers.seller": "A"
}
},
{
"range": {
"offers.price": {
"lt": 60
}
}
}
]
}
},
"inner_hits": {
"size": 3
}
}
}
}Как читать результат
Оба ограничения проверяются на одном предложении продавца.
Разбор на примере каталога
Для offers=[{seller:A, price:100},{seller:B, price:50}] запрос «A дешевле 60» должен вернуть ноль товаров. Для «нет ни одного продавца B» этот товар тоже не подходит. Но формулировка «есть предложение не от B» ему соответствует через продавца A. Разница между последними условиями показывает, почему внутренний must_not нельзя механически заменять корневым. Проверяйте отдельные дочерние объекты через inner_hits, чтобы увидеть, какая ветвь действительно сработала.
СамопроверкаСамопроверка
Сначала ответьте самостоятельно, затем раскройте объяснение.
1. Почему два nested могут ошибаться?
Они могут выбрать разные объекты offers.
2. Что показывает inner_hits?
Дочерние объекты, которые удовлетворили nested-запросу.
3. Как исключить любой запрещённый offer?
Поместить nested с запрещённым условием в корневой must_not.
4. Какой порядок координат GeoJSON?
Долгота, затем широта.
5. Радиус сортирует результаты?
Нет, сортировка по расстоянию задаётся отдельно.
Ситуационный разбор модуля: Query DSL
Нужны доступные товары, у которых бренд Sony или цена ниже 100, с названием, содержащим headphones. После добавления фильтра выдача неожиданно расширилась. Найдите ошибку should и объясните влияние каждого условия на score.
Критерии самопроверки
Обязательный текст находится в must, ограничения в filter, альтернативы требуют минимум одного совпадения. Есть отрицательный пример товара без нужного бренда и цены.
Краткая памятка
- Они могут выбрать разные объекты offers.
- Дочерние объекты, которые удовлетворили nested-запросу.
- Поместить nested с запрещённым условием в корневой must_not.
- Долгота, затем широта.
- Нет, сортировка по расстоянию задаётся отдельно.
Официальная документация
Готовы применить знания?
Подтвердите прочтение, чтобы сохранить своё место. Чтение и решение заданий учитываются отдельно в этом браузере с помощью гостевой cookie.