phroggyy/discover

为 Laravel 提供的简化 ElasticSearch 集成

dev-master 2016-05-31 13:41 UTC

This package is auto-updated.

Last update: 2024-09-25 06:38:54 UTC


README

发现数据的真正潜力

请注意:Discover 缺少一些测试,可能不是所有内容都能正常工作... 欢迎提交 pull request!

Discover 是一个针对 Laravel 框架 的包,尽管经过一些修改,也可以独立使用。

现在是 2016 年,每个人都想要搜索所有事物。人们想要通过简单的搜索词搜索所有博客文章、所有评论、所有页面,一切。当然,你以前从未真正处理过这种搜索;当然,你可以在 MySQL 中进行全文搜索,但即使可能,也不是最佳选择。相反,你可能得出结论,你应该使用文档数据库,例如 Elasticsearch。由于以前从未使用过它,你想象它不会比其他数据库难多少,然后你就陷入了困境。两个 周之后。

Elasticsearch 是一个奇妙且功能强大的工具。然而,最初开始使用它可能会让人感到非常可怕,因为使用官方的 PHP 库通常会导致执行大约 7 层嵌套数组才能做点有用的事情。当然,这很糟糕,并且不会让你想要使用 Elasticsearch,这就是我构建 Discover 的原因。

Discover 旨在通过子文档(如果你不明白这是什么意思,你不需要关心)创建带有关系的可搜索模型,从而提供一种无缝体验,只需使用即可。当你对模型调用 save 时,Discover 将确保将你想要索引到 Elasticsearch 的数据索引,并跳过其余部分。

先决条件

要使用此功能,你需要某种形式的文档数据库。目前,只支持 Elasticsearch 驱动,尽管接受实现更多驱动的 PR。

安装

最方便的安装方式是通过 composer,只需执行以下操作

composer require phroggyy/discover dev-master

目前,还没有稳定版本,因为我希望在打标签之前创建更多的测试并确保一切正常工作。

完成此操作后,您需要在 config/app.php 中注册服务提供者,只需添加以下行

Phroggyy\Discover\DiscoverServiceProvider::class,

就是这样,现在您可以在应用程序中使用 Discover 了!

配置

如果您只想使用一个 Elasticsearch 主节点,并坚持使用相当标准的配置,则不需要发布配置文件。但是,至少您应该在 .env 文件中设置 ELASTICSEARCH_HOST,如果它不在 localhost 上。

默认连接到 localhost:9200,端口可以通过 ELASTICSEARCH_PORT 进行更改。

要发布配置文件,只需运行

php artisan vendor:publish --provider=Phroggyy\Discover\DiscoverServiceProvider

用法

为了开始使用 discover,您需要注意两件事:迁移和模型。

迁移

Discover 随带一个方便的特性,可以在您的 Elasticsearch 数据库上执行迁移。在迁移中,只需使用特性 MigratesElasticSearchIndices,您就可以突然运行 $this->migrateIndex。这种方式的工作方式如下

public function up ()
{
    $this->migrateIndex(new ModelToIndex, $version, $properties);
}

请注意,在运行迁移之前,您需要设置模型。

这允许您指定索引上的属性。如果您愿意,还可以更改分片、副本数量或索引类型。

这样做,您只需使用 php artisan migrate 命令即可迁移数据库。请注意,目前还没有 down 方法。

模型

如果您有Elasticsearch数据库,您可能想在其中存储一些数据。因此,为了将简单的模型作为文档存储,您只需要在模型中指定以下内容(这里使用示例 Post 模型)

class Post extends Model implements Searchable
{
    use Discoverable;
    
    protected $documentFields = [
        'title',
        'body',
    ];
}

这将确保当您保存帖子时,将创建(或更新)一个包含 $documentFields 中指定数据的Elasticsearch文档。如果您愿意在Elasticsearch中存储所有属性(这毫无意义),甚至可以省略 $documentFields

嵌套类型(子文档)

Elasticsearch有一种称为嵌套类型的东西,它基本上允许您的文档... 在其中包含其他文档。这是以面向文档的方式表示关系的一种很好的方法。例如,想象一下,这个 Post 有一些 Comment。在关系型数据库中,您会允许评论有一个 post_id,而在这里,您可以存储所有评论 Post 文档内。这使得查询 要快得多

Elasticsearch还支持父子关系,这与您在关系型数据库中的结构相似,但尽管索引速度更快,但搜索这种关系可能会慢5-10倍。

因此,如果您希望所有 Comment 作为 Post 的子文档 自动 索引,这很简单;您只需要设置一个 $documentType

class Comment extends Model implements Searchable
{
    use Discoverable;
    
    protected $documentType = Post::class.'/message';
    
    protected $documentFields = [
        'id',
        'message'
    ];
}

这将确保每当保存一个评论时,它也会在Elasticsearch中索引。

一般注意事项

为了使这个包功能完整且更友好,还有很多工作要做,PR总是受欢迎的,这只是一个开始,以满足我构建产品所需的最基本要求。

待办事项

  • 通过移动别名然后删除创建的索引,使 down 迁移成为可能。
  • 为例如 Model::search()->match('foo', 'bar')->get() 创建一个查询构建器

完成

  • 自动为子文档添加索引的主键
  • 使子文档查询(搜索)成为可能