You can try customising the search form to have a different action. I did something similar a long time ago, this might help give you some ideas.
In Page.php
Eg. SearchForm function
public function SearchForm() {
$searchText = _t('SearchForm.SEARCH', 'Search');
if($this->owner->request && $this->owner->request->getVar('Search')) {
$searchText = $this->owner->request->getVar('Search');
}
$fields = new FieldList(
new TextField('Search', false, $searchText)
);
$actions = new FieldList(
new FormAction('fullresults', _t('SearchForm.GO', 'Go')) //this is the only real change to tell the form to use a different function for the action
);
$form = new SearchForm($this->owner, 'SearchForm', $fields, $actions);
$form->classesToSearch(FulltextSearchable::get_searchable_classes());
return $form;
}
Also in Page.php the fullresults funciton
public function fullresults($data, $form, $request) {
$results = $form->getResults();
$query = $form->getSearchQuery();
$title = _t('SearchForm.SearchResults', 'Search Results');
$data = array(
'Results' => $results,
'Query' => $query,
'Title' => $title
);
$keyword = $request->requestVar('Search');
$keyword = Convert::raw2sql($keyword);
$keywordHTML = htmlentities($keyword, ENT_NOQUOTES, 'UTF-8');
$blocks = new ArrayList();
$mode = ' IN BOOLEAN MODE';
$doClasses = array('ContentBlock', 'Media'); //select your dataobject or page classes here
$doMatch = "MATCH( Title, Content ) AGAINST ('$keyword'$mode)
+ MATCH( Title, Content ) AGAINST ('$keywordHTML'$mode)"; //customise your own sql statement here so the results have to have both terms queried.
foreach($doClasses as $c){
$query = DataList::create($c)->where($doMatch);
$query = $query->dataQuery()->query();
$query->addSelect(array('Relevance' => $doMatch));
$records = DB::query($query->sql());
$objects = array();
foreach( $records as $record ){
if ( in_array($record['ClassName'], $doClasses) )
$objects[] = new $record['ClassName']($record);
}
$blocks->merge($objects);
}
$blocks->sort(array(
'Relevance' => 'DESC',
'Title' => 'ASC'
));
$results = $results->merge($blocks);
return $this->owner->customise($data)->renderWith(array('Page_results', 'Page'));
}
This was from quite a while back, so I am a bit rusty on what exactly I did, but hopefully it helps point you in the right direction.