@@ -230,6 +230,10 @@ discard block  | 
                                                    ||
| 230 | 230 | /*  | 
                                                        
| 231 | 231 | Set the highlight fields for subsequent searches  | 
                                                        
| 232 | 232 | */  | 
                                                        
| 233 | +  | 
                                                        |
| 234 | + /**  | 
                                                        |
| 235 | + * @param string[] $newHighlightedFields  | 
                                                        |
| 236 | + */  | 
                                                        |
| 233 | 237 |  	public function setHighlightedFields($newHighlightedFields) { | 
                                                        
| 234 | 238 | $this->highlightedFields = $newHighlightedFields;  | 
                                                        
| 235 | 239 | }  | 
                                                        
@@ -242,7 +246,7 @@ discard block  | 
                                                    ||
| 242 | 246 | * @param string $queryText query string, e.g. 'New Zealand'  | 
                                                        
| 243 | 247 | * @param array $fieldsToSearch Mapping of name to an array of mapping Weight and Elastic mapping,  | 
                                                        
| 244 | 248 |  	 *                              e.g. array('Title' => array('Weight' => 2, 'Type' => 'string')) | 
                                                        
| 245 | - * @return ArrayList SilverStripe DataObjects returned from the search against ElasticSearch  | 
                                                        |
| 249 | + * @return \PaginatedList SilverStripe DataObjects returned from the search against ElasticSearch  | 
                                                        |
| 246 | 250 | */  | 
                                                        
