firebrandhq / searchable-dataobjects
基于 zirak/searchable-dataobjects 开发,包括在搜索结果中包含数据对象的父页面。
Requires
- silverstripe/cms: 3.*
- silverstripe/framework: 3.*
- zirak/htmlpurifier: 1.0.*
README
Firebrand Searchable DataObjects 是 Zirak 的 Searchable DataObjects 的分支。
Firebrand 的版本将返回符合搜索条件或包含相关数据对象的页面。Zirak 的版本返回单个数据对象。
简介
复杂的 SilverStripe 页面有时需要使用数据对象分成多个部分。默认情况下,SilverStripe 只会索引页面主 WYSIWYG 区域的内容。这意味着相关数据对象不会被索引,其父页面也不会出现在搜索结果中。
需求
- SilverStripe 3.1
- zirak/htmlpurifier
安装
通过 composer 安装模块
composer require firebrandhq/searchable-dataobjects
让数据对象(或页面)实现 Searchable
或 SearchableLinkable
接口。您需要定义 getSearchFilter()
、getTitleFields()
、getContentFields()
、getOwner()
、IncludeInSearch()
)。实现 SearchableLinkable
接口的类,还需要定义一个 Link()
函数。
可通过 URL 访问的数据对象应实现 SearchableLinkable
,而属于父对象且不能直接通过 URL 访问的数据对象应实现 Searchable
。
class DoNews extends DataObject implements SearchableLinkable { private static $db = array( 'Title' => 'Varchar', 'Subtitle' => 'Varchar', 'News' => 'HTMLText', 'Date' => 'Date', ); private static $has_one = array( 'Page' => 'PghNews' ); private static $has_many = array( 'Asides' => 'Aside' ); /** * Filter array * eg. array('Disabled' => 0); * @return array */ public static function getSearchFilter() { return array(); } /** * Fields that compose the Title * eg. array('Title', 'Subtitle'); * @return array */ public function getTitleFields() { return array('Title'); } /** * Fields that compose the Content * eg. array('Teaser', 'Content'); * @return array */ public function getContentFields() { return array('Subtitle', 'Content'); } /** * Parent objects that should be displayed in search results. * @return SiteTree or SearchableLinkable */ public function getOwner() { return $this; } /** * Whatever this specific Searchable should be included in search results. * This allows you to exclude some DataObjects from search results. * It plays more or less the same role that ShowInSearch plays for SiteTree. * @return boolean */ public function IncludeInSearch() { return true; } /** * Link to access this DO * @return string */ public function Link() { $this->Page->Link('news/' . $this->ID); } }
class Aside extends DataObject implements Searchable { private static $db = array( 'Header' => 'Varchar', 'Content' => 'HTMLText', ); private static $has_one = array( 'DoNews' => 'DoNews' ); /** * Filter array * eg. array('Disabled' => 0); * @return array */ public static function getSearchFilter() { return array(); } /** * Fields that compose the Title * eg. array('Title', 'Subtitle'); * @return array */ public function getTitleFields() { return array('Header'); } /** * Fields that compose the Content * eg. array('Teaser', 'Content'); * @return array */ public function getContentFields() { return array('Content'); } /** * Parent objects that should be displayed in search results. * @return SiteTree or SearchableLinkable */ public function getOwner() { return $this->DoNews; } /** * Whatever this specific Searchable should be included in search results. * This allows you to exclude some DataObjects from search results. * It plays more or less the same role that ShowInSearch plays for SiteTree. * @return boolean */ public function IncludeInSearch() { return true; } }
通过以下 yaml 扩展 Page 和所需的数据对象
Page: extensions: - SearchableDataObject DoNews: extensions: - SearchableDataObject
运行 dev/build
,然后通过运行 PopulateSearch 任务填充搜索表
sake dev/build "flush=all"
sake dev/tasks/PopulateSearch
当您保存页面或数据对象时,它们将自动更新搜索表中的条目。
注意
Searchable DataObjects 模块使用 Mysql NATURAL LANGUAGE MODE 搜索方法,因此在进行测试时,请确保不是所有数据对象的内容都相同,因为存在于 50% 或更多行中的单词被视为常用词且不匹配。
来自 MySQL 手册条目 [https://dev.mysqlserver.cn/doc/refman/5.1/en/fulltext-search.html]
自然语言搜索将搜索字符串解释为自然人类语言中的短语(自由文本中的短语)。没有特殊操作符。应用停用词列表。此外,存在于 50% 或更多行中的单词被视为常用词且不匹配。如果给出 IN NATURAL LANGUAGE MODE 修饰符或未给出修饰符,则全文搜索是自然语言搜索。