ElasticSearch.php 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. <?php
  2. namespace Webkul\Core;
  3. use Elastic\Elasticsearch\Client;
  4. use Elastic\Elasticsearch\ClientBuilder;
  5. use Illuminate\Support\Arr;
  6. class ElasticSearch
  7. {
  8. /**
  9. * Map configuration array keys with ES ClientBuilder setters
  10. *
  11. * @var array
  12. */
  13. protected $configMappings = [
  14. 'retries' => 'setRetries',
  15. 'caBundle' => 'setCABundle',
  16. ];
  17. /**
  18. * Make a new connection.
  19. */
  20. protected function makeConnection(?string $name = null): Client
  21. {
  22. $connection = $name ?: $this->getDefaultConnection();
  23. $config = $this->getConnectionConfig($connection);
  24. $clientBuilder = ClientBuilder::create();
  25. if ($connection == 'default') {
  26. /**
  27. * Build default connection.
  28. */
  29. $clientBuilder->setHosts($config['hosts'])
  30. ->setBasicAuthentication($config['user'] ?: '', $config['pass'] ?: '');
  31. } elseif ($connection == 'api') {
  32. /**
  33. * Build API key connection.
  34. */
  35. $clientBuilder->setHosts($config['hosts'])
  36. ->setApiKey($config['key']);
  37. } elseif ($connection == 'cloud') {
  38. /**
  39. * Build elastic cloud connection.
  40. */
  41. $clientBuilder->setElasticCloudId($config['id']);
  42. if ($config['api_key']) {
  43. $clientBuilder->setApiKey($config['api_key']);
  44. } else {
  45. $clientBuilder->setBasicAuthentication($config['user'], $config['pass']);
  46. }
  47. }
  48. /**
  49. * Set additional client configuration.
  50. */
  51. foreach ($this->configMappings as $key => $method) {
  52. $value = Arr::get(config('elasticsearch'), $key);
  53. if (! is_null($value)) {
  54. $clientBuilder->$method($value);
  55. }
  56. }
  57. return $clientBuilder->build();
  58. }
  59. /**
  60. * Get the default connection.
  61. */
  62. public function getDefaultConnection(): string
  63. {
  64. return config('elasticsearch.connection');
  65. }
  66. /**
  67. * Get the configuration for a named connection.
  68. *
  69. * @return mixed
  70. *
  71. * @throws \InvalidArgumentException
  72. */
  73. protected function getConnectionConfig(string $name)
  74. {
  75. $connections = config('elasticsearch.connections');
  76. if (null === $config = Arr::get($connections, $name)) {
  77. throw new \InvalidArgumentException("Elasticsearch connection [$name] not configured.");
  78. }
  79. return $config;
  80. }
  81. /**
  82. * Dynamically pass methods to the default connection.
  83. *
  84. * @return mixed
  85. */
  86. public function __call(string $method, array $parameters)
  87. {
  88. return call_user_func_array([$this->makeConnection(), $method], $parameters);
  89. }
  90. }