Skip to content

Commit 71ee28f

Browse files
committed
feat: add first implementation of common search adapter
1 parent 2a4a3a9 commit 71ee28f

File tree

21 files changed

+285
-224
lines changed

21 files changed

+285
-224
lines changed

config/services/search-index-adapter/open-search.yaml

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,31 +7,31 @@ services:
77
autowire: true
88
autoconfigure: true
99
public: false
10-
10+
1111
Pimcore\Bundle\GenericDataIndexBundle\SearchIndexAdapter\SearchIndexServiceInterface:
1212
class: Pimcore\Bundle\GenericDataIndexBundle\SearchIndexAdapter\OpenSearch\OpenSearchService
1313
arguments:
14-
$openSearchClient: '@generic-data-index.opensearch-client'
14+
$client: '@generic-data-index.search-client'
1515

1616
Pimcore\Bundle\GenericDataIndexBundle\SearchIndexAdapter\IndexAliasServiceInterface:
1717
class: Pimcore\Bundle\GenericDataIndexBundle\SearchIndexAdapter\OpenSearch\IndexAliasService
1818
arguments:
19-
$openSearchClient: '@generic-data-index.opensearch-client'
19+
$client: '@generic-data-index.search-client'
2020

2121
Pimcore\Bundle\GenericDataIndexBundle\SearchIndexAdapter\OpenSearch\Search\SearchExecutionServiceInterface:
2222
class: Pimcore\Bundle\GenericDataIndexBundle\SearchIndexAdapter\OpenSearch\Search\SearchExecutionService
2323
arguments:
24-
$openSearchClient: '@generic-data-index.opensearch-client'
24+
$client: '@generic-data-index.search-client'
2525

2626
Pimcore\Bundle\GenericDataIndexBundle\SearchIndexAdapter\BulkOperationServiceInterface:
2727
class: Pimcore\Bundle\GenericDataIndexBundle\SearchIndexAdapter\OpenSearch\BulkOperationService
2828
arguments:
29-
$openSearchClient: '@generic-data-index.opensearch-client'
29+
$client: '@generic-data-index.search-client'
3030

3131
Pimcore\Bundle\GenericDataIndexBundle\SearchIndexAdapter\PathServiceInterface:
3232
class: Pimcore\Bundle\GenericDataIndexBundle\SearchIndexAdapter\OpenSearch\PathService
3333
arguments:
34-
$openSearchClient: '@generic-data-index.opensearch-client'
34+
$client: '@generic-data-index.search-client'
3535

3636
Pimcore\Bundle\GenericDataIndexBundle\SearchIndexAdapter\Search\Pagination\PaginationInfoServiceInterface:
3737
class: Pimcore\Bundle\GenericDataIndexBundle\SearchIndexAdapter\OpenSearch\Search\Pagination\PaginationInfoService
@@ -51,7 +51,7 @@ services:
5151
Pimcore\Bundle\GenericDataIndexBundle\SearchIndexAdapter\IndexStatsServiceInterface:
5252
class: Pimcore\Bundle\GenericDataIndexBundle\SearchIndexAdapter\OpenSearch\IndexStatsService
5353
arguments:
54-
$openSearchClient: '@generic-data-index.opensearch-client'
54+
$client: '@generic-data-index.search-client'
5555

5656
Pimcore\Bundle\GenericDataIndexBundle\SearchIndexAdapter\IndexMappingServiceInterface:
5757
class: Pimcore\Bundle\GenericDataIndexBundle\SearchIndexAdapter\OpenSearch\IndexMappingService
@@ -76,4 +76,4 @@ services:
7676
Pimcore\Bundle\GenericDataIndexBundle\SearchIndexAdapter\DataObject\IndexIconUpdateServiceInterface:
7777
class: Pimcore\Bundle\GenericDataIndexBundle\SearchIndexAdapter\OpenSearch\DataObject\IndexIconUpdateService
7878
arguments:
79-
$openSearchClient: '@generic-data-index.opensearch-client'
79+
$client: '@generic-data-index.search-client'

