hendrydevries/laravel-scout-opensearch

Laravel Scout 的 OpenSearch 引擎

v1.1 2024-01-26 09:10 UTC

This package is auto-updated.

Last update: 2024-09-26 10:27:45 UTC


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);