Если исходный запрос равен match_all
, запрос для
2.1 Категории Грузовые (1765) Автомобили (1566) Любые другие (8675)
2,2 Цвета Красный (5689) Зеленый (156) Синий (3599) Желтый (2562)
будет:
{
"query": {
"match_all": {}
},
"aggs": {
"CATEGORIES": {
"terms": {
"field": "category"
}
},
"COLORS": {
"terms": {
"field": "color"
}
}
}
}
Когда выбран Freight
, то, что ожидается, объясняется шаг за шагом, как показано ниже:
1. Фильтровать записи
Это может быть достигнуто с помощью запроса условий в поле category
. Теперь, если этот запрос применяется перед агрегацией, это приводит к проблеме, упомянутой в вопросе. Фасет CATEGORIES
будет иметь счет против Frieght
, а остальные значения будут равны нулю. Хотя фасет COLORS
будет иметь ожидаемые значения. Для решения этой проблемы мы можем использовать post_filter . Это обеспечит фильтрацию записей после подготовки агрегатов.
Вот как это будет работать:
Шаг 1: match_all (исходный запрос)
Шаг 2: подготовка агрегатов
Шаг 3: применить фильтр (ожидаемый результат поиска)
С помощью вышеизложенного мы добьемся правильных отфильтрованных результатов и ожидаемого числа CATEGORIES
фасета, но число в COLORS
все еще остается тем же, что и ожидалось уменьшить в соответствии с выбором в CATEGORIES
фасете. Следующий шаг исправляет это.
2. Количество других граней, которые должны быть изменены соответственно
Чтобы справиться с этим, мы будем использовать агрегацию фильтров вместе с фактической агрегацией. Мы будем применять post_filter в каждой из оставшихся агрегаций, где должны выполняться подсчеты, т. Е. Все агрегации, кроме CATEGORIES
, который в нашем случае составляет всего COLORS
.
Сочетая два вышеупомянутых шага, запрос будет:
{
"query": {
"match_all": {}
},
"aggs": {
"CATEGORIES": {
"terms": {
"field": "category"
}
},
"COLORS": {
"filter": {
"terms": {
"category": [
"Freight"
]
},
"aggs": {
"COLORS": {
"terms": {
"field": "color"
}
}
}
}
},
"post_filter": {
"terms": {
"category": [
"Freight"
]
}
}
}
}