133 lines
4.4 KiB
PHP
Executable File
133 lines
4.4 KiB
PHP
Executable File
<?php
|
|
/**
|
|
* @author Amasty Team
|
|
* @copyright Copyright (c) Amasty (https://www.amasty.com)
|
|
* @package Elastic Search Base for Magento 2
|
|
*/
|
|
|
|
namespace Amasty\ElasticSearch\Model\Search;
|
|
|
|
use Amasty\ElasticSearch\Model\Client\ClientRepositoryInterface;
|
|
use Amasty\ElasticSearch\Model\Search\GetResponse\GetAggregations;
|
|
use Elasticsearch\Common\Exceptions\BadRequest400Exception;
|
|
use Magento\Framework\Registry as CoreRegistry;
|
|
use Magento\Framework\Search\AdapterInterface;
|
|
use Magento\Framework\Search\RequestInterface;
|
|
|
|
class Adapter implements AdapterInterface
|
|
{
|
|
public const REQUEST_QUERY = 'amasty_elastic_query';
|
|
public const HITS = 'hits';
|
|
public const PRODUCTS = 'products';
|
|
|
|
/**
|
|
* @var GetRequestQuery
|
|
*/
|
|
private $getRequestQuery;
|
|
|
|
/**
|
|
* @var GetResponse
|
|
*/
|
|
private $getElasticResponse;
|
|
|
|
/**
|
|
* @var GetAggregations
|
|
*/
|
|
private $getAggregations;
|
|
|
|
/**
|
|
* @var ClientRepositoryInterface
|
|
*/
|
|
private $clientRepository;
|
|
|
|
/**
|
|
* @var CoreRegistry
|
|
*/
|
|
private $registry;
|
|
|
|
/**
|
|
* @var Logger
|
|
*/
|
|
private $logger;
|
|
|
|
public function __construct(
|
|
ClientRepositoryInterface $clientRepository,
|
|
GetAggregations $getAggregations,
|
|
GetRequestQuery $getRequestQuery,
|
|
GetResponse $getElasticResponse,
|
|
CoreRegistry $registry,
|
|
Logger $logger
|
|
) {
|
|
$this->getAggregations = $getAggregations;
|
|
$this->getRequestQuery = $getRequestQuery;
|
|
$this->getElasticResponse = $getElasticResponse;
|
|
$this->clientRepository = $clientRepository;
|
|
$this->registry = $registry;
|
|
$this->logger = $logger;
|
|
}
|
|
|
|
/**
|
|
* @param RequestInterface $request
|
|
* @return \Magento\Framework\Search\Response\QueryResponse|mixed
|
|
* @throws \Elasticsearch\Common\Exceptions\Missing404Exception
|
|
* @throws \Magento\Framework\Exception\LocalizedException
|
|
*/
|
|
public function query(RequestInterface $request)
|
|
{
|
|
$client = $this->clientRepository->get();
|
|
|
|
if (!$client->ping()) {
|
|
return $this->getElasticResponse->execute([], [], 0);
|
|
}
|
|
|
|
try {
|
|
$requestQuery = $this->getRequestQuery->execute($request);
|
|
$elasticResponse = $client->search($requestQuery);
|
|
} catch (BadRequest400Exception $e) {
|
|
$this->logger->logError($e->getMessage());
|
|
return $this->getElasticResponse->execute([], [], 0);
|
|
} catch (\Exception $e) {
|
|
return $this->getElasticResponse->execute([], [], 0);
|
|
}
|
|
|
|
$elasticDocuments = $elasticResponse['hits']['hits'] ?? [];
|
|
$elasticTotal = $elasticResponse['hits']['total']['value'] ?? $elasticResponse['hits']['total'] ?? 0;
|
|
$this->registry->unregister(self::REQUEST_QUERY);
|
|
$this->registry->register(self::REQUEST_QUERY, $requestQuery['body']['query']);
|
|
$aggregations = $this->getAggregations->execute($request, $elasticResponse);
|
|
$this->registry->unregister(self::REQUEST_QUERY);
|
|
$responseQuery = $this->getElasticResponse->execute($elasticDocuments, $aggregations, $elasticTotal);
|
|
$this->logger->log($request, $responseQuery, $requestQuery, $elasticResponse);
|
|
|
|
return $responseQuery;
|
|
}
|
|
|
|
/**
|
|
* @param RequestInterface $request
|
|
* @return array
|
|
* @throws \Elasticsearch\Common\Exceptions\Missing404Exception
|
|
* @throws \Magento\Framework\Exception\LocalizedException
|
|
*/
|
|
public function queryAdvancedSearchProduct(RequestInterface $request)
|
|
{
|
|
$client = $this->clientRepository->get();
|
|
$requestQuery = $this->getRequestQuery->execute($request);
|
|
unset($requestQuery['aggregations']);
|
|
|
|
$requestQuery['body']['_source'] = ['amasty_xsearch_fulltext'];
|
|
$elasticResponse = $client->search($requestQuery);
|
|
$products = [];
|
|
if (!empty($elasticResponse['hits']['hits'])) {
|
|
foreach ($elasticResponse['hits']['hits'] as $index => $product) {
|
|
if (!empty($product['_source']['amasty_xsearch_fulltext'])) {
|
|
$id = $product['_source']['amasty_xsearch_fulltext']['entity_id'] ?? $product['_id'];
|
|
$products[$id] = $product['_source']['amasty_xsearch_fulltext'];
|
|
}
|
|
}
|
|
}
|
|
|
|
$hits = $elasticResponse['hits']['total']['value'] ?? $elasticResponse['hits']['total'] ?? 0;
|
|
return [self::HITS => $hits, self::PRODUCTS => $products];
|
|
}
|
|
}
|