Skip to content

Commit 6b3e0e8

Browse files
committed
!!! FEATURE: Only the now configurable source of the suggestion is returned
1 parent 0cb21df commit 6b3e0e8

1 file changed

Lines changed: 34 additions & 19 deletions

File tree

Classes/Controller/SuggestController.php

Lines changed: 34 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,12 @@ class SuggestController extends ActionController
4747
'json' => JsonView::class
4848
];
4949

50+
/**
51+
* @Flow\InjectConfiguration("searchAsYouType")
52+
* @var array
53+
*/
54+
protected $searchAsYouTypeSettings = [];
55+
5056
public function initializeObject()
5157
{
5258
if ($this->objectManager->isRegistered(ElasticSearchClient::class)) {
@@ -96,10 +102,11 @@ public function indexAction($term, $contextNodeIdentifier, $dimensionCombination
96102
* @param string $term
97103
* @param string $contextNodeIdentifier
98104
* @param string $dimensionCombination
99-
* @return ElasticSearchQueryBuilder
105+
* @return string
100106
* @throws QueryBuildingException
107+
* @throws \Neos\Flow\Persistence\Exception\IllegalObjectTypeException
101108
*/
102-
protected function buildRequestForTerm($term, $contextNodeIdentifier, $dimensionCombination = null)
109+
protected function buildRequestForTerm($term, $contextNodeIdentifier, $dimensionCombination = null): string
103110
{
104111
$cacheKey = $contextNodeIdentifier . '-' . md5($dimensionCombination);
105112
$termPlaceholder = '---term-soh2gufuNi---';
@@ -113,39 +120,44 @@ protected function buildRequestForTerm($term, $contextNodeIdentifier, $dimension
113120
$contentContext = $this->createContentContext('live', $dimensionCombination ? json_decode($dimensionCombination, true) : []);
114121
$contextNode = $contentContext->getNodeByIdentifier($contextNodeIdentifier);
115122

123+
$sourceFields = $this->searchAsYouTypeSettings['suggestions']['sourceFields'] ?? ['__path'];
124+
116125
/** @var ElasticSearchQueryBuilder $query */
117-
$query = $this->elasticSearchQueryBuilder->query($contextNode);
118-
$query
126+
$query = $this->elasticSearchQueryBuilder
127+
->query($contextNode)
119128
->queryFilter('prefix', [
120129
'__completion' => $termPlaceholder
121130
])
122-
->limit(1)
131+
->limit(0)
123132
->aggregation('autocomplete', [
124133
'terms' => [
125134
'field' => '__completion',
126135
'order' => [
127136
'_count' => 'desc'
128137
],
129-
'include' => [
130-
'pattern' => $termPlaceholder . '.*'
131-
]
138+
'include' => $termPlaceholder . '.*',
139+
'size' => $this->searchAsYouTypeSettings['autocomplete']['size'] ?? 10
132140
]
133141
])
134142
->suggestions('suggestions', [
135143
'prefix' => $termPlaceholder,
136144
'completion' => [
137145
'field' => '__suggestions',
138146
'fuzzy' => true,
139-
'size' => 10,
140-
'context' => [
147+
'size' => $this->searchAsYouTypeSettings['suggestions']['size'] ?? 10,
148+
'contexts' => [
141149
'parentPath' => $contextNode->getPath(),
142150
'workspace' => 'live',
143151
'dimensionCombinationHash' => md5(json_encode($contextNode->getContext()->getDimensions())),
144152
]
145153
]
146154
]);
147155

148-
$requestTemplate = $query->getRequest()->getRequestAsJson();
156+
$request = $query->getRequest()->toArray();
157+
158+
$request['_source'] = $sourceFields;
159+
160+
$requestTemplate = json_encode($request);
149161

150162
$this->elasticSearchQueryTemplateCache->set($contextNodeIdentifier, $requestTemplate);
151163
} else {
@@ -163,26 +175,29 @@ protected function buildRequestForTerm($term, $contextNodeIdentifier, $dimension
163175
*/
164176
protected function extractCompletions($response)
165177
{
166-
$aggregations = isset($response['aggregations']) ? $response['aggregations'] : [];
178+
$aggregations = $response['aggregations'] ?? [];
167179

168-
return array_map(function ($option) {
180+
return array_map(static function ($option) {
169181
return $option['key'];
170182
}, $aggregations['autocomplete']['buckets']);
171183
}
172184

173185
/**
174186
* Extract suggestion options
175187
*
176-
* @param $response
188+
* @param array $response
177189
* @return array
178190
*/
179-
protected function extractSuggestions($response)
191+
protected function extractSuggestions(array $response): array
180192
{
181-
$suggestionOptions = isset($response['suggest']) ? $response['suggest'] : [];
193+
$suggestionOptions = $response['suggest']['suggestions'][0]['options'] ?? [];
182194

183-
if (count($suggestionOptions['suggestions'][0]['options']) > 0) {
184-
return $suggestionOptions['suggestions'][0]['options'];
195+
if (empty($suggestionOptions)) {
196+
return [];
185197
}
186-
return [];
198+
199+
return array_map(static function ($option) {
200+
return $option['_source'];
201+
}, $suggestionOptions);
187202
}
188203
}

0 commit comments

Comments
 (0)