| 247 | 251 |  	public function search($queryText, $fieldsToSearch = null,  $testMode = false) { | 
                                                        
| 248 | 252 |  		if ($this->locale == null) { | 
                                                        
@@ -307,6 +311,10 @@ discard block  | 
                                                    ||
| 307 | 311 | |
| 308 | 312 | |
| 309 | 313 | /* Perform an autocomplete search */  | 
                                                        
| 314 | +  | 
                                                        |
| 315 | + /**  | 
                                                        |
| 316 | + * @param string $queryText  | 
                                                        |
| 317 | + */  | 
                                                        |
| 310 | 318 |  	public function autocomplete_search($queryText, $field) { | 
                                                        
| 311 | 319 |  		if ($this->locale == null) { | 
                                                        
| 312 | 320 |  			if (class_exists('Translatable') && \SiteTree::has_extension('Translatable')) { | 
                                                        
@@ -358,11 +366,11 @@ discard block  | 
                                                    ||
| 358 | 366 | |
| 359 | 367 | /**  | 
                                                        
| 360 | 368 | * Perform a 'More Like This' search, aka relevance feedback, using the provided indexed DataObject  | 
                                                        
| 361 | - * @param DataObject $indexedItem A DataObject that has been indexed in Elasticsearch  | 
                                                        |
| 369 | + * @param \DataObject|null $indexedItem A DataObject that has been indexed in Elasticsearch  | 
                                                        |
| 362 | 370 | * @param array $fieldsToSearch array of fieldnames to search, mapped to weighting  | 
                                                        
| 363 | 371 | * @param $$testMode Use all shards, not just one, for consistent results during unit testing. See  | 
                                                        
| 364 | 372 | * https://www.elastic.co/guide/en/elasticsearch/guide/current/relevance-is-broken.html#relevance-is-broken  | 
                                                        
| 365 | - * @return resultList List of results  | 
                                                        |
| 373 | + * @return \PaginatedList List of results  | 
                                                        |
| 366 | 374 | */  | 
                                                        
| 367 | 375 |  	public function moreLikeThis($indexedItem, $fieldsToSearch, $testMode = false) { | 
                                                        
| 368 | 376 | echo "INDEXED ITEM:".$indexedItem;  | 
                                                        
@@ -469,6 +477,9 @@ discard block  | 
                                                    ||
| 469 | 477 | return $result;  | 
                                                        
| 470 | 478 | }  | 
                                                        
| 471 | 479 | |
| 480 | + /**  | 
                                                        |
| 481 | + * @return string  | 
                                                        |
| 482 | + */  | 
                                                        |
| 472 | 483 |  	public function getSuggestedQuery() { | 
                                                        
| 473 | 484 | return $this->SuggestedQuery;  | 
                                                        
| 474 | 485 | }  | 
                                                        
@@ -244,7 +244,7 @@ discard block  | 
                                                    ||
| 244 | 244 |  	 *                              e.g. array('Title' => array('Weight' => 2, 'Type' => 'string')) | 
                                                        
| 245 | 245 | * @return ArrayList SilverStripe DataObjects returned from the search against ElasticSearch  | 
                                                        
| 246 | 246 | */  | 
                                                        
| 247 | -	public function search($queryText, $fieldsToSearch = null,  $testMode = false) { | 
                                                        |
| 247 | +	public function search($queryText, $fieldsToSearch = null, $testMode = false) { | 
                                                        |
| 248 | 248 |  		if ($this->locale == null) { | 
                                                        
| 249 | 249 |  			if (class_exists('Translatable') && \SiteTree::has_extension('Translatable')) { | 
                                                        
| 250 | 250 | $this->locale = \Translatable::get_current_locale();  | 
                                                        
@@ -365,14 +365,14 @@ discard block  | 
                                                    ||
| 365 | 365 | * @return resultList List of results  | 
                                                        
| 366 | 366 | */  | 
                                                        
| 367 | 367 |  	public function moreLikeThis($indexedItem, $fieldsToSearch, $testMode = false) { | 
                                                        
| 368 | - echo "INDEXED ITEM:".$indexedItem;  | 
                                                        |
| 368 | + echo "INDEXED ITEM:" . $indexedItem;  | 
                                                        |
| 369 | 369 | |
| 370 | 370 |  		if ($indexedItem == null) { | 
                                                        
| 371 | 371 |  			throw new \InvalidArgumentException('A searchable item cannot be null'); | 
                                                        
| 372 | 372 | }  | 
                                                        
| 373 | 373 | |
| 374 | 374 |  		if (!$indexedItem->hasExtension('SilverStripe\Elastica\Searchable')) { | 
                                                        
| 375 | -			throw new \InvalidArgumentException('Objects of class '.$indexedItem->ClassName.' are not searchable'); | 
                                                        |
| 375 | +			throw new \InvalidArgumentException('Objects of class ' . $indexedItem->ClassName . ' are not searchable'); | 
                                                        |
| 376 | 376 | }  | 
                                                        
| 377 | 377 | |
| 378 | 378 |  		if ($fieldsToSearch == null) { | 
                                                        
@@ -396,7 +396,7 @@ discard block  | 
                                                    ||
| 396 | 396 |  			if (!is_numeric($weighting)) { | 
                                                        
| 397 | 397 |  				throw new \InvalidArgumentException('Fields must be of the form fieldname => weight'); | 
                                                        
| 398 | 398 | }  | 
                                                        
| 399 | - $weightedField = $field.'^'.$weighting;  | 
                                                        |
| 399 | + $weightedField = $field . '^' . $weighting;  | 
                                                        |
| 400 | 400 |  			$weightedField = str_replace('^1', '', $weightedField); | 
                                                        
| 401 | 401 | array_push($weightedFieldsArray, $weightedField);  | 
                                                        
| 402 | 402 | }  | 
                                                        
@@ -141,7 +141,7 @@ discard block  | 
                                                    ||
| 141 | 141 |  			$types = explode(',', $types); | 
                                                        
| 142 | 142 | }  | 
                                                        
| 143 | 143 | |
| 144 | - $data = $query->toArray();  | 
                                                        |
| 144 | + $data = $query->toArray();  | 
                                                        |
| 145 | 145 |  		if (isset($data['query']['more_like_this'])) { | 
                                                        
| 146 | 146 | $query->MoreLikeThis = true;  | 
                                                        
| 147 | 147 |  		} else { | 
                                                        
@@ -164,21 +164,21 @@ discard block  | 
                                                    ||
| 164 | 164 |  		if ($query->MoreLikeThis) { | 
                                                        
| 165 | 165 | $path = $search->getPath();  | 
                                                        
| 166 | 166 | |
| 167 | - $termData = array();  | 
                                                        |
| 168 | - $termData['query'] = $data['query'];  | 
                                                        |
| 167 | + $termData = array();  | 
                                                        |
| 168 | + $termData['query'] = $data['query'];  | 
                                                        |
| 169 | 169 | |
| 170 | -	        $path = str_replace('_search', '_validate/query', $path); | 
                                                        |
| 171 | -	        $params = array('explain' => true, 'rewrite' => true); | 
                                                        |
| 172 | -	        if ($this->test_mode) { | 
                                                        |
| 173 | - $params['search_type'] = Search::OPTION_SEARCH_TYPE_DFS_QUERY_THEN_FETCH;  | 
                                                        |
| 174 | - }  | 
                                                        |
| 170 | +			$path = str_replace('_search', '_validate/query', $path); | 
                                                        |
| 171 | +			$params = array('explain' => true, 'rewrite' => true); | 
                                                        |
| 172 | +			if ($this->test_mode) { | 
                                                        |
| 173 | + $params['search_type'] = Search::OPTION_SEARCH_TYPE_DFS_QUERY_THEN_FETCH;  | 
                                                        |
| 174 | + }  | 
                                                        |
| 175 | 175 | |
| 176 | - $response = $this->getClient()->request(  | 
                                                        |
| 177 | - $path,  | 
                                                        |
| 178 | - \Elastica\Request::GET,  | 
                                                        |
| 179 | - $termData,  | 
                                                        |
| 180 | - $params  | 
                                                        |
| 181 | - );  | 
                                                        |
| 176 | + $response = $this->getClient()->request(  | 
                                                        |
| 177 | + $path,  | 
                                                        |
| 178 | + \Elastica\Request::GET,  | 
                                                        |
| 179 | + $termData,  | 
                                                        |
| 180 | + $params  | 
                                                        |
| 181 | + );  | 
                                                        |
| 182 | 182 | |
| 183 | 183 | $r = $response->getData();  | 
                                                        
| 184 | 184 | $terms = null; // keep in scope  | 
                                                        
@@ -194,14 +194,14 @@ discard block  | 
                                                    ||
| 194 | 194 | }  | 
                                                        
| 195 | 195 | }  | 
                                                        
| 196 | 196 | |
| 197 | -        if (!$empty($types)) { | 
                                                        |
| 198 | -        	foreach($types as $type) { | 
                                                        |
| 199 | - $search->addType($type);  | 
                                                        |
| 200 | - }  | 
                                                        |
| 201 | - }  | 
                                                        |
| 197 | +		if (!$empty($types)) { | 
                                                        |
| 198 | +			foreach($types as $type) { | 
                                                        |
| 199 | + $search->addType($type);  | 
                                                        |
| 200 | + }  | 
                                                        |
| 201 | + }  | 
                                                        |
| 202 | 202 | |
| 203 | - $path = $search->getPath();  | 
                                                        |
| 204 | - $params = $search->getOptions();  | 
                                                        |
| 203 | + $path = $search->getPath();  | 
                                                        |
| 204 | + $params = $search->getOptions();  | 
                                                        |
| 205 | 205 | |
| 206 | 206 |  		$highlightsCfg = \Config::inst()->get('Elastica', 'Highlights'); | 
                                                        
| 207 | 207 | $preTags = $highlightsCfg['PreTags'];  | 
                                                        
@@ -269,14 +269,14 @@ discard block  | 
                                                    ||
| 269 | 269 | }  | 
                                                        
| 270 | 270 | |
| 271 | 271 | |
| 272 | - $path = $search->getPath();  | 
                                                        |
| 273 | - $params = $search->getOptions();  | 
                                                        |
| 272 | + $path = $search->getPath();  | 
                                                        |
| 273 | + $params = $search->getOptions();  | 
                                                        |
| 274 | 274 | $searchResults = $search->search($query, $params);  | 
                                                        
| 275 | 275 |  		if (isset($this->MoreLikeThisTerms)) { | 
                                                        
| 276 | 276 | $searchResults->MoreLikeThisTerms = $this->MoreLikeThisTerms;  | 
                                                        
| 277 | 277 | }  | 
                                                        
| 278 | 278 | |
| 279 | - return $searchResults;  | 
                                                        |
| 279 | + return $searchResults;  | 
                                                        |
| 280 | 280 | }  | 
                                                        
| 281 | 281 | |
| 282 | 282 | |
@@ -350,11 +350,11 @@ discard block  | 
                                                    ||
| 350 | 350 | |
| 351 | 351 |  	public function listIndexes($trace) { | 
                                                        
| 352 | 352 | $command = "curl 'localhost:9200/_cat/indices?v'";  | 
                                                        
| 353 | - exec($command,$op);  | 
                                                        |
| 354 | -        ElasticaUtil::message("\n++++ $trace ++++\n"); | 
                                                        |
| 355 | - ElasticaUtil::message(print_r($op,1));  | 
                                                        |
| 356 | -        ElasticaUtil::message("++++ /{$trace} ++++\n\n"); | 
                                                        |
| 357 | - return $op;  | 
                                                        |
| 353 | + exec($command,$op);  | 
                                                        |
| 354 | +		ElasticaUtil::message("\n++++ $trace ++++\n"); | 
                                                        |
| 355 | + ElasticaUtil::message(print_r($op,1));  | 
                                                        |
| 356 | +		ElasticaUtil::message("++++ /{$trace} ++++\n\n"); | 
                                                        |
| 357 | + return $op;  | 
                                                        |
| 358 | 358 | }  | 
                                                        
| 359 | 359 | |
| 360 | 360 | |
@@ -525,11 +525,11 @@ discard block  | 
                                                    ||
| 525 | 525 |  			} else { | 
                                                        
| 526 | 526 | $class = new \ReflectionClass($classname);  | 
                                                        
| 527 | 527 |  				while ($class = $class->getParentClass()) { | 
                                                        
| 528 | - $parentClass = $class->getName();  | 
                                                        |
| 529 | -				    if ($parentClass == 'SiteTree') { | 
                                                        |
| 530 | - $inSiteTree = true;  | 
                                                        |
| 531 | - break;  | 
                                                        |
| 532 | - }  | 
                                                        |
| 528 | + $parentClass = $class->getName();  | 
                                                        |
| 529 | +					if ($parentClass == 'SiteTree') { | 
                                                        |
| 530 | + $inSiteTree = true;  | 
                                                        |
| 531 | + break;  | 
                                                        |
| 532 | + }  | 
                                                        |
| 533 | 533 | }  | 
                                                        
| 534 | 534 | self::$site_tree_classes[$classname] = $inSiteTree;  | 
                                                        
| 535 | 535 | }  | 
                                                        
@@ -683,15 +683,15 @@ discard block  | 
                                                    ||
| 683 | 683 | //FlickrPhoto/3829/_termvector  | 
                                                        
| 684 | 684 | $path = $this->getIndex()->getName().'/'.$searchable->ClassName.'/'.$searchable->ID.'/_termvector';  | 
                                                        
| 685 | 685 | $response = $this->getClient()->request(  | 
                                                        
| 686 | - $path,  | 
                                                        |
| 687 | - \Elastica\Request::GET,  | 
                                                        |
| 688 | - $data,  | 
                                                        |
| 689 | - $params  | 
                                                        |
| 690 | - );  | 
                                                        |
| 686 | + $path,  | 
                                                        |
| 687 | + \Elastica\Request::GET,  | 
                                                        |
| 688 | + $data,  | 
                                                        |
| 689 | + $params  | 
                                                        |
| 690 | + );  | 
                                                        |
| 691 | 691 | |
| 692 | 692 | |
| 693 | - $data = $response->getData();  | 
                                                        |
| 694 | - return $data['term_vectors'];  | 
                                                        |
| 693 | + $data = $response->getData();  | 
                                                        |
| 694 | + return $data['term_vectors'];  | 
                                                        |
| 695 | 695 | }  | 
                                                        
| 696 | 696 | |
| 697 | 697 | }  |