⏸ 开发结束-开放移交项目
不幸的是,我缺乏时间和精力来积极维护这个插件的开发。我暂时将插件按原样存档。请注意,它不支持 Kirby 3.6+。如果有人想接手并继续开发这个插件,我会非常高兴 - 请与我们联系。
下载、解压此存储库并将其复制到/site/plugins/search
。
或者,您可以使用 Composer 安装它:
composer require distantnative/search-for-kirby
决定您要使用哪个提供商(请参阅下文了解可用的提供商)。如果使用 Sqlite 或 Algolia 提供程序,请不要忘记在第一次运行之前创建索引(也在下面)。
将/site/plugins/search
文件夹替换为新版本。请务必阅读发行说明以了解重大更改。
或者,如果您通过 Composer 安装了插件,请运行:
composer update distantnative/search-for-kirby
该插件提供跨不同条目组合的全局搜索: pages
、 files
和users
。
您可以定义应包含在索引中的条目(使用 Kirby 查询语言),甚至可以在site/config/config.php
中完全禁用某个类型:
' search ' => [
' entries ' => [
' pages ' => ' site.find("projects").index ' ,
' files ' => false ,
// users will remain the default
]
]
默认情况下,索引中包含以下集合:
pages
site.index
files
site.index.files
users
kirby.users
您可以在config.php
文件中定义要包含在搜索中的页面、文件和用户的内容字段:
' search ' => [
' fields ' => [
' pages ' => [
' title '
],
' files ' => [
' filename '
],
' users ' => [
' email ' ,
' name '
]
]
]
有多种选项可用于定义这些数组中的字段:
// Simply add the field
' title ' ,
// Add the field, but run it through a field method first
' text ' => ' kirbytext ' ,
// Pass parameters to the field method
' text ' => [ ' short ' , 50 ],
// Use a callback function
' text ' => function ( $ model ) {
return strip_tags ( $ model -> text ()-> kt ());
}
// Turn string field value into number (e.g. for Algolia filters)
' myNumberField ' => function ( $ model ) {
return $ model -> myNumberField ()-> toFloat ();
}
' myVirtualNumberField ' => function ( $ model ) {
return $ model -> myNumberField ()-> toInt () + 5 ;
}
' myDate ' => function ( $ model ) {
return $ model -> anyDateField ()-> toTimestamp ();
}
您还可以在config.php
文件中定义要包含在搜索中的模板(或用户情况下的角色):
' search ' => [
' templates ' => [
' pages ' => function ( $ model ) {
return $ model -> id () !== ' home ' && $ model -> id () !== ' error ' ;
},
' files ' => null ,
' users ' => null
]
]
``
If the value is null or an empty array, all templates are allowed. If it is false, all templates are excluded. There are several other options:
```php
// simple whitelist array
[ ' project ' , ' note ' , ' album ' ]
// associative array
[
' project ' => true ,
' note ' => false
]
// callback function
function ( $ model ) {
return $ model -> intendedTemplate () !== ' secret ' ;
}
该插件用其全局搜索模式替换了默认的面板搜索(通过放大镜图标在右上角访问):
该插件还替换了 PHP API 方法。由于该插件提供全局搜索,因此最好与 $site 对象一起使用作为开始:
$ site -> search ( ' query ' , $ options = []);
尽管如此,搜索也可以仅限于更具体的集合(有一些性能损失):
$ page -> children ()-> listed ()-> filterBy ( ' template ' , ' project ' )-> search ( ' query ' , $ options = []);
该插件还添加了一个全局search()
辅助函数:
search (string $ query , $ options = [], $ collection = null )
对于选项数组,您可以传递一个限制选项来指定要返回的结果数。此外,您可以指定运算符选项( AND
或OR
)来指定组合多个搜索词的规则:
collection ( ' notes ' )-> search ( $ query , [
' operator ' => ' AND ' ,
' limit ' => 100
]);
您收到的结果是一个KirbyCmsCollection
对象。
该插件捆绑了三个不同的搜索提供程序。根据您的站点、需求和设置,其中之一可能比其他更合适。
sqlite
(默认)使用 SQLite FTS5 扩展(必须可用)创建索引 SQLite 数据库。
在配置中,您可以重新定义数据库文件的位置,提供绝对路径。默认情况下,数据库文件将创建为site/logs/search/index.sqlite
。
// site/config/config.php
' search ' => [
' provider ' => ' sqlite ' ,
' sqlite ' => [
' file ' => dirname ( __DIR__ , 2 ) . ' /storage/search/index.sqlite '
]
]
模糊选项允许搜索不仅从单词的开头匹配内容,还可以匹配单词内部的内容。根据内容的不同,它可以极大地增加索引数据库的大小(以指数方式思考),特别是在包含长文本字段时。您还可以定义字段列表以进行模糊处理。
// site/config/config.php
' search ' => [
' provider ' => ' sqlite ' ,
' sqlite ' => [
// Enabled for all fields
' fuzzy ' => true ,
// Disabled completely
' fuzzy ' => false ,
// Only for selected fields
' fuzzy ' => [
' pages ' => [ ' title ' ],
' files ' => [ ' caption ' , ' credits ' ]
],
]
]
您还可以定义一些自定义权重来将特定字段排名高于其他字段:
// site/config/config.php
' search ' => [
' provider ' => ' sqlite ' ,
' sqlite ' => [
' weights ' => [
' title ' => 10 ,
' caption ' => 5
],
]
]
algolia
通过此提供商将 Algolia 搜索无缝添加到 Kirby:
// site/config/config.php
' search ' => [
' provider ' => ' algolia ' ,
' algolia ' => [
' app ' => . . . , // Algolia App ID
' key ' => . . . , // Algolia private admin key (not just read-only!)
' index ' => ' kirby ' // name of the index to use/create
' options ' => [] // options to pass to Algolia at search
]
]
为了创建初始索引,该插件捆绑了一个小面板部分,您可以从中触发构建索引。将以下部分添加到例如您的site.yml
蓝图中:
sections :
search :
type : search
默认情况下,该插件确保通过挂钩在每个事件(创建页面、上传文件、更新内容等)时更新搜索索引。因此,您无需担心每次编辑内容时都要创建新索引。
要通过挂钩停用自动索引更新,请将以下内容添加到您的site/config/config.php
:
' search ' => [
' hooks ' => false
]
您还可以使用插件中包含的./index
shell 脚本从命令行构建索引。这可以是面板部分的替代方案(特别是对于非常大的索引文件),或者替换不使用面板的设置中的挂钩 - 然后在部署新提交或通过 cronjob 时触发。
./site/plugins/search/bin/index
如果您使用自定义文件夹设置,则必须创建该脚本的修改版本。如果您需要帮助,请联系我们。
该插件“按原样”提供,不提供任何保证。使用它的风险由您自行承担,并且在生产环境中使用它之前请务必自行测试。如果您遇到任何问题,请创建问题。
生成索引时,您可能会遇到找不到驱动程序的错误。这很可能意味着您的服务器设置缺少 Sqlite 扩展。其他用户已成功激活以下扩展:
extension=sqlite3.so
extension=pdo_sqlite.so
该插件完全免费,并在 MIT 许可下发布。然而,发展需要时间和努力。如果您在商业项目中使用它,或者只是想支持我让这个插件保持活力,请根据您的选择进行捐赠。