thehome / statamic-elasticsearch
Statamic 的 Elasticsearch 驱动程序
Requires
- php: ^8.0
- elasticsearch/elasticsearch: ^7.0
- laravel/framework: ^7.0 || ^8.0 || ^9.0 || ^10.0
- statamic/cms: ^3.4 || ^4.0
Requires (Dev)
- livewire/livewire: ^2.3
- phpstan/phpstan: ^1.4.2
- phpunit/phpunit: ^9 || ^10
README
Statamic 的 Elasticsearch 驱动程序
此插件向 Statamic 内置的搜索系统添加了 Elasticsearch 驱动程序(文档)。
设置索引
索引在 config/statamic/search.php 中配置,并使用标准的 Statamic 索引配置。还有一些额外的配置选项。
在 indexes 中为页面集合添加条目
'public' => [
'driver' => 'elasticsearch',
'searchables' => 'collection:pages',
'fields' => ['title', 'description', 'content'],
],
在 drivers 部分定义连接属性的示例条目
'elasticsearch' => [
'hosts' => [[
'scheme' => env('ELASTICSEARCH_SCHEME', 'http'),
'host' => env('ELASTICSEARCH_HOST', '127.0.0.1'),
'port' => env('ELASTICSEARCH_PORT', 9200),
]]
],
内容转换
Statamic 支持索引数据的转换器,但当前的实现与 Laravel 在运行 php artisan optimize 时序列化配置的方式不兼容。因此,此驱动程序有自己的系统,可以按如下方式配置
'public' => [
...
'transforms' => ['content' => 'bardToText'],
],
可用的转换器
- 'bardToText',将 ProseMirror 数据结构转换为纯文本,以便可以索引。
- 'handle',将具有句柄(例如,站点和集合)的字段转换为句柄文本。
分析器
Elasticsearch 支持不同的文本分析器进行索引。分析器确定分词、停用词和词干处理的方式。您可以设置默认分析器(用于所有字段)如下所示
'public' => [
'driver' => 'elasticsearch',
'searchables' => 'collection:pages',
'fields' => ['title', 'description', 'content'],
'analyzer' => 'danish'
],
如果未设置,则使用 standard 分析器。请参阅可用的语言分析器列表 此处。
字段加权
您可以定义加权值来加权单个字段。
'boost' => [
'title' => '2',
'keywords' => '2'
]
更新索引
每次在控制面板中保存项目时,它都会自动更新任何适当的索引,因为这扩展了 Statamic 搜索。如预期的那样,您可以通过命令行更新索引。
php please search:update public
验证索引数据
您可以使用以下方法验证您的 Elasticsearch 索引是否正确:
curl 127.0.0.1:9200/_cat/indices/public?v
或者直接查询
curl 127.0.0.1:9200/public/_search?q=test | jq
模板化
您可以使用默认的 Statamic 搜索标签,就像平常一样
{{ search:results index="public"}}
{{ if no_results }}
<h2>No results.</h2>
{{ else }}
<a href="{{ url }}">
<div>{{ title }}</div>
<p>{{ description | truncate:180 }}</p>
</a>
{{ /if }}
{{ /search:results }}
带有分页的 Livewire 组件
包含的分页 Livewire 组件支持使用 Elasticsearch 进行分页。这需要字段 status 已被索引,因此将其添加到配置中
'public' => [
....
'fields' => [ ... 'status'],
],
如果您有多个站点,并且想要搜索页面仅返回特定站点的结果,则必须将 site 字段添加到索引中。由于 site 字段是对象,因此必须使用 handle 转换器将其转换。
'public' => [
....
'fields' => [ ... 'status', 'site'],
'transforms' => ['site' => 'handle'],
],
然后您需要为您的 Antlers 模板启用 Livewire 支持。简单的方法是安装 Jonas 的插件
composer require jonassiewertsen/statamic-livewire
然后创建您的搜索 Antlers 模板,包括
{{ livewire:styles }}
{{ livewire:elasticsearch.search index="public" size="10"}}
{{ livewire:scripts }}
可以通过发布它来覆盖模板
php artisan vendor:publish --tag=elasticsearch-views
计划中的功能
- 根据文档站点区域设置设置分析器
- 可配置的多匹配查询类型