diff --git a/src/ElasticSearch/Domain/SearchResultFactory.php b/src/ElasticSearch/Domain/SearchResultFactory.php index a9a132a747324c3dee6a1171a52513e3015e5409..68d7f8aa6ff038526eee779f81bac543e06e6aec 100644 --- a/src/ElasticSearch/Domain/SearchResultFactory.php +++ b/src/ElasticSearch/Domain/SearchResultFactory.php @@ -40,8 +40,40 @@ final class SearchResultFactory if (isset($data['aggregations']['keyword_facet']['agg_keyword_facet_code']['buckets'])) { $buckets = $data['aggregations']['keyword_facet']['agg_keyword_facet_code']['buckets']; $bucketsFiltered = []; + + $aKeys = array_keys($data['aggregations']); + foreach ($aKeys as $sKey) { + if (strpos($sKey, 'keyword_facet_filtered_') !== false) { + $sCode = substr($sKey, strlen('keyword_facet_filtered_')); + if (isset($data['aggregations'][$sKey]['all_keyword_facet_filtered_' . $sCode]['agg_keyword_facet_code']['buckets'])) { + foreach ($data['aggregations'][$sKey]['all_keyword_facet_filtered_' . $sCode]['agg_keyword_facet_code']['buckets'] as $bucket) { + $bucketsFiltered[$bucket['key']] = []; + foreach ($bucket['agg_keyword_facet_value']['buckets'] as $values) { + $bucketsFiltered[$bucket['key']][$values['key']] = $values; + } + } + } + } + + if (strpos($sKey, 'all_keyword_facet_filtered_') !== false) { + $sCode = substr($sKey, strlen('all_keyword_facet_filtered_')); + if (isset($data['aggregations']['all_keyword_facet_filtered_' . $sCode]['agg_keyword_facet_code']['buckets'])) { + foreach ($data['aggregations']['all_keyword_facet_filtered_' . $sCode]['agg_keyword_facet_code']['buckets'] as $bucket) { + $bucketsFiltered[$bucket['key']] = []; + foreach ($bucket['agg_keyword_facet_value']['buckets'] as $values) { + $bucketsFiltered[$bucket['key']][$values['key']] = $values; + } + } + } + } + } + if (isset($data['aggregations']['keyword_facet_filtered']['all_keyword_facet_filtered']['agg_keyword_facet_code']['buckets'])) { foreach ($data['aggregations']['keyword_facet_filtered']['all_keyword_facet_filtered']['agg_keyword_facet_code']['buckets'] as $bucket) { + if (isset($bucketsFiltered[$bucket['key']])) { + continue; + } + $bucketsFiltered[$bucket['key']] = []; foreach ($bucket['agg_keyword_facet_value']['buckets'] as $values) { $bucketsFiltered[$bucket['key']][$values['key']] = $values; diff --git a/src/ElasticSearch/Domain/SearchService.php b/src/ElasticSearch/Domain/SearchService.php index 277c171ec93766e244da5013a6e19d795778931a..d55f20edcff055bb281279c38f0c83593543a251 100644 --- a/src/ElasticSearch/Domain/SearchService.php +++ b/src/ElasticSearch/Domain/SearchService.php @@ -14,6 +14,7 @@ use IQDEV\ElasticSearch\Search\Pagination; use IQDEV\ElasticSearch\Search\Request; use Elastic\Elasticsearch\Client; use IQDEV\Search\{Filter\Filter, + Filter\FilterCollection, Filter\FilterKeyword, Filter\FilterCategory, Filter\FilterNumber, @@ -44,8 +45,6 @@ final class SearchService implements DomainSearchService { $request = new Request(); $commonQuery = new Query(); - $filterKeyword = new Query(); - $filterNumber = new Query(); if ($q->filters) { foreach ($q->filters as $filter) { @@ -56,21 +55,8 @@ final class SearchService implements DomainSearchService ); continue; } - - if ($filter instanceof FilterNumber) { - $oFacet = new FilterNumberFacet($filter->key, $filter->min, $filter->max); - $filterNumber->filter($oFacet); - $commonQuery->filter($oFacet); - continue; - } - - if ($filter instanceof FilterKeyword) { - $oFacet = new FilterKeywordFacet($filter->key, $filter->value); - $filterKeyword->filter($oFacet); - $commonQuery->filter($oFacet); - continue; - } } + $commonQuery = $this->getQuery($q->filters); } $commonFilter = clone $commonQuery; $commonFilter->setType(Query::TYPE_FILTER); @@ -80,7 +66,7 @@ final class SearchService implements DomainSearchService new Pagination($q->pagination->limit, $q->pagination->page) ); } - + if ($q->sorting && !$q->sorting->isEmpty()) { $oSortingCollection = new SortingCollection(); foreach ($q->sorting as $sorting) { @@ -103,34 +89,53 @@ final class SearchService implements DomainSearchService $request->addMatch('full_search_content', ['query' => $q->query]); } - if ($filterKeyword->isEmpty() === false) { - $nestedFilterKeyword = new Nested(); - $nestedFilterKeyword->setPath('search_data') - ->setQuery($filterKeyword); - } - - if ($filterNumber->isEmpty() === false) { - $nestedFilterNumber = new Nested(); - $nestedFilterNumber->setPath('search_data') - ->setQuery($filterNumber); - } - if ($commonQuery->isEmpty() === false) { $nestedFilter = new Nested(); $nestedFilter->setPath('search_data') ->setQuery($commonQuery); - + $request->getPostFilter()->filter($nestedFilter); $aggsKeywordFiltered = new Aggs('keyword_facet_filtered'); $aggsKeywordFiltered->addAggs(AggsKeyWordFacet::create('all_keyword_facet_filtered', 'keyword_facet')) ->setQuery($commonFilter); $request->getAggs()->add($aggsKeywordFiltered); - + $aggsNumberFiltered = new Aggs('number_facet_filtered'); $aggsNumberFiltered->addAggs(AggsNumberFacet::create('all_number_facet_filtered', 'number_facet')) ->setQuery($commonFilter); $request->getAggs()->add($aggsNumberFiltered); + + foreach ($q->filters as $filter) { + if ($filter instanceof FilterKeyword) { + $oFilters = new FilterCollection(); + foreach ($q->filters as $filter2) { + if (!($filter2 instanceof Filter) || $filter2 instanceof FilterCategory) { + continue; + } + + if ($filter->key() === $filter2->key()) { + continue; + } + $oFilters->add($filter2); + } + if ($oFilters->isEmpty()) { + $aggsKeywordFiltered = AggsKeyWordFacet::create('all_keyword_facet_filtered_' . $filter->key( + ), + 'keyword_facet' + ); + } else { + $aggsKeywordFiltered = new Aggs('keyword_facet_filtered_' . $filter->key()); + $aggsKeywordFiltered->addAggs(AggsKeyWordFacet::create('all_keyword_facet_filtered_' . $filter->key( + ), + 'keyword_facet' + ) + ); + $aggsKeywordFiltered->setQuery($this->getQuery($oFilters)); + } + $request->getAggs()->add($aggsKeywordFiltered); + } + } } $aggsKeyword = AggsKeyWordFacet::create('keyword_facet', 'keyword_facet'); @@ -148,4 +153,24 @@ final class SearchService implements DomainSearchService return SearchResultFactory::createFromResponse($response, $request); } + + private function getQuery(FilterCollection $filters): Query + { + $commonQuery = new Query(); + foreach ($filters as $filter) { + if ($filter instanceof FilterNumber) { + $oFacet = new FilterNumberFacet($filter->key, $filter->min, $filter->max); + $commonQuery->filter($oFacet); + continue; + } + + if ($filter instanceof FilterKeyword) { + $oFacet = new FilterKeywordFacet($filter->key, $filter->value); + $commonQuery->filter($oFacet); + continue; + } + } + + return $commonQuery; + } } diff --git a/src/ElasticSearch/Search/Aggs/AggsKeyWordFacet.php b/src/ElasticSearch/Search/Aggs/AggsKeyWordFacet.php index 482fa161a50822ec4d927d7698745abcc2c1dcec..7b0c308ee3e8ab8f85beea9a165089e7e661caf3 100644 --- a/src/ElasticSearch/Search/Aggs/AggsKeyWordFacet.php +++ b/src/ElasticSearch/Search/Aggs/AggsKeyWordFacet.php @@ -14,8 +14,14 @@ final class AggsKeyWordFacet $aggKeywordFacet->setNested($nested); $aggKeywordFacetCode = new Aggs("agg_{$facet}_code"); + + $aOptions = []; + if (stripos($code, 'all_keyword_facet_filtered_') !== false) { + $aOptions = ['include' => substr($code, strlen('all_keyword_facet_filtered_'))]; + } + $aggKeywordFacetCode->setTerms( - (new Terms("{$path}.{$facet}.facet_code")) + (new Terms("{$path}.{$facet}.facet_code", $aOptions)) ->setSize(250) ); diff --git a/src/ElasticSearch/Search/Aggs/Terms.php b/src/ElasticSearch/Search/Aggs/Terms.php index 582d06927bc90628014935611487e17bdc95cc30..513eaa171a4a48163c694578980f8f07df694642 100644 --- a/src/ElasticSearch/Search/Aggs/Terms.php +++ b/src/ElasticSearch/Search/Aggs/Terms.php @@ -13,9 +13,10 @@ final class Terms implements Esable /** * @param string $field */ - public function __construct(string $field) + public function __construct(string $field, array $options = []) { $this->field = $field; + $this->options = $options; } public function setSize(int $size): self