babenkoivan/elastic-scout-driver-plus

Elastic Scout Driver 扩展


README

Support the project!

Elastic Scout Driver 提供扩展。

内容

特性

Elastic Scout Driver Plus 支持

兼容性

当前版本的 Elastic Scout Driver Plus 已与以下配置进行测试

  • PHP 8.2
  • Elasticsearch 8.x
  • Laravel 11.x
  • Laravel Scout 10.x

如果你的项目使用较旧的 Laravel(或 PHP)版本,请检查此包的先前主要版本

安装

可以通过 Composer 安装此库

composer require babenkoivan/elastic-scout-driver-plus

注意,此库在没有 Elastic Scout Driver 的情况下无法工作。如果尚未安装,请按照此处描述的安装步骤进行操作。如果您已经使用 Elastic Scout Driver,建议在安装 Elastic Scout Driver Plus 之前更新它

composer update babenkoivan/elastic-scout-driver

安装库后,您需要将 Elastic\ScoutDriverPlus\Searchable 特性添加到您的模型中。如果某些模型已经使用了标准 Laravel\Scout\Searchable 特性,则应将其替换为 Elastic Scout Driver Plus 提供的特性。

如果您想使用 Elastic Scout Driver Plus 与 Lumen 框架,请参考此指南

使用

查询

在开始搜索模型之前,您应该定义一个查询。您可以使用查询构建器或使用数组描述查询

use Elastic\ScoutDriverPlus\Support\Query;

// using a query builder
$query = Query::match()
    ->field('title')
    ->query('My book')
    ->fuzziness('AUTO');

// using a raw query
$query = [
    'match' => [
        'title' => [
            'query' => 'My book',
            'fuzziness' => 'AUTO'
        ] 
    ]
];

Elastic\ScoutDriverPlus\Support\Query 工厂中的每个方法都为相应类型创建一个查询构建器。下面列出了可用方法

搜索参数

查询定义后,您可以使用 searchQuery 方法开始新的搜索

$builder = Book::searchQuery($query);

然后,您可以链接其他参数以使您的搜索请求更精确

$builder = Book::searchQuery($query)
    ->size(2)
    ->sort('price', 'asc');

构建器支持各种搜索参数并提供了一些有用的辅助函数

搜索结果

您可以通过在构建器上链接 execute 方法来检索搜索结果

$searchResult = Book::searchQuery($query)->execute();

$searchResult 提供了对匹配的条目、模型、文档等的便捷访问。

$hits = $searchResult->hits();
$models = $searchResult->models();
$documents = $searchResult->documents();
$highlights = $searchResult->highlights();

您可以在这个页面上了解更多关于 $searchResult 对象的信息,并学习如何分页显示搜索结果。

自定义路由

如果您想为模型使用自定义分片路由,则覆盖 searchableRouting 方法。

class Book extends Model
{
    use Elastic\ScoutDriverPlus\Searchable;
    
    public function searchableRouting()
    {
        return $this->user->id;
    }
}

自定义路由会自动应用于所有索引和删除操作。

贪婪加载关系

有时您需要将关联数据索引到模型中

class Book extends Model
{
    use Elastic\ScoutDriverPlus\Searchable;
    
    public function toSearchableArray()
    {
        return [
            'title' => $this->title,
            'price' => $this->price,
            'author' => $this->author->only(['name', 'phone_number']),
        ];
    }
}

通过覆盖 searchableWith 方法,您可以提高批量操作的性能

class Book extends Model
{
    use Elastic\ScoutDriverPlus\Searchable;
    
    public function toSearchableArray()
    {
        return [
            'title' => $this->title,
            'price' => $this->price,
            'author' => $this->author->only(['name', 'phone_number']),
        ];
    }
    
    public function searchableWith()
    {
        return ['author'];
    }
}

如果您正在寻找一种方法来预加载与搜索查询匹配的模型的关系,请查看构建器的 load 方法文档

多个连接

您可以在客户端的配置文件中配置多个连接到 Elasticsearch。如果您想更改模型使用的连接,则需要覆盖 searchableConnection 方法。

class Book extends Model
{
    use Elastic\ScoutDriverPlus\Searchable;
    
    public function searchableConnection(): ?string
    {
        return 'books';
    }
}