panda843 / laravel-elasticsearch
在Laravel中使用Elasticsearch作为数据库来检索Eloquent模型和执行聚合操作。
Requires
- php: ^7.1 || ^8.0
- ext-json: *
- elasticsearch/elasticsearch: ^7.0
- laravel/framework: ^5.8 || ^6.0 || >=7.0
Requires (Dev)
- mockery/mockery: ^1.1
- phpunit/phpunit: ^7.1
- dev-master
- v6.5.313
- v6.5.312
- v6.5.311
- v6.5.310
- v6.5.309
- v6.5.308
- v6.5.307
- v6.5.306
- v6.5.305
- v6.5.304
- v6.5.303
- v6.5.302
- v6.5.301
- v6.5.3
- v6.5.2
- v6.5.1
- v6.5.0
- v6.4.9
- v6.4.8
- v6.4.7
- v6.4.6
- v6.4.5
- v6.4.4
- v6.4.3
- v6.4.2
- v6.4.1
- v6.4.0
- v6.3.9
- v6.3.8
- v6.3.7
- v6.3.6
- v6.3.5
- v6.3.4
- v6.3.2
- v6.3.1
- v6.3.0
- v6.2.4
- v6.2.3
- 6.2.2
- 6.2.1
- v6.2.0
- 6.1.4
- 6.1.3
- 6.1.2
- 6.1.1
- 6.1.0
- v6.0.2
- v6.0.1
- v6.0.0
- 5.0.x-dev
- v5.0.0
- v4.5
- 4.3.9.x-dev
- v4.3.9
- 4.3.8.x-dev
- v4.3.8
- v4.3.7
- v4.3.6
- v4.3.5
- 4.3.4
- v4.3.3
- v4.3.2
- v4.3.1
- 4.3.0.x-dev
- v4.3.0
- v4.2.2.x-dev
- v4.2.1
- 4.2.0.x-dev
- v4.2.0
- 4.1.0.x-dev
- v4.1.0
- 4.0.x-dev
- v4.0.5
- v4.0.4
- v4.0.3
- v4.0.2
- v4.0.1
- v4.0.0
- 3.0.x-dev
- v3.0.15
- v3.0.14
- v3.0.13
- v3.0.12
- v3.0.11
- v3.0.10
- v3.0.9
- v3.0.8
- v3.0.7
- v3.0.6
- v3.0.5
- v3.0.4
- v3.0.3
- v3.0.2
- v3.0.1
- v3.0.0
- v2.1.10
- v2.1.9
- v2.1.8
- v2.1.7
- 2.1.6
- 2.1.5
- 2.1.4
- 2.1.3
- 2.1.2
- 2.1.1
- 2.1.0
- 2.0.5
- 2.0.4
- 2.0.3
- 2.0.2
- 2.0.1
- 2.0.0
- 1.1.1
- 1.1.0
- v1.0.17
- v1.0.16
- v1.0.15
- v1.0.14
- v1.0.13
- v1.0.12
- v1.0.11
- v1.0.10
- v1.0.9
- v1.0.8
- v1.0.7
- v1.0.6
- v1.0.5
- v1.0.4
- v1.0.3
- v1.0.2
- v1.0.1
- v1.0.0
- v0.2.1-beta
- v0.2.0-beta
- v0.1.0-beta
- v0.1.0-alpha.3
- v0.1.0-alpha.2
- v0.1.0-alpha1
- v0.1.0-alpha
- dev-patch-1
- dev-fix-LengthAwarePaginator
- dev-4.3.0-change-array-check
- dev-4.2-merge
- dev-dependabot/composer/league/flysystem-1.1.4
- dev-alasdairmackenzie-patch-1
- dev-fixClauseOptions
- dev-Bump-laravel-version-reqs
- dev-v4.1.0-branch
- dev-2.1-fixes
This package is auto-updated.
Last update: 2024-09-24 10:54:44 UTC
README
在Laravel中使用Elasticsearch作为数据库来检索Eloquent模型和执行聚合操作。
像使用Eloquent一样构建Elasticsearch查询,并获取模型实例,还有一些额外的功能
- 使用
query
、filter
和postFilter
查询类型 - 执行地理搜索
- 在您的数据上构建和执行复杂的聚合操作
- 使用Elasticsearch的scroll API检索大量结果
版本
根据您的Elasticsearch版本,您可以使用此包的以下版本
设置
将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',
]
创建或更新您的base Model.php类以重写newEloquentBuilder()
和newBaseQueryBuilder()
/** * Create a new Eloquent builder for the model. * * @param \Illuminate\Database\Query\Builder $query * @return \Illuminate\Database\Eloquent\Builder|static */ public function newEloquentBuilder($query) { switch ($this->getConnectionName()) { case static::getElasticsearchConnectionName(): $builder = new ElasticsearchEloquentBuilder($query); break; default: $builder = new Illuminate\Database\Eloquent\Builder($query); } return $builder; } /** * Get a new query builder instance for the connection. * * @return \Illuminate\Database\Query\Builder */ protected function newBaseQueryBuilder() { $connection = $this->getConnection(); switch ($this->getConnectionName()) { case static::getElasticsearchConnectionName(): $builder = new ElasticsearchQueryBuilder($connection, $connection->getQueryGrammar(), $connection->getPostProcessor()); break; default: $builder = new Illuminate\Database\Query\Builder($connection, $connection->getPostProcessor()); } return $builder; }
搜索
现在您可以开始对数据进行搜索了。查询将查找与您的模型所在的数据库表同名的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);
Scroll API
您可以使用滚动搜索来检索大量结果。而不是返回一个Collection,您将获得一个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
选项。