src/DependencyInjection/Configuration.php

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
namespace Pimcore\Bundle\GenericDataIndexBundle\DependencyInjection;
1818

19+
use Pimcore\Bundle\GenericDataIndexBundle\Enum\SearchIndex\ClientType;
1920
use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
2021
use Symfony\Component\Config\Definition\Builder\NodeDefinition;
2122
use Symfony\Component\Config\Definition\Builder\TreeBuilder;
@@ -53,9 +54,14 @@ public function getConfigTreeBuilder(): TreeBuilder
5354
->addDefaultsIfNotSet()
5455
->children()
5556
->scalarNode('client_name')
56-
->info('Name of OpenSearch client from the PimcoreOpenSearchClientBundle to be used.')
57+
->info('Name of search client from to be used.')
5758
->defaultValue('default')
5859
->end()
60+
->enumNode('client_type')
61+
->info('Type of search client to be used.')
62+
->values([ClientType::OPEN_SEARCH->value, ClientType::ELASTIC_SEARCH->value])
63+
->defaultValue(ClientType::OPEN_SEARCH->value)
64+
->end()
5965
->scalarNode('index_prefix')
6066
->defaultValue('pimcore_')
6167
->end()

src/DependencyInjection/PimcoreGenericDataIndexExtension.php

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
use Exception;
2020
use InvalidArgumentException;
21+
use Pimcore\Bundle\GenericDataIndexBundle\Enum\SearchIndex\ClientType;
2122
use Pimcore\Bundle\GenericDataIndexBundle\MessageHandler\DispatchQueueMessagesHandler;
2223
use Pimcore\Bundle\GenericDataIndexBundle\Service\SearchIndex\SearchIndexConfigServiceInterface;
2324
use Symfony\Component\Config\FileLocator;
@@ -90,11 +91,33 @@ private function registerIndexServiceParams(ContainerBuilder $container, array $
9091
$definition->setArgument('$systemFieldsSettings', $indexSettings['system_fields_settings']);
9192

9293
$openSearchClientId = 'pimcore.open_search_client.' . $indexSettings['client_params']['client_name'];
94+
/**
95+
* @deprecated Alias will be removed in version 2.0. Please use "generic-data-index.search-client" instead
96+
*/
9397
$container->setAlias('generic-data-index.opensearch-client', $openSearchClientId);
9498

99+
$clientId = $this->getDefaultSearchClientId($indexSettings);
100+
$container->setAlias('generic-data-index.search-client', $clientId);
101+
95102
$container->setParameter('generic-data-index.index-prefix', $indexSettings['client_params']['index_prefix']);
96103

97104
$definition = $container->getDefinition(DispatchQueueMessagesHandler::class);
98105
$definition->setArgument('$queueSettings', $indexSettings['queue_settings']);
99106
}
107+
108+
/**
109+
* @throws InvalidArgumentException
110+
*/
111+
private function getDefaultSearchClientId(array $indexSettings): string
112+
{
113+
$clientType = $indexSettings['client_params']['client_type'];
114+
$clientName = $indexSettings['client_params']['client_name'];
115+
return match ($clientType) {
116+
ClientType::OPEN_SEARCH->value => 'pimcore.openSearch.custom_client.' . $clientName,
117+
ClientType::ELASTIC_SEARCH->value => 'pimcore.elasticsearch.custom_client.' . $clientName,
118+
default => throw new InvalidArgumentException(
119+
sprintf('Invalid client type: %s', $indexSettings['client_params']['client_type'])
120+
)
121+
};
122+
}
100123
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<?php
2+
declare(strict_types=1);
3+
4+
/**
5+
* Pimcore
6+
*
7+
* This source file is available under two different licenses:
8+
* - GNU General Public License version 3 (GPLv3)
9+
* - Pimcore Commercial License (PCL)
10+
* Full copyright and license information is available in
11+
* LICENSE.md which is distributed with this source code.
12+
*
13+
* @copyright Copyright (c) Pimcore GmbH (http://www.pimcore.org)
14+
* @license http://www.pimcore.org/license GPLv3 and PCL
15+
*/
16+
17+
namespace Pimcore\Bundle\GenericDataIndexBundle\Enum\SearchIndex;
18+
19+
/**
20+
* @internal
21+
*/
22+
enum ClientType: string
23+
{
24+
case OPEN_SEARCH = 'openSearch';
25+
case ELASTIC_SEARCH = 'elasticsearch';
26+
}

