diff --git a/code/solr/SolrIndex.php b/code/solr/SolrIndex.php index 0f36d5a..d9fbab8 100644 --- a/code/solr/SolrIndex.php +++ b/code/solr/SolrIndex.php @@ -342,7 +342,22 @@ abstract class SolrIndex extends SearchIndex { if($res->getHttpStatus() >= 200 && $res->getHttpStatus() < 300) { foreach ($res->response->docs as $doc) { $result = DataObject::get_by_id($doc->ClassName, $doc->ID); - if($result) $results->push($result); + if($result) { + $results->push($result); + + // Add highlighting (optional) + $docId = $doc->_documentid; + if($res->highlighting && $res->highlighting->$docId) { + // TODO Create decorator class for search results rather than adding arbitrary object properties + // TODO Allow specifying highlighted field, and lazy loading + // in case the search API needs another query (similar to SphinxSearchable->buildExcerpt()). + $combinedHighlights = array(); + foreach($res->highlighting->$docId as $field => $highlights) { + $combinedHighlights = array_merge($combinedHighlights, $highlights); + } + $result->Excerpt = implode(' ... ', $combinedHighlights); + } + } } $numFound = $res->response->numFound; } else { diff --git a/docs/Solr.md b/docs/Solr.md index ccb586d..9080400 100644 --- a/docs/Solr.md +++ b/docs/Solr.md @@ -253,6 +253,38 @@ from a new file `mysite/solr/templates/types.ss` instead: } } +### Highlighting + +Solr can highlight the searched terms in context of the matched content, +to help users determine the relevancy of results (e.g. in which part of a sentence +the term is used). In order to use this feature, the full content of the +field to be highlighted needs to be stored in the index, +by declaring it through `addStoredField()`. + + addClass('Page'); + $this->addAllFulltextFields(); + $this->addStoredField('Content'); + } + } + +To search with highlighting enabled, you need to pass in a custom query parameter. +There's a lot more parameters to tweak results on the [Solr Wiki](http://wiki.apache.org/solr/HighlightingParameters). + + $index = new MyIndex(); + $query = new SearchQuery(); + $query->search('My Term'); + $results = $index->search($query, -1, -1, array('hl' => 'true')); + +Each result will automatically contain an "Excerpt" property +which you can use in your own results template. +The searched term is highlighted with an `` tag by default. + +Note: It is recommended to strip out all HTML tags and convert entities on the indexed content, +to avoid matching HTML attributes, and cluttering highlighted content with unparsed HTML. + ## Debugging ### Using the web admin interface