firebrandhq/searchable-dataobjects

基于 zirak/searchable-dataobjects 开发,包括在搜索结果中包含数据对象的父页面。

安装数: 3,024

依赖: 0

建议者: 0

安全性: 0

星标: 8

关注者: 2

分支: 24

开放问题: 5

类型:silverstripe-module

v1.2.3 2018-04-03 22:55 UTC

This package is auto-updated.

Last update: 2024-09-14 10:18:45 UTC


README

Firebrand Searchable DataObjects 是 Zirak 的 Searchable DataObjects 的分支。

Firebrand 的版本将返回符合搜索条件或包含相关数据对象的页面。Zirak 的版本返回单个数据对象。

简介

复杂的 SilverStripe 页面有时需要使用数据对象分成多个部分。默认情况下,SilverStripe 只会索引页面主 WYSIWYG 区域的内容。这意味着相关数据对象不会被索引,其父页面也不会出现在搜索结果中。

需求

  • SilverStripe 3.1
  • zirak/htmlpurifier

安装

通过 composer 安装模块

composer require firebrandhq/searchable-dataobjects

让数据对象(或页面)实现 SearchableSearchableLinkable 接口。您需要定义 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 修饰符或未给出修饰符,则全文搜索是自然语言搜索。