chimilevschi / laravel-opensearch-engine
OpenSearch 引擎的 Laravel Scout
v1.0.1
2023-10-22 20:09 UTC
Requires
- php: >=8.0
- laravel/framework: ^10.0.0
- laravel/scout: ^10.0
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 的更多信息