Skip to content
Snippets Groups Projects
Commit 845a0c5e authored by Pavel's avatar Pavel
Browse files

Merge remote-tracking branch 'origin/main' into tests

parents be691757 512cbe71
No related branches found
No related tags found
No related merge requests found
<?php
namespace Docke\ElasticSearch\Config;
namespace IQDEV\ElasticSearch\Config;
use IQDEV\ElasticSearch\Configuration;
......
......@@ -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;
......
......@@ -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;
}
}
......@@ -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)
);
......
......@@ -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
......
<?php
namespace Docke\ElasticSearch\Search;
namespace IQDEV\ElasticSearch\Search;
use IQDEV\ElasticSearch\Esable;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment