statamic-rad-pack/meilisearch

Statamic 的 Meilisearch 搜索驱动程序

v3.3.0 2024-05-14 17:20 UTC

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