Cherry picked changes from doc.silverstripe.org. FEATURE: added boost options to promoting or removing listings from the search. ENHANCEMENT: use a breadcrumb trail for search title to provide additional context

This commit is contained in:
Will Rossiter 2011-04-29 14:41:30 +12:00
parent fab93f80df
commit aa0297d52a
4 changed files with 38 additions and 6 deletions

View File

@ -101,6 +101,16 @@ class DocumentationPage extends ViewableData {
return (is_dir($path)) ? rtrim($path, '/') . '/' : $path; return (is_dir($path)) ? rtrim($path, '/') . '/' : $path;
} }
/**
* @param String - has to be plain text for open search compatibility.
* @return String
*/
function getBreadcrumbTitle($divider = ' - ') {
$pathParts = explode('/', $this->getRelativePath());
$titleParts = array_map(array('DocumentationService', 'clean_page_name'), $pathParts);
return implode($divider, $titleParts + array($this->getTitle()));
}
/** /**
* Returns the link for the web browser * Returns the link for the web browser
* *

View File

@ -32,6 +32,13 @@ class DocumentationSearch {
*/ */
private static $meta_data = array(); private static $meta_data = array();
/**
* @var Array Regular expression mapped to a "boost factor" for the searched document.
* Defaults to 1.0, lower to decrease relevancy. Requires reindex.
* Uses {@link DocumentationPage->getRelativePath()} for comparison.
*/
static $boost_by_path = array();
/** /**
* @var DataObjectSet - Results * @var DataObjectSet - Results
*/ */
@ -129,7 +136,12 @@ class DocumentationSearch {
self::$enabled = true; self::$enabled = true;
// include the zend search functionality // include the zend search functionality
set_include_path(get_include_path() . PATH_SEPARATOR . dirname(dirname(__FILE__)) . '/thirdparty/'); set_include_path(
dirname(dirname(__FILE__)) . '/thirdparty/'. PATH_SEPARATOR .
get_include_path()
);
require_once 'Zend/Search/Lucene.php';
} }
/** /**
@ -213,6 +225,7 @@ class DocumentationSearch {
// do a simple markdown parse of the file // do a simple markdown parse of the file
$obj = new ArrayData(array( $obj = new ArrayData(array(
'Title' => DBField::create('Varchar', $doc->getFieldValue('Title')), 'Title' => DBField::create('Varchar', $doc->getFieldValue('Title')),
'BreadcrumbTitle' => DBField::create('HTMLText', $doc->getFieldValue('BreadcrumbTitle')),
'Link' => DBField::create('Varchar',$doc->getFieldValue('Link')), 'Link' => DBField::create('Varchar',$doc->getFieldValue('Link')),
'Language' => DBField::create('Varchar',$doc->getFieldValue('Language')), 'Language' => DBField::create('Varchar',$doc->getFieldValue('Language')),
'Version' => DBField::create('Varchar',$doc->getFieldValue('Version')), 'Version' => DBField::create('Varchar',$doc->getFieldValue('Version')),
@ -350,7 +363,6 @@ class DocumentationSearch {
$request = $this->outputController->getRequest(); $request = $this->outputController->getRequest();
$data = $this->getSearchResults($request); $data = $this->getSearchResults($request);
$templates = array('DocumentationViewer_results', 'DocumentationViewer'); $templates = array('DocumentationViewer_results', 'DocumentationViewer');
if($request->requestVar('format') && $request->requestVar('format') == "atom") { if($request->requestVar('format') && $request->requestVar('format') == "atom") {

View File

@ -21,6 +21,7 @@ class RebuildLuceneDocsIndex extends BuildTask {
function rebuildIndexes($quiet = false) { function rebuildIndexes($quiet = false) {
require_once(BASE_PATH . '/sapphiredocs/thirdparty/markdown/markdown.php'); require_once(BASE_PATH . '/sapphiredocs/thirdparty/markdown/markdown.php');
require_once 'Zend/Search/Lucene.php';
ini_set("memory_limit", -1); ini_set("memory_limit", -1);
ini_set('max_execution_time', 0); ini_set('max_execution_time', 0);
@ -43,7 +44,7 @@ class RebuildLuceneDocsIndex extends BuildTask {
$index->removeReference(); $index->removeReference();
} }
catch (Zend_Search_Lucene_Exception $e) { catch (Zend_Search_Lucene_Exception $e) {
user_error($e); // user_error($e);
} }
try { try {
@ -73,14 +74,23 @@ class RebuildLuceneDocsIndex extends BuildTask {
if($content) $content = Markdown($content); if($content) $content = Markdown($content);
$doc->addField(Zend_Search_Lucene_Field::Text('content', $content)); $doc->addField(Zend_Search_Lucene_Field::Text('content', $content));
$doc->addField(Zend_Search_Lucene_Field::Text('Title', $page->getTitle())); $doc->addField($titleField = Zend_Search_Lucene_Field::Text('Title', $page->getTitle()));
$doc->addField($breadcrumbField = Zend_Search_Lucene_Field::Text('BreadcrumbTitle', $page->getBreadcrumbTitle()));
$doc->addField(Zend_Search_Lucene_Field::Keyword('Version', $page->getVersion())); $doc->addField(Zend_Search_Lucene_Field::Keyword('Version', $page->getVersion()));
$doc->addField(Zend_Search_Lucene_Field::Keyword('Language', $page->getLang())); $doc->addField(Zend_Search_Lucene_Field::Keyword('Language', $page->getLang()));
$doc->addField(Zend_Search_Lucene_Field::Keyword('Link', $page->Link())); $doc->addField(Zend_Search_Lucene_Field::Keyword('Link', $page->Link()));
// custom boosts
$titleField->boost = 1.5;
$breadcrumbField->boost = 1.5;
foreach(DocumentationSearch::$boost_by_path as $pathExpr => $boost) {
if(preg_match($pathExpr, $page->getRelativePath())) $doc->boost = $boost;
}
$index->addDocument($doc); $index->addDocument($doc);
} }
if(!$quiet) echo "adding ". $page->getTitle() ."\n\n"; if(!$quiet) echo "adding ". $page->getPath() ."\n";
} }
error_reporting($error); error_reporting($error);

View File

@ -13,7 +13,7 @@
<opensearch:Query role="request" searchTerms="$Query" startIndex="$StartResult" count="$PageLength"></opensearch:Query> <opensearch:Query role="request" searchTerms="$Query" startIndex="$StartResult" count="$PageLength"></opensearch:Query>
<% control Results %> <% control Results %>
<entry> <entry>
<title>$Title</title> <title><% if BreadcrumbTitle %>$BreadcrumbTitle<% else %>$Title<% end_if %></title>
<link href="$Link">$Link</link> <link href="$Link">$Link</link>
<id>urn:uuid:$ID</id> <id>urn:uuid:$ID</id>
<content type="text">$Content.LimitCharacters(200)</content> <content type="text">$Content.LimitCharacters(200)</content>