chimilevschi/laravel-opensearch-engine

OpenSearch 引擎的 Laravel Scout

v1.0.1 2023-10-22 20:09 UTC

This package is auto-updated.

Last update: 2024-09-22 21:59:45 UTC


README

安装

composer require romangrinev/laravel-opensearch-engine

更新 App\Providers\AppServiceProvider

<?php

namespace App\Providers;

// ...

use Grinev\LaravelOpenSearchEngine\OpenSearchEngine;
use Laravel\Scout\EngineManager;

class AppServiceProvider extends ServiceProvider
{
    public function boot()
    {
        // ...

        resolve(EngineManager::class)->extend(config('scout.driver'), function () {
            return new OpenSearchEngine;
        });

    }
}

更新 config\scout.php

<?php

return [

    //

    'driver' => env('SCOUT_DRIVER', 'opensearch'),

    'opensearch' => [
        'host' => env('OPENSEACH_HOST', 'https://:9200'),
        'user' => env('OPENSEACH_USER', 'admin'),
        'pass' => env('OPENSEACH_PASS', 'admin'),
    ],

    //
];

用法

通过关键词短语搜索

$posts = Post::search('Key phrase')->get();

排序搜索结果

$posts = Post::search()->orderBy('posted_at', 'desc')->get();

通过术语搜索

$posts = Post::search()->where('category_id', '48')->get();

通过范围搜索

$posts = Post::search()->where('range', [
    'price' => [
        'gte' => 100,
        'lte' => 200
    ]
])->get();

了解有关 OpenSearch 范围查询 的更多信息

通过地理位置搜索

有关 OpenSearch 地理边界框查询 的更多信息

$posts = Post::search()->->where('geo_bounding_box', [
    "location" => [
        "top_left" => [
            "lat" => 48.0,
            "lon" => -123.0
        ],
        "bottom_right" => [
            "lat" => 46.0,
            "lon" => -121.0
        ]
    ]
])->get();

要执行此类型搜索,请确保在您的 config/scout.php 配置文件中将 location 字段的映射设置为 geo_point

config/scout.php

<?php
return [
    //
    'opensearch' => [
        //
        'mappings' => [
            'posts_index' =>[
                "mappings" => [
                    "properties" => [
                        "location" => [
                            "type" => "geo_point"
                        ]
                    ]
                ]
            ]
        ]
    ],
];

app/models/Post.php

    public function searchableAs(){
        return 'posts_index';
    }
	public function toSearchableArray(){
		$data = [
            //
			'location' => "{$this->lat},{$this->lng}",
		];

		return $data;
	}

在更改 scout.php 进行映射并更新 toSearchableArray() 之后,请确保像这样更新您的 OpenSearch 索引

php artisan scout:flush App\\Models\\Post
php artisan scout:index App\\Models\\Post
php artisan scout:import App\\Models\\Post

分组/聚合结果

此示例展示了如何对 OpenSearch 结果进行分组/聚合。

$raw = Post::search('Key phrase')
    ->whereRaw([
        'aggs' => [
            'categories' => [
                'terms' => [
                    'field' => 'category_id'
                ]
            ]
        ]
    ])->raw();
$categories = collect(data_get($raw, 'aggregations.categories.buckets', []))->pluck('key')->map(fn($id) => Category::find($id));

了解有关 OpenSearch 聚合 的更多信息

了解有关 Laravel Scout 的更多信息