elvenstar / statamic-typesense
Statamic v3 搜索引擎的 Typesense 驱动程序
Requires
- typesense/typesense-php: ^4.6
Requires (Dev)
- guzzlehttp/guzzle: ^7.0.1
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
数组中。
问题
- Typesense 要求在插入数据之前定义模式,如果您更新了 Statamic 中的蓝图和字段 - 您需要删除 Typesense 上的集合并使用新的模式重新创建它。
- Typesense 返回所有字段数据,因此如果您的
content
字段很大,它可以使搜索结果的有效负载非常大(这将在下一个版本中修复)。 - 尚未测试具有多个节点的 Typesense。
多搜索问题
在Typesense中,多搜索的工作方式略有不同,它将返回每个索引的结果的嵌套列表... 因此,您会丢失很多相关性,因为您可能会只从第一个索引得到一个较差的结果列表,因为它在列表顶部,而较好的结果没有显示,因为索引在列表的末尾。
为了避免这个问题,我建议保持一个默认
搜索索引,它使用本地
驱动程序工作,并使用Typesense连接索引到特定的集合。
'default' => [ 'driver' => 'local', 'searchables' => 'all', 'fields' => ['title'], ],
然后通过使用连接索引
,您在浏览特定集合时可以使用Typesense,或者在前端您可以使用JavaScript客户端查询Typesense中的结果。