Loading src/ElasticSearch/Config/product.mappings.php +5 −1 Original line number Diff line number Diff line Loading @@ -20,7 +20,11 @@ return [ ], 'rating' => [ 'type' => 'double', 'index' => false, 'index' => true, ], 'new' => [ 'type' => 'boolean', 'index' => true ], 'popular' => [ 'type' => 'double', Loading src/ElasticSearch/Converter/Request/Aggregation/Aggregation.php +31 −21 Original line number Diff line number Diff line Loading @@ -23,29 +23,39 @@ class Aggregation public function convertToQuery(): void { $queryFilterCollection = $this->criteria->getFilters()->getFilterCollectionByType(FilterType::QUERY); if (false === $this->criteria->getSearch()->isEmpty() || false === $this->criteria->getFilters()->isEmpty()) { $this->aggregations->add( AggsFacetTerms::create( 'keyword_facet', 'keyword_facet' 'keyword_facet', 'keyword_facet' ) ); $this->aggregations->add( AggsFacetStats::create( 'number_facet', 'number_facet' 'number_facet', 'number_facet' ) ); $postFilterCollection = $this->criteria->getFilters()->getFilterCollectionByType(FilterType::POST); $filterAggregation = new FilterAggregation($this->configuration, $postFilterCollection); $filterAggregation = new FilterAggregation($this->configuration, $queryFilterCollection); $filterAggregation->updateRequestAggregation($this->aggregations); $fullAggregation = new FullAggregation($this->configuration, $postFilterCollection); $fullAggregation = new FullAggregation($this->configuration, $queryFilterCollection); $fullAggregation->updateRequestAggregation($this->aggregations); } if (false === $this->criteria->getAggs()->isEmpty()) { $propertyAggregation = new PropertyAggregation( $this->configuration, $queryFilterCollection, $this->criteria->getAggs(), ); $propertyAggregation->updateRequestAggregation($this->aggregations); } } public function getAggregation(): AggsCollection { return $this->aggregations; Loading src/ElasticSearch/Converter/Request/Aggregation/PropertyAggregation.php 0 → 100644 +55 −0 Original line number Diff line number Diff line <?php declare(strict_types=1); namespace IQDEV\ElasticSearch\Converter\Request\Aggregation; use IQDEV\ElasticSearch\Configuration; use IQDEV\ElasticSearch\Converter\Request\FilterQuery; use IQDEV\ElasticSearch\Criteria\Filter\Collection\FilterCollection; use IQDEV\ElasticSearch\Document\Property\PropertyType; use IQDEV\ElasticSearch\Search\Aggs\Aggs; use IQDEV\ElasticSearch\Search\Aggs\AggsCollection; use IQDEV\ElasticSearch\Search\Aggs\Terms; class PropertyAggregation { public function __construct( private readonly Configuration $configuration, private readonly FilterCollection $filterCollection, private readonly \IQDEV\ElasticSearch\Criteria\Aggs\AggsCollection $aggsCollection, ) { } public function updateRequestAggregation(AggsCollection $original): void { $queryFilterBuilder = new FilterQuery($this->configuration, $this->filterCollection); $query = $queryFilterBuilder->getQuery(); /** @var \IQDEV\ElasticSearch\Criteria\Aggs\Aggs $aggs */ foreach ($this->aggsCollection as $aggs) { $property = $aggs->getProperty(); if ($property->getType() !== PropertyType::BASE) { continue; } $aggs = new Aggs($property->getKey()); if (false === $query->isEmpty()) { $aggs->setQuery($query); $aggs->addAggs( (new Aggs($property->getKey())) ->setTerms(new Terms($property->getKey())) ); } else { $aggs->setTerms(new Terms($property->getKey())); } $aggs->addAggs( (new Aggs($property->getKey())) ->setTerms(new Terms($property->getKey())) ); $original->add($aggs); } } } src/ElasticSearch/Converter/Request/CriteriaRequestBuilder.php +1 −3 Original line number Diff line number Diff line Loading @@ -40,10 +40,8 @@ class CriteriaRequestBuilder extends RequestBuilder $this->setFilter(); } if (false === $this->criteria->getSearch()->isEmpty() || false === $this->criteria->getFilters()->isEmpty()) { $this->setAggregations(); } } public function setPagination(): void { Loading src/ElasticSearch/Converter/Result/EsResponseToResult.php +32 −1 Original line number Diff line number Diff line Loading @@ -3,6 +3,7 @@ namespace IQDEV\ElasticSearch\Converter\Result; use Elastic\Elasticsearch\Response\Elasticsearch; use IQDEV\ElasticSearch\Configuration; use IQDEV\ElasticSearch\Document\Product; use IQDEV\ElasticSearch\Facet\FacetResult; use IQDEV\ElasticSearch\Facet\FacetType; Loading @@ -13,7 +14,7 @@ use IQDEV\ElasticSearch\Result; final class EsResponseToResult { public function fromResponse(Elasticsearch $response): Result public function fromResponse(Elasticsearch $response, Configuration $configuration): Result { $catalogSearchResult = new Result(); Loading Loading @@ -41,6 +42,8 @@ final class EsResponseToResult $this->parseNumberFacet($data, $catalogSearchResult); } $this->parsePropertyFacet($data, $catalogSearchResult, $configuration); return $catalogSearchResult; } Loading Loading @@ -97,6 +100,8 @@ final class EsResponseToResult if (isset($bucketsFiltered[$code][$value['key']])) { $count = $bucketsFiltered[$code][$value['key']]['doc_count']; } elseif (isset($bucketsFiltered[$code])) { $count = 0; } $facet->products->add( Loading Loading @@ -150,4 +155,30 @@ final class EsResponseToResult $catalogSearchResult->getFacets()->add($facet); } } private function parsePropertyFacet(array $data, Result $catalogSearchResult, Configuration $configuration) { $properties = array_keys($configuration->getMapping()['properties']); foreach ($data['aggregations'] as $key => $aggs) { if (!in_array($key, $properties, true)) { continue; } $facet = new FacetResult(FacetType::LIST, $key); $buckets = array_key_exists('buckets', $aggs) ? $aggs['buckets'] : $aggs[$key]['buckets']; foreach ($buckets as $bucket) { $code = $bucket['key']; $count = $bucket['doc_count']; $facet->products->add( FacetItemList::create( $code, $count ) ); } $catalogSearchResult->getFacets()->add($facet); } } } Loading
src/ElasticSearch/Config/product.mappings.php +5 −1 Original line number Diff line number Diff line Loading @@ -20,7 +20,11 @@ return [ ], 'rating' => [ 'type' => 'double', 'index' => false, 'index' => true, ], 'new' => [ 'type' => 'boolean', 'index' => true ], 'popular' => [ 'type' => 'double', Loading
src/ElasticSearch/Converter/Request/Aggregation/Aggregation.php +31 −21 Original line number Diff line number Diff line Loading @@ -23,29 +23,39 @@ class Aggregation public function convertToQuery(): void { $queryFilterCollection = $this->criteria->getFilters()->getFilterCollectionByType(FilterType::QUERY); if (false === $this->criteria->getSearch()->isEmpty() || false === $this->criteria->getFilters()->isEmpty()) { $this->aggregations->add( AggsFacetTerms::create( 'keyword_facet', 'keyword_facet' 'keyword_facet', 'keyword_facet' ) ); $this->aggregations->add( AggsFacetStats::create( 'number_facet', 'number_facet' 'number_facet', 'number_facet' ) ); $postFilterCollection = $this->criteria->getFilters()->getFilterCollectionByType(FilterType::POST); $filterAggregation = new FilterAggregation($this->configuration, $postFilterCollection); $filterAggregation = new FilterAggregation($this->configuration, $queryFilterCollection); $filterAggregation->updateRequestAggregation($this->aggregations); $fullAggregation = new FullAggregation($this->configuration, $postFilterCollection); $fullAggregation = new FullAggregation($this->configuration, $queryFilterCollection); $fullAggregation->updateRequestAggregation($this->aggregations); } if (false === $this->criteria->getAggs()->isEmpty()) { $propertyAggregation = new PropertyAggregation( $this->configuration, $queryFilterCollection, $this->criteria->getAggs(), ); $propertyAggregation->updateRequestAggregation($this->aggregations); } } public function getAggregation(): AggsCollection { return $this->aggregations; Loading
src/ElasticSearch/Converter/Request/Aggregation/PropertyAggregation.php 0 → 100644 +55 −0 Original line number Diff line number Diff line <?php declare(strict_types=1); namespace IQDEV\ElasticSearch\Converter\Request\Aggregation; use IQDEV\ElasticSearch\Configuration; use IQDEV\ElasticSearch\Converter\Request\FilterQuery; use IQDEV\ElasticSearch\Criteria\Filter\Collection\FilterCollection; use IQDEV\ElasticSearch\Document\Property\PropertyType; use IQDEV\ElasticSearch\Search\Aggs\Aggs; use IQDEV\ElasticSearch\Search\Aggs\AggsCollection; use IQDEV\ElasticSearch\Search\Aggs\Terms; class PropertyAggregation { public function __construct( private readonly Configuration $configuration, private readonly FilterCollection $filterCollection, private readonly \IQDEV\ElasticSearch\Criteria\Aggs\AggsCollection $aggsCollection, ) { } public function updateRequestAggregation(AggsCollection $original): void { $queryFilterBuilder = new FilterQuery($this->configuration, $this->filterCollection); $query = $queryFilterBuilder->getQuery(); /** @var \IQDEV\ElasticSearch\Criteria\Aggs\Aggs $aggs */ foreach ($this->aggsCollection as $aggs) { $property = $aggs->getProperty(); if ($property->getType() !== PropertyType::BASE) { continue; } $aggs = new Aggs($property->getKey()); if (false === $query->isEmpty()) { $aggs->setQuery($query); $aggs->addAggs( (new Aggs($property->getKey())) ->setTerms(new Terms($property->getKey())) ); } else { $aggs->setTerms(new Terms($property->getKey())); } $aggs->addAggs( (new Aggs($property->getKey())) ->setTerms(new Terms($property->getKey())) ); $original->add($aggs); } } }
src/ElasticSearch/Converter/Request/CriteriaRequestBuilder.php +1 −3 Original line number Diff line number Diff line Loading @@ -40,10 +40,8 @@ class CriteriaRequestBuilder extends RequestBuilder $this->setFilter(); } if (false === $this->criteria->getSearch()->isEmpty() || false === $this->criteria->getFilters()->isEmpty()) { $this->setAggregations(); } } public function setPagination(): void { Loading
src/ElasticSearch/Converter/Result/EsResponseToResult.php +32 −1 Original line number Diff line number Diff line Loading @@ -3,6 +3,7 @@ namespace IQDEV\ElasticSearch\Converter\Result; use Elastic\Elasticsearch\Response\Elasticsearch; use IQDEV\ElasticSearch\Configuration; use IQDEV\ElasticSearch\Document\Product; use IQDEV\ElasticSearch\Facet\FacetResult; use IQDEV\ElasticSearch\Facet\FacetType; Loading @@ -13,7 +14,7 @@ use IQDEV\ElasticSearch\Result; final class EsResponseToResult { public function fromResponse(Elasticsearch $response): Result public function fromResponse(Elasticsearch $response, Configuration $configuration): Result { $catalogSearchResult = new Result(); Loading Loading @@ -41,6 +42,8 @@ final class EsResponseToResult $this->parseNumberFacet($data, $catalogSearchResult); } $this->parsePropertyFacet($data, $catalogSearchResult, $configuration); return $catalogSearchResult; } Loading Loading @@ -97,6 +100,8 @@ final class EsResponseToResult if (isset($bucketsFiltered[$code][$value['key']])) { $count = $bucketsFiltered[$code][$value['key']]['doc_count']; } elseif (isset($bucketsFiltered[$code])) { $count = 0; } $facet->products->add( Loading Loading @@ -150,4 +155,30 @@ final class EsResponseToResult $catalogSearchResult->getFacets()->add($facet); } } private function parsePropertyFacet(array $data, Result $catalogSearchResult, Configuration $configuration) { $properties = array_keys($configuration->getMapping()['properties']); foreach ($data['aggregations'] as $key => $aggs) { if (!in_array($key, $properties, true)) { continue; } $facet = new FacetResult(FacetType::LIST, $key); $buckets = array_key_exists('buckets', $aggs) ? $aggs['buckets'] : $aggs[$key]['buckets']; foreach ($buckets as $bucket) { $code = $bucket['key']; $count = $bucket['doc_count']; $facet->products->add( FacetItemList::create( $code, $count ) ); } $catalogSearchResult->getFacets()->add($facet); } } }