Adapter.php 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Elasticsearch\Elasticsearch5\SearchAdapter;
  7. use Magento\Framework\App\ObjectManager;
  8. use Magento\Framework\Search\AdapterInterface;
  9. use Magento\Framework\Search\RequestInterface;
  10. use Magento\Framework\Search\Response\QueryResponse;
  11. use Magento\Elasticsearch\SearchAdapter\Aggregation\Builder as AggregationBuilder;
  12. use Magento\Elasticsearch\SearchAdapter\ConnectionManager;
  13. use \Magento\Elasticsearch\SearchAdapter\ResponseFactory;
  14. use Psr\Log\LoggerInterface;
  15. /**
  16. * Elasticsearch Search Adapter
  17. */
  18. class Adapter implements AdapterInterface
  19. {
  20. /**
  21. * Mapper instance
  22. *
  23. * @var Mapper
  24. */
  25. protected $mapper;
  26. /**
  27. * Response Factory
  28. *
  29. * @var ResponseFactory
  30. */
  31. protected $responseFactory;
  32. /**
  33. * @var ConnectionManager
  34. */
  35. protected $connectionManager;
  36. /**
  37. * @var AggregationBuilder
  38. */
  39. protected $aggregationBuilder;
  40. /**
  41. * @var \Magento\Elasticsearch\SearchAdapter\QueryContainerFactory
  42. */
  43. private $queryContainerFactory;
  44. /**
  45. * Empty response from Elasticsearch.
  46. *
  47. * @var array
  48. */
  49. private static $emptyRawResponse = [
  50. "hits" =>
  51. [
  52. "hits" => []
  53. ],
  54. "aggregations" =>
  55. [
  56. "price_bucket" => [],
  57. "category_bucket" =>
  58. [
  59. "buckets" => []
  60. ]
  61. ]
  62. ];
  63. /**
  64. * @var LoggerInterface
  65. */
  66. private $logger;
  67. /**
  68. * @param ConnectionManager $connectionManager
  69. * @param Mapper $mapper
  70. * @param ResponseFactory $responseFactory
  71. * @param AggregationBuilder $aggregationBuilder
  72. * @param \Magento\Elasticsearch\SearchAdapter\QueryContainerFactory $queryContainerFactory
  73. * @param LoggerInterface $logger
  74. */
  75. public function __construct(
  76. ConnectionManager $connectionManager,
  77. Mapper $mapper,
  78. ResponseFactory $responseFactory,
  79. AggregationBuilder $aggregationBuilder,
  80. \Magento\Elasticsearch\SearchAdapter\QueryContainerFactory $queryContainerFactory,
  81. LoggerInterface $logger = null
  82. ) {
  83. $this->connectionManager = $connectionManager;
  84. $this->mapper = $mapper;
  85. $this->responseFactory = $responseFactory;
  86. $this->aggregationBuilder = $aggregationBuilder;
  87. $this->queryContainerFactory = $queryContainerFactory;
  88. $this->logger = $logger ?: ObjectManager::getInstance()
  89. ->get(LoggerInterface::class);
  90. }
  91. /**
  92. * Search query
  93. *
  94. * @param RequestInterface $request
  95. * @return QueryResponse
  96. */
  97. public function query(RequestInterface $request)
  98. {
  99. $client = $this->connectionManager->getConnection();
  100. $aggregationBuilder = $this->aggregationBuilder;
  101. $query = $this->mapper->buildQuery($request);
  102. $aggregationBuilder->setQuery($this->queryContainerFactory->create(['query' => $query]));
  103. try {
  104. $rawResponse = $client->query($query);
  105. } catch (\Exception $e) {
  106. $this->logger->critical($e);
  107. // return empty search result in case an exception is thrown from Elasticsearch
  108. $rawResponse = self::$emptyRawResponse;
  109. }
  110. $rawDocuments = isset($rawResponse['hits']['hits']) ? $rawResponse['hits']['hits'] : [];
  111. $queryResponse = $this->responseFactory->create(
  112. [
  113. 'documents' => $rawDocuments,
  114. 'aggregations' => $aggregationBuilder->build($request, $rawResponse),
  115. ]
  116. );
  117. return $queryResponse;
  118. }
  119. }