⏸ Разработка завершена — проект открыт для передачи
К сожалению, мне не хватает времени и энергии, чтобы активно поддерживать разработку этого плагина. Я пока заархивирую плагин как есть. Имейте в виду, что он не поддерживает Kirby 3.6+. Если кто-то захочет взять на себя и продолжить разработку этого плагина, я буду очень рад — свяжитесь с нами.
Загрузите, разархивируйте и скопируйте этот репозиторий в /site/plugins/search
.
Альтернативно, вы можете установить его с помощью композитора:
composer require distantnative/search-for-kirby
Решите, какого провайдера вы хотите использовать (доступные провайдеры см. ниже). И не забудьте создать индекс (также ниже) перед первым запуском, если вы используете поставщика Sqlite или Algolia.
Замените папку /site/plugins/search
новой версией. Обязательно прочитайте примечания к выпуску, чтобы узнать о серьезных изменениях.
Или, если вы установили плагин через композитор, запустите:
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, используя расширение SQLite FTS5 (должно быть доступно).
В конфигурации вы можете переопределить местоположение файла базы данных, указав абсолютный путь. По умолчанию файл базы данных будет создан как 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
]
]
Для создания исходного индекса плагин включает небольшой раздел Panel, из которого вы можете запустить создание индекса. Добавьте следующий раздел, например, в ваш проект site.yml
:
sections :
search :
type : search
По умолчанию плагин обязательно обновляет поисковый индекс при каждом событии (создание страницы, загрузка файла, обновление контента и т. д.) с помощью хуков. Таким образом, вам не нужно беспокоиться о создании нового индекса каждый раз, когда контент редактируется.
Чтобы отключить автоматическое обновление индекса с помощью перехватчиков, добавьте следующее в ваш site/config/config.php
:
' search ' => [
' hooks ' => false
]
Вы также можете создать индекс из командной строки с помощью сценария оболочки ./index
включенного в плагин. Это может быть альтернативой разделу Panel (особенно для очень большого индексного файла) или заменой перехватчиков в настройках, которые не используют Panel, которые затем срабатывают, например, при развертывании нового коммита или с помощью cronjob.
./site/plugins/search/bin/index
Если вы используете пользовательскую настройку папки, вам придется создать модифицированную версию этого сценария. Обращайтесь, если вам нужна помощь.
Этот плагин предоставляется «как есть» без каких-либо гарантий. Используйте его на свой страх и риск и всегда проверяйте его самостоятельно перед использованием в производственной среде. Если у вас возникли какие-либо проблемы, пожалуйста, создайте проблему.
При создании индекса вы можете столкнуться с ошибкой: не удалось найти драйвер. Скорее всего, это означает, что в вашей настройке сервера отсутствуют расширения Sqlite. Другим пользователям удалось активировать следующие расширения:
extension=sqlite3.so
extension=pdo_sqlite.so
Этот плагин полностью бесплатен и публикуется под лицензией MIT. Однако развитие требует времени и усилий. Если вы используете его в коммерческом проекте или просто хотите поддержать меня в сохранении этого плагина, сделайте пожертвование по вашему выбору.