src/Enum/SearchIndex/OpenSearch/AttributeType.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,4 +31,5 @@ enum AttributeType: string
3131
case OBJECT = 'object';
3232
case BOOLEAN = 'boolean';
3333
case FLAT_OBJECT = 'flat_object';
34+
case FLATTENED = 'flattened';
3435
}

src/PimcoreGenericDataIndexBundle.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
namespace Pimcore\Bundle\GenericDataIndexBundle;
1818

19+
use Pimcore\Bundle\ElasticsearchClientBundle\PimcoreElasticsearchClientBundle;
1920
use Pimcore\Bundle\GenericDataIndexBundle\Attribute\OpenSearch\AsSearchModifierHandler;
2021
use Pimcore\Bundle\GenericDataIndexBundle\DependencyInjection\Compiler\SearchModifierHandlerPass;
2122
use Pimcore\Bundle\GenericDataIndexBundle\DependencyInjection\Compiler\ServiceLocatorPass;
@@ -61,6 +62,7 @@ public function getInstaller(): ?InstallerInterface
6162

6263
public static function registerDependentBundles(BundleCollection $collection): void
6364
{
65+
$collection->addBundle(new PimcoreElasticsearchClientBundle());
6466
$collection->addBundle(new PimcoreOpenSearchClientBundle());
6567
$collection->addBundle(new PimcoreStaticResolverBundle());
6668
}

src/SearchIndexAdapter/OpenSearch/BulkOperationService.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,11 @@
1717
namespace Pimcore\Bundle\GenericDataIndexBundle\SearchIndexAdapter\OpenSearch;
1818

1919
use Exception;
20-
use OpenSearch\Client;
2120
use Pimcore\Bundle\GenericDataIndexBundle\Enum\SearchIndex\RefreshIndexMode;
2221
use Pimcore\Bundle\GenericDataIndexBundle\Exception\BulkOperationException;
2322
use Pimcore\Bundle\GenericDataIndexBundle\Exception\IndexModeException;
2423
use Pimcore\Bundle\GenericDataIndexBundle\SearchIndexAdapter\BulkOperationServiceInterface;
24+
use Pimcore\SearchClient\SearchClientInterface;
2525
use Pimcore\Bundle\GenericDataIndexBundle\Service\SearchIndex\IndexQueue\SynchronousProcessingServiceInterface;
2626
use Pimcore\Bundle\GenericDataIndexBundle\Traits\LoggerAwareTrait;
2727
use RuntimeException;
@@ -36,7 +36,7 @@ final class BulkOperationService implements BulkOperationServiceInterface
3636
private array $bulkOperationData = [];
3737

