cloudmediasolutions/laravel-scout-opensearch

为 Laravel Scout 提供的 OpenSearch 引擎

v0.1.3 2023-09-15 11:50 UTC

This package is auto-updated.

Last update: 2024-09-15 14:37:46 UTC


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