diff --git a/lib/Alchemy/Phrasea/Controller/Api/V1Controller.php b/lib/Alchemy/Phrasea/Controller/Api/V1Controller.php index 66ad090fcb..2e28ff866c 100644 --- a/lib/Alchemy/Phrasea/Controller/Api/V1Controller.php +++ b/lib/Alchemy/Phrasea/Controller/Api/V1Controller.php @@ -1099,18 +1099,19 @@ class V1Controller extends Controller $this->getSearchEngine()->clearCache(); $ret = [ - 'offset_start' => $offsetStart, - 'per_page' => $perPage, + 'offset_start' => $offsetStart, + 'per_page' => $perPage, 'available_results' => $search_result->getAvailable(), - 'total_results' => $search_result->getTotal(), - 'error' => (string)$search_result->getError(), - 'warning' => (string)$search_result->getWarning(), - 'query_time' => $search_result->getDuration(), - 'search_indexes' => $search_result->getIndexes(), - 'suggestions' => array_map( + 'total_results' => $search_result->getTotal(), + 'error' => (string)$search_result->getError(), + 'warning' => (string)$search_result->getWarning(), + 'query_time' => $search_result->getDuration(), + 'search_indexes' => $search_result->getIndexes(), + 'suggestions' => array_map( function (SearchEngineSuggestion $suggestion) { return $suggestion->toArray(); }, $search_result->getSuggestions()->toArray()), + 'facets' => $search_result->getFacets(), 'results' => [], 'query' => $search_result->getQuery(), ]; diff --git a/lib/Alchemy/Phrasea/SearchEngine/Elastic/ElasticSearchEngine.php b/lib/Alchemy/Phrasea/SearchEngine/Elastic/ElasticSearchEngine.php index f6f10946cd..9f9c159ba3 100644 --- a/lib/Alchemy/Phrasea/SearchEngine/Elastic/ElasticSearchEngine.php +++ b/lib/Alchemy/Phrasea/SearchEngine/Elastic/ElasticSearchEngine.php @@ -271,13 +271,13 @@ class ElasticSearchEngine implements SearchEngineInterface $res = $this->client->search($params); $results = new ArrayCollection(); - $suggestions = new ArrayCollection(); $n = 0; foreach ($res['hits']['hits'] as $hit) { $results[] = ElasticsearchRecordHydrator::hydrate($hit, $n++); } + /** @var FacetsResponse $facets */ $facets = $this->facetsResponseFactory->__invoke($res); $query['ast'] = $this->app['query_compiler']->parse($string)->dump(); @@ -285,9 +285,20 @@ class ElasticSearchEngine implements SearchEngineInterface $query['query'] = $params['body']; $query['query_string'] = json_encode($params['body']); - return new SearchEngineResult($results, json_encode($query), $res['took'], $offset, - $res['hits']['total'], $res['hits']['total'], null, null, $suggestions, [], - $this->indexName, $facets); + return new SearchEngineResult( + $results, // ArrayCollection of results + json_encode($query), + $res['took'], // duration + $offset, // offset start + $res['hits']['total'], // available + $res['hits']['total'], // total + null, // error + null, // warning + $facets->getAsSuggestions(), // ArrayCollection of suggestions + [], // propositions + $this->indexName, + $facets + ); } /** diff --git a/lib/Alchemy/Phrasea/SearchEngine/Elastic/Search/FacetsResponse.php b/lib/Alchemy/Phrasea/SearchEngine/Elastic/Search/FacetsResponse.php index b6a63e9b71..d7f3a8fb7a 100644 --- a/lib/Alchemy/Phrasea/SearchEngine/Elastic/Search/FacetsResponse.php +++ b/lib/Alchemy/Phrasea/SearchEngine/Elastic/Search/FacetsResponse.php @@ -3,6 +3,8 @@ namespace Alchemy\Phrasea\SearchEngine\Elastic\Search; use Alchemy\Phrasea\Exception\RuntimeException; +use Alchemy\Phrasea\SearchEngine\SearchEngineSuggestion; +use Doctrine\Common\Collections\ArrayCollection; use JsonSerializable; class FacetsResponse implements JsonSerializable @@ -31,6 +33,23 @@ class FacetsResponse implements JsonSerializable } } + /** + * @return ArrayCollection + */ + public function getAsSuggestions() + { + $suggestions = new ArrayCollection(); + + // for es, suggestions are a flat view of facets (api backward compatibility) + foreach ($this->facets as $facet) { + foreach ($facet['values'] as $value) { + $suggestions->add(new SearchEngineSuggestion($value['query'], $value['value'], $value['count'])); + } + } + + return $suggestions; + } + private function buildBucketsValues($name, $buckets) { $values = array(); diff --git a/lib/Alchemy/Phrasea/SearchEngine/SearchEngineSuggestion.php b/lib/Alchemy/Phrasea/SearchEngine/SearchEngineSuggestion.php index 3997ea46e2..7d3f18d161 100644 --- a/lib/Alchemy/Phrasea/SearchEngine/SearchEngineSuggestion.php +++ b/lib/Alchemy/Phrasea/SearchEngine/SearchEngineSuggestion.php @@ -74,7 +74,8 @@ class SearchEngineSuggestion public function toArray() { return [ - 'query' => $this->getSuggestion(), + 'suggestion' => $this->getSuggestion(), + 'query' => $this->getQuery(), 'hits' => $this->getHits(), ]; } diff --git a/tests/Alchemy/Tests/Phrasea/SearchEngine/SearchEngineSuggestionTest.php b/tests/Alchemy/Tests/Phrasea/SearchEngine/SearchEngineSuggestionTest.php index 347d797676..b6a8a6e614 100644 --- a/tests/Alchemy/Tests/Phrasea/SearchEngine/SearchEngineSuggestionTest.php +++ b/tests/Alchemy/Tests/Phrasea/SearchEngine/SearchEngineSuggestionTest.php @@ -44,7 +44,7 @@ class SearchEngineSuggestionTest extends \PhraseanetTestCase $hits = 35; $suggestion = new SearchEngineSuggestion($query, $words, $hits); - $this->assertEquals(['query' => $words, 'hits' => 35], $suggestion->toArray()); + $this->assertEquals(['query' => $query, 'hits' => 35, 'suggestion' => $words], $suggestion->toArray()); } public function testToArrayWithNullValue() @@ -54,6 +54,6 @@ class SearchEngineSuggestionTest extends \PhraseanetTestCase $hits = null; $suggestion = new SearchEngineSuggestion($query, $words, $hits); - $this->assertEquals(['query' => $words, 'hits' => null], $suggestion->toArray()); + $this->assertEquals(['query' => $query, 'hits' => null, 'suggestion' => $words], $suggestion->toArray()); } }