elvenstar/statamic-typesense

此包已被弃用,不再维护。未建议替代包。
最新版本(0.1.1)的此包没有可用的许可证信息。

Statamic v3 搜索引擎的 Typesense 驱动程序

0.1.1 2021-06-15 14:00 UTC

This package is auto-updated.

Last update: 2023-01-29 03:42:50 UTC


README

Typesense 是一个相对较新的搜索引擎,驱动代码可能会随着新功能的发展而更改。这仍然是一个非常早期的版本或预览,直到下一个 Typesense 版本发布,一些问题将会得到修复。

免责声明:这是一个开发版本。我不会推荐在生产环境中使用它,直到进行了更多测试并且一些核心问题得到解决。

安装

composer require elvenstar/statamic-typesense

Typesense 库还需要一个 Guzzle 适配器,根据 Laravel 使用的 Guzzle 版本安装适当的适配器。

composer require php-http/guzzle7-adapter

发布我们将用于配置的 typesense.php 配置文件

php artisan vendor:publish --tag="statamic-typesense"

将以下变量添加到您的 env 文件中

TYPESENSE_API_KEY=
TYPESENSE_URL=localhost     // For Typesense Cloud use xxx.a1.typesense.net
TYPESENSE_PORT=8108         // For Typesense Cloud use 443
TYPESENSE_PROTOCOL=http     // For Typesense Cloud use https

将新驱动程序添加到 statamic.search 配置文件中

    'drivers' => [
        
        // other drivers
        
        'typesense' => [
            'credentials' => [
                'api_key' => env('TYPESENSE_API_KEY', ''),
                'nodes' => [
                    'host' => env('TYPESENSE_URL', ''),
                ],
                'port' => env('TYPESENSE_PORT', '443'),
                'protocol' => env('TYPESENSE_PROTOCOL', 'https'),
                'nearest_node' => env('TYPESENSE_NEAREST_NODE', null),
                'connection_timeout' => env('TYPESENSE_TIMEOUT', 2),
            ],
        ],
    ],

高级字段

当你创建一个索引时,我们默认会使用 auto 模式。它使用一个名为 .* 的通配符字段,让 Typesense 自动检测字段的类型。我们还必须指定每个模式中的 ID 是字符串,这样我们就可以使用我们的 Statamic UUIDs。

{
  "name": "articles",  
  "fields": [
    {"name": ".*", "type": "auto" },
    {"name":  "id", "type":  "string" }
  ]
}

您可以在 config/typesense.php 文件中找到这些默认设置,并且您可以添加任何其他默认字段(只要这个字段存在于每个集合中!)

如果您想要添加更多高级选项,例如分面或排序顺序,您也可以在 config/typesense.php 文件中定义这些选项。您可以在 Typesense 文档中了解更多信息。

    'schema' => [
        'articles' => [
            'fields' => [
                ['name' => 'synopsis', 'optional' => true],
                ['name' => 'category', 'facet' => true],
                ['name' => 'rating', 'type' => 'int32'],
                ['name' => 'published', 'type' => 'bool'],
                
            ],
            'default_sorting_field' => 'date',
        ],
    ],

这些选项将在 Typesense 上创建索引时与默认模式合并

{
  "name": "articles",
  "fields": [
    {"name": ".*", "type": "auto" },
    {"name":  "id", "type":  "string" },
    {"name": "synopsis", "optional": "true"},
    {"name": "category", "facet": "true"},
    {"name": "rating", "type": "int32"},
    {"name": "published", "type":  "bool"},
  ],
  "default_sorting_field": "rating"
}

只有您在 config/static/search.php 文件中的 indexes 中定义的字段将被保存到 Typesense,所以您不需要在模式定义中包含 index: false。如果您不想让字段包含在搜索索引中,请不要将其包含在 indexes 数组中。

问题

  1. Typesense 要求在插入数据之前定义模式,如果您更新了 Statamic 中的蓝图和字段 - 您需要删除 Typesense 上的集合并使用新的模式重新创建它。
  2. Typesense 返回所有字段数据,因此如果您的 content 字段很大,它可以使搜索结果的有效负载非常大(这将在下一个版本中修复)。
  3. 尚未测试具有多个节点的 Typesense。

多搜索问题

在Typesense中,多搜索的工作方式略有不同,它将返回每个索引的结果的嵌套列表... 因此,您会丢失很多相关性,因为您可能会只从第一个索引得到一个较差的结果列表,因为它在列表顶部,而较好的结果没有显示,因为索引在列表的末尾。

为了避免这个问题,我建议保持一个默认搜索索引,它使用本地驱动程序工作,并使用Typesense连接索引到特定的集合。

    'default' => [
        'driver' => 'local',
        'searchables' => 'all',
        'fields' => ['title'],
    ],

然后通过使用连接索引,您在浏览特定集合时可以使用Typesense,或者在前端您可以使用JavaScript客户端查询Typesense中的结果。

前端示例

  1. 单索引搜索
  2. 多索引搜索