statamic-rad-pack / meilisearch
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 'http://localhost:7700/keys'
将新驱动程序添加到 statamic/search.php
配置文件
'drivers' => [ // other drivers 'meilisearch' => [ 'credentials' => [ 'url' => env('MEILISEARCH_HOST', 'http://localhost: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 文档 中了解更多信息
作为一个条目、资产、用户或分类参考是类型、handle/容器和 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
为 1,000,000,如果您想修改此或其他分页设置,请指定分页键
// 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 中的上传大小限制。
将 client_max_body_size
添加到 /etc/nginx/nginx.conf
的 http 部分中
http {
client_max_body_size 100M;
// other settings
}
然后重新启动服务器,或运行 sudo service nginx restart
。