daalvand/laravel-elasticsearch

在Laravel中将Elasticsearch用作数据库以检索Eloquent模型并执行聚合。

0.3.13 2021-10-17 10:11 UTC

README

在Laravel中将Elasticsearch用作数据库以检索Eloquent模型并执行聚合。

像使用Eloquent一样构建Elasticsearch查询,并以一些额外功能返回模型实例

  • 使用 queryfilterpostFilter 查询类型
  • 执行地理搜索
  • 构建并执行复杂的数据聚合
  • 使用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()` 方法接受三个或四个参数

  1. 用于聚合的键
  2. 聚合的类型,例如 'filter' 或 'terms'
  3. (可选) 提供聚合选项的回调或数组
  4. (可选) 允许您提供进一步子聚合的函数
$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 选项。