Merge pull request #58 from silverstripe-iterators/pulls/spelling-suggestions

Make spelling suggestions more useful
This commit is contained in:
Ingo Schommer 2015-01-06 16:47:14 +13:00
commit 79eb663638
1 changed files with 45 additions and 3 deletions

View File

@ -116,6 +116,33 @@ abstract class SolrIndex extends SearchIndex {
return implode("\n\t\t", $xml);
}
/**
* Extract a human friendly spelling suggestion from a Solr spellcheck collation string.
* @param String $collation
* @return String
*/
protected function getNiceSuggestion($collation = '') {
$collationParts = explode(' ', $collation);
// Remove advanced query params from the beginning of each collation part.
foreach ($collationParts as $key => &$part) {
$part = ltrim($part, '+');
}
return implode(' ', $collationParts);
}
/**
* Extract a query string from a Solr spellcheck collation string.
* Useful for constructing 'Did you mean?' links, for example:
* <a href="http://example.com/search?q=$SuggestionQueryString">$SuggestionNice</a>
* @param String $collation
* @return String
*/
protected function getSuggestionQueryString($collation = '') {
return str_replace(' ', '+', $this->getNiceSuggestion($collation));
}
/**
* @param String $name
* @param Array $spec
@ -470,9 +497,24 @@ abstract class SolrIndex extends SearchIndex {
$ret['Matches']->setPageStart($offset);
// Results per page
$ret['Matches']->setPageLength($limit);
// Suggestions (requires custom setup, assumes spellcheck.collate=true)
if(isset($res->spellcheck->suggestions->collation)) {
$ret['Suggestion'] = $res->spellcheck->suggestions->collation;
// Include spellcheck and suggestion data. Requires spellcheck=true in $params
if(isset($res->spellcheck)) {
// Expose all spellcheck data, for custom handling.
$ret['Spellcheck'] = $res->spellcheck;
// Suggestions. Requires spellcheck.collate=true in $params
if(isset($res->spellcheck->suggestions->collation)) {
// The collation, including advanced query params (e.g. +), suitable for making another query programmatically.
$ret['Suggestion'] = $res->spellcheck->suggestions->collation;
// A human friendly version of the suggestion, suitable for 'Did you mean $SuggestionNice?' display.
$ret['SuggestionNice'] = $this->getNiceSuggestion($res->spellcheck->suggestions->collation);
// A string suitable for appending to an href as a query string.
// For example <a href="http://example.com/search?q=$SuggestionQueryString">$SuggestionNice</a>
$ret['SuggestionQueryString'] = $this->getSuggestionQueryString($res->spellcheck->suggestions->collation);
}
}
return new ArrayData($ret);