cloudmediasolutions / 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 "cloudmediasolutions/laravel-scout-opensearch"
添加/设置环境变量(在 .env 中)
SCOUT_DRIVER=CloudMediaSolutions\LaravelScoutOpenSearch\Engines\OpenSearchEngine
添加您的 OpenSearch 主机(您可以使用逗号分隔多个主机)
OPENSEARCH_HOSTS=https://:9200
如果您在您的 OpenSearch 集群上设置了 Web 认证,您可以扩展 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 文档中的说明进行数据搜索 (他们的文档)。因为此搜索查询在搜索查询中使用 query_string,所以可以执行复杂的查询,例如
- 星际迷航
- 风(升起 OR 升起)
- 状态: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);