hendrydevries / laravel-scout-opensearch
Laravel Scout 的 OpenSearch 引擎
Requires
- php: ^8.0
- illuminate/support: ^9.0|^10.0
- laravel/scout: ^8.0|^9.0|^10.0
- opensearch-project/opensearch-php: ^2.0
- shyim/opensearch-php-dsl: ^1.0
Requires (Dev)
- mockery/mockery: ^1.5
- orchestra/testbench: ^7.0|^8.0
- phpunit/phpunit: ^9.5
README
此包为 Laravel Scout 提供了一个 OpenSearch 引擎。它是基于最新版本的 Laravel Scout 构建,允许您将 OpenSearch 作为 Scout 的驱动程序使用。
特性
- Laravel Scout 9 支持
- 每个索引可完全配置设置,支持默认设置
- 可选映射配置
- 游标分页
要求
- PHP >= 8.0
- Laravel >= 8
安装
您可以通过 Composer 包含此包
composer require "hendrydevries/laravel-scout-opensearch"
添加/设置环境变量(在 .env 中)
SCOUT_DRIVER=Hendrydevries\LaravelScoutOpenSearch\Engines\OpenSearchEngine
添加您的 OpenSearch 主机(您可以使用逗号分隔多个主机)
OPENSEARCH_HOSTS=https://:9200
如果您在 OpenSearch 集群上有任何网络认证,您可以扩展 opensearch.client
配置。
基本认证
'client' => [ 'hosts' => explode(',', env('OPENSEARCH_HOSTS')), 'basicAuthentication' => [ env('OPENSEARCH_USERNAME'), env('OPENSEARCH_PASSWORD'), ], ],
用法
在使用自定义索引设置和映射之前,您必须将配置发布到您的应用程序
php artisan vendor:publish --tag "opensearch-config"
更改索引后,您必须创建索引
如果索引已存在,请先删除它
php artisan scout:delete-index yourSearchableAsValue
然后您可以创建索引
php artisan scout:index yourSearchableAsValue
此时索引完全为空。您可以按照 Laravel Scout 文档中描述的方式导入现有数据
php artisan scout:import "App\Models\Post"
索引设置
一些 索引设置 是静态的,只能在索引创建时设置。因此,在您开始使用索引之前,配置它很重要 - 当您有特定的愿望时。
您可以在 opensearch.indices.default.settings
中找到一个示例。默认情况下,键作为默认/后备配置。当您想要特定索引的设置时,您使用 opensearch.indices.yourSearchableAsValue.settings
。
映射
有时您需要在 OpenSearch 中使用特定的字段映射。例如,当您使用 UUID 时,字段类型自动设置为 text
,并且将它们作为 keyword
在过滤器中很有用。
您可以在 opensearch.indices.table.mappings
中找到一个示例。在这种情况下,表是您的索引名称。
搜索
您可以按照 Laravel 文档中的说明进行搜索 他们的文档。因为此搜索查询在搜索查询中使用了 OpenSearch 的 query_string,所以可以执行复杂的查询,例如
- 星际迷航
- 风 AND (升起 OR 升起)
- status:active 铅笔
游标分页
游标分页使用 search_after 参数分页。
Song::search("crass") ->orderBy("_score", "desc") ->orderBy("id") ->cursorPaginate(10);
如果没有提供排序,则将使用 _id 字段作为默认值,因此在使用游标分页时无法应用相关性排序。
带排序模式的游标分页
Song::search() ->orderByRaw( new FieldSort('stars', 'desc', ['mode' => 'avg']) ) ->orderBy('id') ->cursorPaginate(10);
嵌套对象排序的游标分页
Article::search() ->orderByRaw( (new FieldSort('comments.created_at', 'desc', ['mode' => 'max'])) ->setNestedFilter(new NestedSort('comments')) ) ->orderBy('id') ->cursorPaginate(10);
基于 _geo_distance 的游标分页
Store::search() ->orderByRaw(new FieldSort( '_geo_distance', 'desc', [ 'point' => [10, 10], 'unit' => 'km', 'distance_type' => 'arc', 'mode' => 'min', 'ignore_unmapped' => true ] )) ->orderBy('id') ->cursorPaginate(10);