diff --git a/doc/01_Installation/02_Upgrade.md b/doc/01_Installation/02_Upgrade.md index b5ae760a..afd4a941 100644 --- a/doc/01_Installation/02_Upgrade.md +++ b/doc/01_Installation/02_Upgrade.md @@ -2,6 +2,9 @@ Following steps are necessary during updating to newer versions. +## Upgrade to 2.2.0 +- Added `trackTotalHits` parameter to `DefaultSearchService` and `SearchExecutionService`. The default value is true, which means that total hits will always be computed accurately, even if they exceed the search engines threshold for accurate hit calculation. Change this parameter to `null`, to use the default threshold, pass an integer value to set a specific one. + ## Upgrade to 2.1.0 - Added support for Symfony 7 - [Indexing] Added sort index for documents diff --git a/src/SearchIndexAdapter/DefaultSearch/DefaultSearchService.php b/src/SearchIndexAdapter/DefaultSearch/DefaultSearchService.php index d4c185b3..a89598f2 100644 --- a/src/SearchIndexAdapter/DefaultSearch/DefaultSearchService.php +++ b/src/SearchIndexAdapter/DefaultSearch/DefaultSearchService.php @@ -244,9 +244,17 @@ public function createPaginatedSearch( /** * @throws SearchFailedException */ - public function search(AdapterSearchInterface $search, string $indexName): SearchResult - { - return $this->searchExecutionService->executeSearch($search, $indexName); + public function search( + AdapterSearchInterface $search, + string $indexName, + int|bool|null $trackTotalHits = true + ): SearchResult { + return $this->searchExecutionService->executeSearch( + $search, + $indexName, + $trackTotalHits + + ); } /** diff --git a/src/SearchIndexAdapter/DefaultSearch/Search/SearchExecutionService.php b/src/SearchIndexAdapter/DefaultSearch/Search/SearchExecutionService.php index 1a8abe34..8b1db48c 100644 --- a/src/SearchIndexAdapter/DefaultSearch/Search/SearchExecutionService.php +++ b/src/SearchIndexAdapter/DefaultSearch/Search/SearchExecutionService.php @@ -42,21 +42,29 @@ public function __construct( /** * @throws SearchFailedException */ - public function executeSearch(AdapterSearchInterface $search, string $indexName): SearchResult - { + public function executeSearch( + AdapterSearchInterface $search, + string $indexName, + int|bool|null $trackTotalHits = true + ): SearchResult { try { $stopWatch = new Stopwatch(); $stopWatch->start('search'); + $searchParams = [ + 'index' => $indexName, + 'body' => $search->toArray(), + ]; + + if ($trackTotalHits !== null) { + $searchParams['body']['track_total_hits'] = $trackTotalHits; + } + $defaultSearchResult = $this ->client - ->search([ - 'index' => $indexName, - 'body' => $search->toArray(), - ]); + ->search($searchParams); $executionTime = $stopWatch->stop('search')->getDuration(); - } catch (Exception $e) { $searchInformation = new SearchInformation( $search, diff --git a/src/SearchIndexAdapter/DefaultSearch/Search/SearchExecutionServiceInterface.php b/src/SearchIndexAdapter/DefaultSearch/Search/SearchExecutionServiceInterface.php index 69fa1883..3beb2bee 100644 --- a/src/SearchIndexAdapter/DefaultSearch/Search/SearchExecutionServiceInterface.php +++ b/src/SearchIndexAdapter/DefaultSearch/Search/SearchExecutionServiceInterface.php @@ -24,9 +24,16 @@ interface SearchExecutionServiceInterface { /** + * Execute a search query. + * Set $trackTotalHits = true to enable accurate hit counts, an integer to set a maximum count or leave it at null to use the engines default value. + * * @throws SearchFailedException */ - public function executeSearch(AdapterSearchInterface $search, string $indexName): SearchResult; + public function executeSearch( + AdapterSearchInterface $search, + string $indexName, + int|bool|null $trackTotalHits = true + ): SearchResult; /** * @return SearchInformation[] diff --git a/src/SearchIndexAdapter/SearchIndexServiceInterface.php b/src/SearchIndexAdapter/SearchIndexServiceInterface.php index c9da316b..941e5672 100644 --- a/src/SearchIndexAdapter/SearchIndexServiceInterface.php +++ b/src/SearchIndexAdapter/SearchIndexServiceInterface.php @@ -56,7 +56,15 @@ public function createPaginatedSearch( bool $aggregationsOnly = false ): DefaultSearchInterface; - public function search(AdapterSearchInterface $search, string $indexName): SearchResult; + /** + * Execute a search query. + * Set $trackTotalHits = true to enable accurate hit counts, an integer to set a maximum count or leave it at null to use the engines default value. + */ + public function search( + AdapterSearchInterface $search, + string $indexName, + int|bool|null $trackTotalHits = true + ): SearchResult; public function getStats(string $indexName): array;