|
This behaviour allows Cake developers to make a model fulltext searchable, meaning that the user will be able to perform mysql fulltext search (which powers Wikimedia for example) on the models. For example, a fulltext search allows end users to use boolean expressions (eg. '-' to exclude a term) or natural language search which interprets the search string as a phrase in natural human language. SetupTo setup this behaviour you will need to create the following MySQL table CREATE TABLE `search_index` (
`id` int(11) NOT NULL auto_increment,
`association_key` varchar(36) NOT NULL,
`model` varchar(128) collate utf8_unicode_ci NOT NULL,
`data` longtext collate utf8_unicode_ci NOT NULL,
`created` datetime NOT NULL,
`modified` datetime NOT NULL,
PRIMARY KEY (`id`),
KEY `association_key` (`association_key`,`model`),
FULLTEXT KEY `data` (`data`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; UsageAt your disposal, there are several ways to use it: SearchIndex ModelYou can use the SearchIndex model to do the searches using the regular cake php Model->find() . By default this will search all the subjects (if you have more than one searchable model). To search only ceratin models you can use SearchIndex->searchModels() An exemple usage, using cakephp pagination: <?php
$this->SearchIndex->searchModels(array('Post','Comment'));
$this->paginate = array(
'limit' => 10,
'conditions' => "MATCH(SearchIndex.data) AGAINST('$q' IN BOOLEAN MODE)"
);
$this->set('results', $this->paginate('SearchIndex'));
?>The searchable modelTo do a search on the actual searchable model, you can use Model->search(query) Indexing dataTo provide a custom indexing function, you can define your own indexData() function. By default all varchar, char and text fields are indexed. <?php
class Comment extends AppModel {
var $name = 'Comment';
var $actsAs = array('Searchable');
function indexData() {
$index = $this->data['Comment']['text'];
return $index;
}
}
?>
|