vulcandigital / silverstripe-search
SilverStripe 的全文搜索替换概念,支持使用索引罐
Requires
- silverstripe/framework: ^4.0
Requires (Dev)
- phpunit/phpunit: ^5.7
- squizlabs/php_codesniffer: 3.*
This package is auto-updated.
Last update: 2024-09-18 20:10:16 UTC
README
该模块是 SilverStripe 的单行搜索替换概念,支持使用索引罐
要求
- silverstripe/framework: ^4.0
安装
composer require vulcandigital/silverstripe-search
开始使用
“什么可以搜索” 是最大的问题,答案是
任何启用了
SearchIndexExtension
的DataObject
或其子类
1. 应用扩展
要将扩展应用到 DataObject,添加以下配置属性
class Recipe extends DataObject { // Apply the extension private static $extensions = [ \Vulcan\Search\Extensions\SearchIndexExtension::class ]; // the search tank that records from the class are indexed under // this is optional and will default to "Main" if not provided private static $search_tank = 'Recipes' private static $db = [ 'Title' => 'Varchar(255)', 'Content' => 'HTMLText', 'SomeRandomFieldWithContent' => 'Text', 'UselessField' => 'Boolean' ]; // Showing the use of Dot Notation in searchableColumns() private static $has_one = [ 'User' => Member::class ]; // This will conslidate the content from all columns into a single searchable line of text public function searchableColumns() { return [ 'Title', 'Content', 'SomeRandomFieldWithContent', 'User.FirstName' ] } }
注意:当前不支持在 has_many 或 many_many 关系中使用点表示法
之后,请确保您执行了 dev/build 和 ?flush。
2. 构建索引
如果您已将扩展应用到具有现有记录的 DataObject 或页面,请从 dev/tasks 运行 构建搜索索引清单 任务以索引现有记录
当向 DataObject
添加新记录时,它们也将被索引。当记录被删除时,索引条目也将被删除
如果 DataObject
是 Page
,则只有在页面发布时才会索引新记录,当页面取消发布或删除时不会索引
3. 创建搜索页面
打开 CMS,并创建一个新的 SearchPage。这可以是一个根项目或任何其他页面的子项
- 切换到 "搜索" 选项卡
- 选择页面的适当索引罐(默认为 "Main")
- 保存并发布页面
- 开始在索引罐中搜索结果
如果您想有多个搜索页面,其中搜索的记录不同,则需要为该 DataObject 指定唯一的索引罐名称(默认情况下,将使用 Main
罐)
private static $search_tank = 'MyCustomTank';
这将确保该 DataObject 中所有记录都存储在自定义罐标识符下,该罐可以分配给特定的 SearchPage
。
此模块包含默认的 SearchPage 页面类型。提供的模板仅作为示例,您应该创建自己的覆盖模板。
重命名筛选器标题
如果您想更改搜索筛选器显示的名称,您需要在您的 DataObject/Page 中添加以下内容
private static $singular_name = 'Instruction';
private static $plural_name = 'Instructions';
结果项目渲染
您可能希望根据它们代表的类(如上面的预览图像所示)以不同的方式渲染结果。
为了实现这一点,对于上面的 Recipe
类,您必须在您的主题目录中创建以下文件夹结构
- themes/
- mytheme/
- templates/
- Vulcan/
- Search/
- Render/
然后,在文件夹内,您可以创建一个新的模板,命名为 RenderRecipe.ss
。该模板可以完全访问单个结果中的所有内容(在顶层)
<div class='search-result recipe'> <h1><% if $Link %><a href="$Link">$Title</a><% else %>$Title<% end_if %></h1> <div class='content'>$Content</div> <div class='meta'>Uploaded by: $User.FirstName</div> </div>
常见问题解答
我看不到我的类中的现有记录在搜索中
解决方案 1. ?flush=1
解决方案 2. 如果您已将扩展应用到具有现有记录的类,您应从 dev/tasks 运行 构建搜索索引清单 任务
我看到了一些不再存在的记录的结果
这种情况不应该发生,但如果发生了,您可以运行来自 dev/tasks 的 搜索索引维护任务
许可证
BSD 3-Clause © Vulcan Digital Ltd