3838
public function __construct(
39-
private readonly Client $openSearchClient,
39+
private readonly SearchClientInterface $client,
4040
private readonly SynchronousProcessingServiceInterface $synchronousProcessing
4141
) {
4242
}
@@ -85,7 +85,7 @@ public function commit(?string $refreshIndex = null): void
8585
try {
8686
$this->logger->info('Commit bulk to index.');
8787

88-
$response = $this->openSearchClient->bulk(
88+
$response = $this->client->bulk(
8989
$this->prepareBulkParams($refreshIndex)
9090
);
9191

src/SearchIndexAdapter/OpenSearch/DataObject/IndexIconUpdateService.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,17 @@
1616

1717
namespace Pimcore\Bundle\GenericDataIndexBundle\SearchIndexAdapter\OpenSearch\DataObject;
1818

19-
use OpenSearch\Client;
2019
use Pimcore\Bundle\GenericDataIndexBundle\Enum\SearchIndex\FieldCategory\SystemField;
2120
use Pimcore\Bundle\GenericDataIndexBundle\SearchIndexAdapter\DataObject\IndexIconUpdateServiceInterface;
21+
use Pimcore\SearchClient\SearchClientInterface;
2222

2323
/**
2424
* @internal
2525
2626
*/
2727
final readonly class IndexIconUpdateService implements IndexIconUpdateServiceInterface
2828
{
29-
public function __construct(private Client $openSearchClient)
29+
public function __construct(private SearchClientInterface $client)
3030
{
3131
}
3232

@@ -48,7 +48,7 @@ public function updateIcon(string $indexName, ?string $icon): void
4848
'query' => $query,
4949
],
5050
];
51-
$this->openSearchClient->updateByQuery($params);
51+
$this->client->updateByQuery($params);
5252
}
5353

5454
private function getQueryForNullIcon(): array

src/SearchIndexAdapter/OpenSearch/IndexAliasService.php

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
namespace Pimcore\Bundle\GenericDataIndexBundle\SearchIndexAdapter\OpenSearch;
1818

19-
use OpenSearch\Client;
19+
use Pimcore\SearchClient\SearchClientInterface;
2020
use Pimcore\Bundle\GenericDataIndexBundle\SearchIndexAdapter\IndexAliasServiceInterface;
2121
use Pimcore\Bundle\GenericDataIndexBundle\Service\SearchIndex\SearchIndexConfigServiceInterface;
2222

@@ -26,7 +26,7 @@
2626
final class IndexAliasService implements IndexAliasServiceInterface
2727
{
2828
public function __construct(
29-
private readonly Client $openSearchClient,
29+
private readonly SearchClientInterface $client,
3030
private readonly SearchIndexConfigServiceInterface $searchIndexConfigService,
3131
) {
3232
}
@@ -44,12 +44,12 @@ public function addAlias(string $aliasName, string $indexName): array
4444
],
4545
];
4646

47-
return $this->openSearchClient->indices()->updateAliases($params);
47+
return $this->client->updateIndexAliases($params);
4848
}
4949

5050
public function existsAlias(string $aliasName, string $indexName = null): bool
5151
{
52-
return $this->openSearchClient->indices()->existsAlias([
52+
return $this->client->existsIndexAlias([
5353
'name' => $aliasName,
5454
'index' => $indexName,
5555
'client' => [
@@ -60,14 +60,15 @@ public function existsAlias(string $aliasName, string $indexName = null): bool
6060

6161
public function getAllAliases(): array
6262
{
63-
return $this->openSearchClient->cat()->aliases([
63+
return $this->client->getAllIndexAliases([
6464
'name' => $this->searchIndexConfigService->getIndexPrefix() . '*',
65+
'format' => 'json',
6566
]);
6667
}
6768

6869
public function deleteAlias(string $indexName, string $aliasName): array
6970
{
70-
return $this->openSearchClient->indices()->deleteAlias([
71+
return $this->client->deleteIndexAlias([
7172
'name' => $aliasName,
7273
'index' => $indexName,
7374
]);
@@ -98,7 +99,7 @@ public function updateAliases(string $alias, array $indexNames, array $existingI
9899
}
99100

100101
if (!empty($actions)) {
101-
return $this->openSearchClient->indices()->updateAliases([
102+
return $this->client->updateIndexAliases([
102103
'body' => [
103104
'actions' => $actions,
104105
],

src/SearchIndexAdapter/OpenSearch/IndexMappingService.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ private function getAdvancedImagePointData(array $attributes): array
131131
'properties' => [
132132
'name' => $this->getMappingForTextKeyword($attributes),
133133
'data' => [
134-
'type' => AttributeType::FLAT_OBJECT->value,
134+
'type' => AttributeType::FLATTENED->value,
135135
],
136136
'top' => [
137137
'type' => AttributeType::FLOAT->value,

0 commit comments

Comments
 (0)