daalvand / laravel-elasticsearch
在Laravel中将Elasticsearch用作数据库以检索Eloquent模型并执行聚合。
0.3.13
2021-10-17 10:11 UTC
Requires
- php: ^7.4 || ^8.0
- elasticsearch/elasticsearch: ^7.0
- laravel/framework: ^5.6 || ^6.0 || ^7.0 || ^8.0
Requires (Dev)
- orchestra/testbench: *
- roave/security-advisories: dev-latest
README
在Laravel中将Elasticsearch用作数据库以检索Eloquent模型并执行聚合。
像使用Eloquent一样构建Elasticsearch查询,并以一些额外功能返回模型实例
- 使用
query
、filter
和postFilter
查询类型 - 执行地理搜索
- 构建并执行复杂的数据聚合
- 使用Elasticsearch滚动API检索大量结果
设置
将Elasticsearch连接配置添加到database.php
'elasticsearch' => [
'driver' => 'elasticsearch',
'host' => 'localhost',
'port' => 9200,
'database' => 'your_es_index',
'username' => 'optional_es_username',
'password' => 'optional_es_username',
'suffix' => 'optional_es_index_suffix',
]
搜索
您现在可以开始对数据进行搜索。查询将查找与模型所在的数据库表同名的一个Elasticsearch索引。
$documents = MyModel::newElasticsearchQuery() ->where('date', '>', Carbon\Carbon::now()) ->get();
聚合
可以使用类似于直接查询Elasticsearch的方法添加聚合,使用嵌套函数而不是嵌套数组。`aggregation()` 方法接受三个或四个参数
- 用于聚合的键
- 聚合的类型,例如 'filter' 或 'terms'
- (可选) 提供聚合选项的回调或数组
- (可选) 允许您提供进一步子聚合的函数
$myQuery = MyModel::newElasticsearchQuery() ->aggregation( // The key of the aggregation (used in the Elasticsearch response) 'my_filter_aggregation', // The type of the aggregation 'filter', // A callback providing options to the aggregation, in this case adding filter criteria to a query builder function ($query) { $query->where('lost', '!=', true); $query->where('concierge', true); }, // A callback specifying a sub-aggregation function ($builder) { // A simpler aggregation, counting terms in the 'status' field $builder->aggregation('my_terms_aggregation', 'terms', ['field' => 'status']); } ); $results = $myQuery->get(); $aggregations = $myQuery->getQuery()->getAggregationResults();
地理查询
您可以通过地理点距离筛选搜索结果,或仅包含在给定边界内的结果,传递与直接查询Elasticsearch相同的格式。
$withinDistance = MyModel::newElasticsearchQuery() ->whereGeoDistance('geo_field', [$lat, $lon], $distance); $withinBounds= MyModel::newElasticsearchQuery() ->whereGeoBoundsIn('geo_field', $boundingBox);
滚动API
您可以使用滚动搜索来检索大量结果。而不是返回一个集合,您将获得一个PHP 生成器函数,您可以遍历它,其中每个值都是来自Elasticsearch的单个结果的模型。
$documents = MyModel::newElasticsearchQuery() ->limit(100000) ->usingScroll() ->get(); // $documents is a Generator foreach ($documents as $document){ echo $document->id; }
控制台
此包包含以下命令,可作为实用程序或作为部署过程的一部分使用。
映射和别名
在创建新索引时,`migrate:mappings` 命令将自动根据迁移名称创建一个别名,通过删除日期字符串。例如,迁移 2018_08_03_095804_users.json
将创建别名 users
。
在第一次迁移中,`migrate:mappings` 命令还将别名切换到最新的索引映射。上面的操作仅在别名不存在时才会发生。
未来的迁移将需要您使用 --swap
选项。