From 5659cf3be817cbef679de90961139db2e98ea360 Mon Sep 17 00:00:00 2001 From: Marco Perberschlager Date: Thu, 18 Sep 2025 12:45:28 +0000 Subject: [PATCH 1/8] Added trackTotalHits parameter to enable accurate counting of hits --- .../DefaultSearch/DefaultSearchService.php | 9 ++++++-- .../Search/SearchExecutionService.php | 23 +++++++++++++------ .../SearchExecutionServiceInterface.php | 9 +++++++- .../SearchIndexServiceInterface.php | 9 +++++++- 4 files changed, 39 insertions(+), 11 deletions(-) diff --git a/src/SearchIndexAdapter/DefaultSearch/DefaultSearchService.php b/src/SearchIndexAdapter/DefaultSearch/DefaultSearchService.php index d4c185b3..b221df79 100644 --- a/src/SearchIndexAdapter/DefaultSearch/DefaultSearchService.php +++ b/src/SearchIndexAdapter/DefaultSearch/DefaultSearchService.php @@ -244,9 +244,14 @@ public function createPaginatedSearch( /** * @throws SearchFailedException */ - public function search(AdapterSearchInterface $search, string $indexName): SearchResult + public function search(AdapterSearchInterface $search, string $indexName, int|bool $trackTotalHits = null): SearchResult { - return $this->searchExecutionService->executeSearch($search, $indexName); + 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..fd259949 100644 --- a/src/SearchIndexAdapter/DefaultSearch/Search/SearchExecutionService.php +++ b/src/SearchIndexAdapter/DefaultSearch/Search/SearchExecutionService.php @@ -42,21 +42,30 @@ public function __construct( /** * @throws SearchFailedException */ - public function executeSearch(AdapterSearchInterface $search, string $indexName): SearchResult - { + public function executeSearch( + AdapterSearchInterface $search, + string $indexName, + int|bool $trackTotalHits = null + ): 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..43e39629 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 $trackTotalHits = null + ): SearchResult; /** * @return SearchInformation[] diff --git a/src/SearchIndexAdapter/SearchIndexServiceInterface.php b/src/SearchIndexAdapter/SearchIndexServiceInterface.php index c9da316b..ba3ad482 100644 --- a/src/SearchIndexAdapter/SearchIndexServiceInterface.php +++ b/src/SearchIndexAdapter/SearchIndexServiceInterface.php @@ -56,7 +56,14 @@ 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 $trackTotalHits = null + ): SearchResult; public function getStats(string $indexName): array; From aa48e68e8cf583b5c87ca5ce368f43c26642da29 Mon Sep 17 00:00:00 2001 From: mcop1 Date: Thu, 18 Sep 2025 12:49:10 +0000 Subject: [PATCH 2/8] Apply php-cs-fixer changes --- .../DefaultSearch/DefaultSearchService.php | 2 +- .../DefaultSearch/Search/SearchExecutionService.php | 7 +++---- .../Search/SearchExecutionServiceInterface.php | 4 ++-- .../SearchIndexServiceInterface.php | 11 ++++++----- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/SearchIndexAdapter/DefaultSearch/DefaultSearchService.php b/src/SearchIndexAdapter/DefaultSearch/DefaultSearchService.php index b221df79..65af6948 100644 --- a/src/SearchIndexAdapter/DefaultSearch/DefaultSearchService.php +++ b/src/SearchIndexAdapter/DefaultSearch/DefaultSearchService.php @@ -247,7 +247,7 @@ public function createPaginatedSearch( public function search(AdapterSearchInterface $search, string $indexName, int|bool $trackTotalHits = null): SearchResult { return $this->searchExecutionService->executeSearch( - $search, + $search, $indexName, $trackTotalHits diff --git a/src/SearchIndexAdapter/DefaultSearch/Search/SearchExecutionService.php b/src/SearchIndexAdapter/DefaultSearch/Search/SearchExecutionService.php index fd259949..b552c8c4 100644 --- a/src/SearchIndexAdapter/DefaultSearch/Search/SearchExecutionService.php +++ b/src/SearchIndexAdapter/DefaultSearch/Search/SearchExecutionService.php @@ -43,18 +43,17 @@ public function __construct( * @throws SearchFailedException */ public function executeSearch( - AdapterSearchInterface $search, + AdapterSearchInterface $search, string $indexName, int|bool $trackTotalHits = null - ): SearchResult - { + ): SearchResult { try { $stopWatch = new Stopwatch(); $stopWatch->start('search'); $searchParams = [ 'index' => $indexName, - 'body' => $search->toArray() + 'body' => $search->toArray(), ]; if ($trackTotalHits !== null) { diff --git a/src/SearchIndexAdapter/DefaultSearch/Search/SearchExecutionServiceInterface.php b/src/SearchIndexAdapter/DefaultSearch/Search/SearchExecutionServiceInterface.php index 43e39629..17fdd0d3 100644 --- a/src/SearchIndexAdapter/DefaultSearch/Search/SearchExecutionServiceInterface.php +++ b/src/SearchIndexAdapter/DefaultSearch/Search/SearchExecutionServiceInterface.php @@ -26,11 +26,11 @@ 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, + AdapterSearchInterface $search, string $indexName, int|bool $trackTotalHits = null ): SearchResult; diff --git a/src/SearchIndexAdapter/SearchIndexServiceInterface.php b/src/SearchIndexAdapter/SearchIndexServiceInterface.php index ba3ad482..ba3f2afa 100644 --- a/src/SearchIndexAdapter/SearchIndexServiceInterface.php +++ b/src/SearchIndexAdapter/SearchIndexServiceInterface.php @@ -56,12 +56,13 @@ public function createPaginatedSearch( bool $aggregationsOnly = false ): DefaultSearchInterface; - /** + /** * 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, + * 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 $trackTotalHits = null ): SearchResult; From 73d3d51a3b363ca3e8959b23af927cc3c972179d Mon Sep 17 00:00:00 2001 From: Marco Perberschlager Date: Thu, 18 Sep 2025 12:53:12 +0000 Subject: [PATCH 3/8] Added null to union type for trackTotalHits --- .../DefaultSearch/DefaultSearchService.php | 7 +++++-- .../DefaultSearch/Search/SearchExecutionService.php | 4 ++-- .../Search/SearchExecutionServiceInterface.php | 2 +- src/SearchIndexAdapter/SearchIndexServiceInterface.php | 10 +++++----- 4 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/SearchIndexAdapter/DefaultSearch/DefaultSearchService.php b/src/SearchIndexAdapter/DefaultSearch/DefaultSearchService.php index 65af6948..9ded458f 100644 --- a/src/SearchIndexAdapter/DefaultSearch/DefaultSearchService.php +++ b/src/SearchIndexAdapter/DefaultSearch/DefaultSearchService.php @@ -244,8 +244,11 @@ public function createPaginatedSearch( /** * @throws SearchFailedException */ - public function search(AdapterSearchInterface $search, string $indexName, int|bool $trackTotalHits = null): SearchResult - { + public function search( + AdapterSearchInterface $search, + string $indexName, + int|bool|null $trackTotalHits = null + ): SearchResult { return $this->searchExecutionService->executeSearch( $search, $indexName, diff --git a/src/SearchIndexAdapter/DefaultSearch/Search/SearchExecutionService.php b/src/SearchIndexAdapter/DefaultSearch/Search/SearchExecutionService.php index b552c8c4..a329a12f 100644 --- a/src/SearchIndexAdapter/DefaultSearch/Search/SearchExecutionService.php +++ b/src/SearchIndexAdapter/DefaultSearch/Search/SearchExecutionService.php @@ -45,8 +45,8 @@ public function __construct( public function executeSearch( AdapterSearchInterface $search, string $indexName, - int|bool $trackTotalHits = null - ): SearchResult { + int|bool|null $trackTotalHits = null + ): SearchResult { try { $stopWatch = new Stopwatch(); $stopWatch->start('search'); diff --git a/src/SearchIndexAdapter/DefaultSearch/Search/SearchExecutionServiceInterface.php b/src/SearchIndexAdapter/DefaultSearch/Search/SearchExecutionServiceInterface.php index 17fdd0d3..7a3f324d 100644 --- a/src/SearchIndexAdapter/DefaultSearch/Search/SearchExecutionServiceInterface.php +++ b/src/SearchIndexAdapter/DefaultSearch/Search/SearchExecutionServiceInterface.php @@ -32,7 +32,7 @@ interface SearchExecutionServiceInterface public function executeSearch( AdapterSearchInterface $search, string $indexName, - int|bool $trackTotalHits = null + int|bool|null $trackTotalHits = null ): SearchResult; /** diff --git a/src/SearchIndexAdapter/SearchIndexServiceInterface.php b/src/SearchIndexAdapter/SearchIndexServiceInterface.php index ba3f2afa..758985b6 100644 --- a/src/SearchIndexAdapter/SearchIndexServiceInterface.php +++ b/src/SearchIndexAdapter/SearchIndexServiceInterface.php @@ -58,12 +58,12 @@ public function createPaginatedSearch( /** * 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. - */ + * 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 $trackTotalHits = null + AdapterSearchInterface $search, + string $indexName, + int|bool|null $trackTotalHits = null ): SearchResult; public function getStats(string $indexName): array; From 823fae762b4cdb9849a42349c721039f137bfa0c Mon Sep 17 00:00:00 2001 From: mcop1 Date: Thu, 18 Sep 2025 12:57:14 +0000 Subject: [PATCH 4/8] Apply php-cs-fixer changes --- .../DefaultSearch/DefaultSearchService.php | 4 ++-- .../DefaultSearch/Search/SearchExecutionService.php | 2 +- src/SearchIndexAdapter/SearchIndexServiceInterface.php | 8 ++++---- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/SearchIndexAdapter/DefaultSearch/DefaultSearchService.php b/src/SearchIndexAdapter/DefaultSearch/DefaultSearchService.php index 9ded458f..8799312a 100644 --- a/src/SearchIndexAdapter/DefaultSearch/DefaultSearchService.php +++ b/src/SearchIndexAdapter/DefaultSearch/DefaultSearchService.php @@ -245,8 +245,8 @@ public function createPaginatedSearch( * @throws SearchFailedException */ public function search( - AdapterSearchInterface $search, - string $indexName, + AdapterSearchInterface $search, + string $indexName, int|bool|null $trackTotalHits = null ): SearchResult { return $this->searchExecutionService->executeSearch( diff --git a/src/SearchIndexAdapter/DefaultSearch/Search/SearchExecutionService.php b/src/SearchIndexAdapter/DefaultSearch/Search/SearchExecutionService.php index a329a12f..a6a456d6 100644 --- a/src/SearchIndexAdapter/DefaultSearch/Search/SearchExecutionService.php +++ b/src/SearchIndexAdapter/DefaultSearch/Search/SearchExecutionService.php @@ -46,7 +46,7 @@ public function executeSearch( AdapterSearchInterface $search, string $indexName, int|bool|null $trackTotalHits = null - ): SearchResult { + ): SearchResult { try { $stopWatch = new Stopwatch(); $stopWatch->start('search'); diff --git a/src/SearchIndexAdapter/SearchIndexServiceInterface.php b/src/SearchIndexAdapter/SearchIndexServiceInterface.php index 758985b6..351f55b1 100644 --- a/src/SearchIndexAdapter/SearchIndexServiceInterface.php +++ b/src/SearchIndexAdapter/SearchIndexServiceInterface.php @@ -58,11 +58,11 @@ public function createPaginatedSearch( /** * 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. - */ + * 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, + AdapterSearchInterface $search, + string $indexName, int|bool|null $trackTotalHits = null ): SearchResult; From b3e1bedfe4de797c12c35d3350211c1434e2c00e Mon Sep 17 00:00:00 2001 From: Marco Perberschlager Date: Fri, 19 Sep 2025 09:12:07 +0000 Subject: [PATCH 5/8] Changed default value to true --- .../DefaultSearch/DefaultSearchService.php | 6 +++--- .../DefaultSearch/Search/SearchExecutionService.php | 4 ++-- .../Search/SearchExecutionServiceInterface.php | 2 +- src/SearchIndexAdapter/SearchIndexServiceInterface.php | 6 +++--- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/SearchIndexAdapter/DefaultSearch/DefaultSearchService.php b/src/SearchIndexAdapter/DefaultSearch/DefaultSearchService.php index 8799312a..06a234c4 100644 --- a/src/SearchIndexAdapter/DefaultSearch/DefaultSearchService.php +++ b/src/SearchIndexAdapter/DefaultSearch/DefaultSearchService.php @@ -245,9 +245,9 @@ public function createPaginatedSearch( * @throws SearchFailedException */ public function search( - AdapterSearchInterface $search, - string $indexName, - int|bool|null $trackTotalHits = null + AdapterSearchInterface $search, + string $indexName, + int|bool|null $trackTotalHits = true ): SearchResult { return $this->searchExecutionService->executeSearch( $search, diff --git a/src/SearchIndexAdapter/DefaultSearch/Search/SearchExecutionService.php b/src/SearchIndexAdapter/DefaultSearch/Search/SearchExecutionService.php index a6a456d6..468a2916 100644 --- a/src/SearchIndexAdapter/DefaultSearch/Search/SearchExecutionService.php +++ b/src/SearchIndexAdapter/DefaultSearch/Search/SearchExecutionService.php @@ -45,8 +45,8 @@ public function __construct( public function executeSearch( AdapterSearchInterface $search, string $indexName, - int|bool|null $trackTotalHits = null - ): SearchResult { + int|bool|null $trackTotalHits = true + ): SearchResult { try { $stopWatch = new Stopwatch(); $stopWatch->start('search'); diff --git a/src/SearchIndexAdapter/DefaultSearch/Search/SearchExecutionServiceInterface.php b/src/SearchIndexAdapter/DefaultSearch/Search/SearchExecutionServiceInterface.php index 7a3f324d..3beb2bee 100644 --- a/src/SearchIndexAdapter/DefaultSearch/Search/SearchExecutionServiceInterface.php +++ b/src/SearchIndexAdapter/DefaultSearch/Search/SearchExecutionServiceInterface.php @@ -32,7 +32,7 @@ interface SearchExecutionServiceInterface public function executeSearch( AdapterSearchInterface $search, string $indexName, - int|bool|null $trackTotalHits = null + int|bool|null $trackTotalHits = true ): SearchResult; /** diff --git a/src/SearchIndexAdapter/SearchIndexServiceInterface.php b/src/SearchIndexAdapter/SearchIndexServiceInterface.php index 351f55b1..3ffbdaa1 100644 --- a/src/SearchIndexAdapter/SearchIndexServiceInterface.php +++ b/src/SearchIndexAdapter/SearchIndexServiceInterface.php @@ -61,9 +61,9 @@ public function createPaginatedSearch( * 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 = null + AdapterSearchInterface $search, + string $indexName, + int|bool|null $trackTotalHits = true ): SearchResult; public function getStats(string $indexName): array; From b9417d7062632dd0cec1600e63a6e765209c8a09 Mon Sep 17 00:00:00 2001 From: mcop1 Date: Fri, 19 Sep 2025 09:14:17 +0000 Subject: [PATCH 6/8] Apply php-cs-fixer changes --- src/SearchIndexAdapter/DefaultSearch/DefaultSearchService.php | 4 ++-- .../DefaultSearch/Search/SearchExecutionService.php | 2 +- src/SearchIndexAdapter/SearchIndexServiceInterface.php | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/SearchIndexAdapter/DefaultSearch/DefaultSearchService.php b/src/SearchIndexAdapter/DefaultSearch/DefaultSearchService.php index 06a234c4..a89598f2 100644 --- a/src/SearchIndexAdapter/DefaultSearch/DefaultSearchService.php +++ b/src/SearchIndexAdapter/DefaultSearch/DefaultSearchService.php @@ -245,8 +245,8 @@ public function createPaginatedSearch( * @throws SearchFailedException */ public function search( - AdapterSearchInterface $search, - string $indexName, + AdapterSearchInterface $search, + string $indexName, int|bool|null $trackTotalHits = true ): SearchResult { return $this->searchExecutionService->executeSearch( diff --git a/src/SearchIndexAdapter/DefaultSearch/Search/SearchExecutionService.php b/src/SearchIndexAdapter/DefaultSearch/Search/SearchExecutionService.php index 468a2916..8b1db48c 100644 --- a/src/SearchIndexAdapter/DefaultSearch/Search/SearchExecutionService.php +++ b/src/SearchIndexAdapter/DefaultSearch/Search/SearchExecutionService.php @@ -46,7 +46,7 @@ public function executeSearch( AdapterSearchInterface $search, string $indexName, int|bool|null $trackTotalHits = true - ): SearchResult { + ): SearchResult { try { $stopWatch = new Stopwatch(); $stopWatch->start('search'); diff --git a/src/SearchIndexAdapter/SearchIndexServiceInterface.php b/src/SearchIndexAdapter/SearchIndexServiceInterface.php index 3ffbdaa1..941e5672 100644 --- a/src/SearchIndexAdapter/SearchIndexServiceInterface.php +++ b/src/SearchIndexAdapter/SearchIndexServiceInterface.php @@ -61,8 +61,8 @@ public function createPaginatedSearch( * 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, + AdapterSearchInterface $search, + string $indexName, int|bool|null $trackTotalHits = true ): SearchResult; From 1a76e6349d31354152a30014cea2f836850254f3 Mon Sep 17 00:00:00 2001 From: Marco Perberschlager Date: Fri, 19 Sep 2025 09:50:56 +0000 Subject: [PATCH 7/8] Added upgrade notes --- doc/01_Installation/02_Upgrade.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/doc/01_Installation/02_Upgrade.md b/doc/01_Installation/02_Upgrade.md index b5ae760a..c9f18025 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.1.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 From 900afb8eae9b00a5138a7c64fd079aa88e706f93 Mon Sep 17 00:00:00 2001 From: Marco Perberschlager Date: Fri, 19 Sep 2025 09:51:42 +0000 Subject: [PATCH 8/8] Adapt version in upgrade note --- doc/01_Installation/02_Upgrade.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/01_Installation/02_Upgrade.md b/doc/01_Installation/02_Upgrade.md index c9f18025..afd4a941 100644 --- a/doc/01_Installation/02_Upgrade.md +++ b/doc/01_Installation/02_Upgrade.md @@ -2,7 +2,7 @@ Following steps are necessary during updating to newer versions. -## Upgrade to 2.1.0 +## 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