elvenstar / statamic-meilisearch
Requires
- php: ^8.1
- guzzlehttp/guzzle: ^7.3
- http-interop/http-factory-guzzle: ^1.0
- illuminate/support: ^10.0 || ^11.0
- meilisearch/meilisearch-php: ^1.0
- statamic/cms: ^5.0
Requires (Dev)
- orchestra/testbench: ^7.0 || ^8.0
- phpunit/phpunit: ^9.3
README
此插件为 Statamic 网站提供 Meilisearch 搜索驱动程序。
要求
- PHP 8.1+
- Laravel 10+
- Statamic 5
- Meilisearch 1.0+
安装
composer require statamic-rad-pack/meilisearch
将以下变量添加到您的 env 文件中
MEILISEARCH_HOST=http://127.0.0.1:7700 MEILISEARCH_KEY=
主密钥类似于密码,如果您自动部署 Meilisearch 服务器,他们很可能提供密钥。在本地主机上,您可以创建自己的主密钥,然后使用该密钥生成私钥和公钥。您将需要这些密钥用于前端客户端
# Export the key $ export MEILISEARCH_KEY=AWESOMESAUCE # Start the meilisearch server again $ meilisearch # Generate the keys curl \ -H 'Authorization: Bearer AWESOMESAUCE' \ -X GET 'https://:7700/keys'
将新驱动程序添加到 statamic/search.php
配置文件中
'drivers' => [ // other drivers 'meilisearch' => [ 'credentials' => [ 'url' => env('MEILISEARCH_HOST', 'https://:7700'), 'secret' => env('MEILISEARCH_KEY', ''), // 'search_api_key' => env('MEILISEARCH_SEARCH_KEY') ], ], ],
您可以选择添加 search_api_key
,这使在前端 JavaScript 代码中调用密钥变得更容易
<script type="text/javascript"> window.meilisearch = new meilisearch({ host: '{{ config:statamic:search:drivers:meilisearch:credentials:url }}', apiKey: '{{ config:statamic:search:drivers:meilisearch:credentials:search_api_key }}', }); </script>
您可以选择使用以下方式发布此包的配置文件
php artisan vendor:publish --tag=statamic-meilisearch-config
关于 Meilisearch 中的文档 ID 的几个词
当您索引 Statamic 条目时,驱动程序将始终转换 ID。这是必需的,因为 meilisearch 只允许 id
为包含字母数字字符(a-Z,0-9)、连字符(-)和下划线(_)的字符串。您可以在 meilisearch 文档 中了解更多信息
作为条目、资产、用户或分类的引用是类型、处理/容器和 ID 的组合,用 ::
分隔(例如,assets::heros/human01.jpg,categories::cats),这不能由 meilisearch 索引。
作为解决方案,我们会在索引您的条目时自动处理引用 🎉。
Statamic 内部将使用 \Statamic\Facades\Data::find($reference)
来解析相应的 Statamic 条目、资产、用户或分类。
搜索设置
您可以在 statamic/search.php
配置文件中包含您想要为每个索引定义的任何附加设置。当创建索引时,将更新这些设置。
// articles 'articles' => [ 'driver' => 'meilisearch', 'searchables' => ['collection:articles'], 'fields' => ['id', 'title', 'url', 'type', 'content', 'locale'], 'settings' => [ 'filterableAttributes' => ['type', 'locale'], ], ],
您可以在每个索引中包含不同类型的设置
'articles' => [ 'driver' => 'meilisearch', 'searchables' => ['collection:articles'], 'settings' => [ 'filterableAttributes' => ['type', 'country', 'locale'], 'distinctAttribute' => 'thread', 'stopWords' => ['the', 'of', 'to'], 'sortableAttributes' => ['timestamp'], 'rankingRules' => [ 'sort', 'words', 'typo', 'proximity', 'attribute', 'exactness', ], ], ],
搜索分页
默认情况下,我们将 maxTotalHits
限制为 1000000,如果您想修改此或其他分页设置,请指定分页密钥
// articles 'articles' => [ 'driver' => 'meilisearch', 'searchables' => ['collection:articles'], 'fields' => ['id', 'title', 'url', 'type', 'content', 'locale'], 'pagination' => [ 'maxTotalHits' => 100, ], ],
扩展
您可以通过创建一个扩展 StatamicRadPack\meilisearch\meilisearch\Index
的类来扩展驱动程序的功能(例如,为了自定义对 meilisearch 的调用),并指示 Laravel 的 服务容器 使用它
class MyIndex extends Index { // Your custom logic here }
// app/Providers/AppServiceProvider.php $this->app->bind(\StatamicRadPack\meilisearch\meilisearch\Index::class, MyIndex::class);
常见错误
413 请求实体过大
例如,您可能在 Laravel Forge 上遇到此错误,当您第一次尝试同步搜索文档时。为了克服这个问题,您需要更新 nginx 的上传大小限制。
在 /etc/nginx/nginx.conf
的 http 部分中添加 client_max_body_size
http {
client_max_body_size 100M;
// other settings
}
然后重新启动服务器,或运行 sudo service nginx restart
。