Фильтрация товаров по динамическим вложенным полям с агрегированием в elasticsearch
Есть такой mapping для индекса с товарами с динамическими nested аттрибутами
'properties' => [
'facet' => [
'type' => 'nested',
'properties' => [
'facet-name' => [ 'type' => 'keyword'],
'facet-value' => ['type' => 'keyword'],
]
],
]
Создаю запросы фильтрации товаров
$filters = [];
По бренду
$filter[] = [
'bool' => [
'filter' => [
['term' => ['brand' => $brand]],
]
]
];
Все выбранные фильтры
$filters['bool']['must'] = $filter;
if (!empty($params['filter'])) {
foreach ($params['filter'] as $option => $values) {
$i = 0;
$filter = [];
$filter['nested']['path'] = 'text_facet';
foreach ($values as $value) {
$filter['nested']['query']['bool']['should'][$i]['bool']['filter'][]['term']['facet.facet-name'] = $option;
$filter['nested']['query']['bool']['should'][$i]['bool']['filter'][]['term']['facet.facet-value'] = $value;
$i++;
}
$filters['bool']['filter'][] = $filter;
}
}
if($filters){
$query->query($postFilters);
}
Делаю запрос на агрегацию
$query->addAggregate('agg_facet', [
'facet' => [
'nested' => [
'path' => 'facet',
],
'aggs' => [
'values' => [
'terms' => [
'field' => 'facet.facet-name',
'size' => 10000,
],
'aggs' => [
'facet-value' => [
'terms' => [
'field' => 'facet.facet-value',
'size' => 10000,
],
],
]
]
]
]
]);
В таком случае если я отмечу в фильтре color = black, то товары выводятся как необходимо. А в фильтре в выборе цвета остается только black.
Я решил это таким способом.
Создаю запросы фильтрации товаров
$filters = [];
По бренду
$filter[] = [
'bool' => [
'filter' => [
['term' => ['brand' => $brand]],
]
]
];
$filters['bool']['must'] = $filter;
if($filters){
$query->query($filters);
}
Делаю запрос на агрегацию с фильтром
$query->addAggregate('agg_facet', [
"filter" => [
'bool' => [
'filter' => [
"term" => ["brand"=> $brand],
]
]
],
'aggs' => [
'facet' => [
'nested' => [
'path' => 'facet',
],
'aggs' => [
'values' => [
'terms' => [
'field' => 'facet.facet-name',
'size' => 10000,
],
'aggs' => [
'facet-value' => [
'terms' => [
'field' => 'facet.facet-value',
'size' => 10000,
],
],
]
]
]
]
]
]);
Создаю запросы в post_filter
$postFilters = [];
if (!empty($params['filter'])) {
foreach ($params['filter'] as $option => $values) {
$i = 0;
$postFilter = [];
$postFilter['nested']['path'] = 'text_facet';
foreach ($values as $value) {
$postFilter['nested']['query']['bool']['should'][$i]['bool']['filter'][]['term']['facet.facet-name'] = $option;
$postFilter['nested']['query']['bool']['should'][$i]['bool']['filter'][]['term']['facet.facet-value'] = $value;
$i++;
}
$postFilters['bool']['filter'][] = $postFilter;
}
}
if($postFilters){
$query->PostFilter($postFilters);
}
Товары выводятся, как необходимо. Но теперь проблема в том, что в фильтре выводится весь доступный список характеристик и значений для бренда, что ожидаемо. При выборе цвета color=black покажет только товары, которые соответствуют критериям и останется возможность выбрать другой цвет из списка. Но другие фильтры при выборе цвета теперь не меняются исходя из заданных критериев. Как сделать так, чтобы колонка где выбирается значение не изменяла свой список доступных значений, а остальные при этом менялись? Точнее список не менялся бы, но значения при которых если выбрать вместе с цветом black сделать disabled, если товаров нет по таким критериям.