phroggyy / discover
为 Laravel 提供的简化 ElasticSearch 集成
Requires
- elasticsearch/elasticsearch: 2.1.5
- laravel/framework: ~5.1
Requires (Dev)
- mockery/mockery: ^0.9.4
- phpunit/phpunit: ^5.3
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()创建一个查询构建器
完成
- 自动为子文档添加索引的主键
- 使子文档查询(搜索)成为可能