@@ -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