greensight/laravel-elastic-query

此包已被弃用,不再维护。作者建议使用 ensi/laravel-elastic-query 包。

0.2.0 2021-09-22 06:27 UTC

This package is auto-updated.

Last update: 2021-10-05 09:45:16 UTC


README

已废弃,请使用 https://github.com/ensi-platform/laravel-telemetry 代替

以 Eloquent 类似的方式与 Elasticsearch 合作。

安装

您可以通过 composer 安装此包

  1. composer require greensight/laravel-elastic-query
  2. 在您的 .env 文件中设置 ELASTICSEARCH_HOSTS。逗号可以用作分隔符。

基本用法

让我们创建并索引一个类。它类似于 Eloquent 模型。

use Greensight\LaravelElasticQuery\ElasticIndex;

class ProductsIndex extends ElasticIndex
{
    protected string $name = 'test_products';
    protected string $tiebreaker = 'product_id';
}

您应该在 $tiebreaker 中设置一个在文档中唯一的属性名称。它用作 search_after 的附加排序。

现在我们可以获取一些文档

$searchQuery = ProductsIndex::query();

$hits = $searchQuery
             ->where('rating', '>=', 5)
             ->whereDoesntHave('offers', fn(BoolQuery $query) => $query->where('seller_id', 10)->where('active', false))
             ->sortBy('rating', 'desc')
             ->sortByNested('offers', fn(SortableQuery $query) => $query->where('active', true)->sortBy('price', mode: 'min'))
             ->take(25)
             ->get();

过滤

$searchQuery->where('field', 'value');
$searchQuery->where('field', '>', 'value'); // supported operators: `=` `!=` `>` `<` `>=` `<=`
$searchQuery->whereNot('field', 'value'); // equals `where('field', '!=', 'value')`
$searchQuery->whereIn('field', ['value1', 'value2']);
$searchQuery->whereNotIn('field', ['value1', 'value2']);
$searchQuery->whereNull('field');
$searchQuery->whereNotNull('field');
$searchQuery->whereHas('nested_field', fn(BoolQuery $subQuery) => $subQuery->where('field_in_nested', 'value'));
$searchQuery->whereDoesntHave(
    'nested_field',
    function (BoolQuery $subQuery) {
        $subQuery->whereHas('nested_field', fn(BoolQuery $subQuery2) => $subQuery2->whereNot('field', 'value'));
    }
);

nested_field 必须具有 nested 类型。子查询不能仅使用主文档的字段,还可以使用子文档的字段。

排序

$searchQuery->sortBy('field', 'desc', 'max'); // field is from main document
$searchQuery->sortByNested(
    'nested_field',
    fn(SortableQuery $subQuery) => $subQuery->where('field_in_nested', 'value')->sortBy('field')
);

第二个属性是方向。它支持 ascdesc 值。默认为 asc
第三个属性 - 排序类型。支持的类型列表:min, max, avg, sum, median。默认为 min

还有针对每种排序类型的专用排序方法。

$searchQuery->minSortBy('field', 'asc');
$searchQuery->maxSortBy('field', 'asc');
$searchQuery->avgSortBy('field', 'asc');
$searchQuery->sumSortBy('field', 'asc');
$searchQuery->medianSortBy('field', 'asc');

分页

偏移分页

$page = $searchQuery->paginate(15, 45);

偏移分页返回总文档数作为 total 和当前位置作为 size/offset

游标分页

$page = $searchQuery->cursorPaginate(10);
$pageNext = $searchQuery->cursorPaginate(10, $page->next);

在这种情况下返回 currentnextprevious 而不是 totalsizeoffset。您可以在 Laravel 文档中找到更多关于游标分页的信息。

聚合

可以像这样创建聚合查询

$aggQuery = ProductsIndex::aggregate();

/** @var \Illuminate\Support\Collection $aggs */
$aggs = $aggQuery
            ->where('active', true)
            ->terms('codes', 'code')
            ->nested(
                'offers',
                fn(AggregationsBuilder $builder) => $builder->where('seller_id', 10)->minmax('price', 'price')
            );

$aggs
            

$aggs->price 的类型是 MinMax$aggs->codes 的类型是 BucketCollection。聚合名称在整个查询中必须是唯一的。

聚合类型

获取所有属性值的变体

$aggQuery->terms('agg_name', 'field');

获取最小和最大属性值。例如,对于日期

$aggQuery->minmax('agg_name', 'field');

聚合与嵌套文档很好地协同工作。

$aggQuery->nested('nested_field', function (AggregationsBuilder $builder) {
    $builder->terms('name', 'field_in_nested');
});

还有一个特殊的虚拟 composite 聚合在根级别。您可以使用它设置特殊条件。

$aggQuery->composite(function (AggregationsBuilder $builder) {
    $builder->where('field', 'value')
        ->whereHas('nested_field', fn(BoolQuery $query) => $query->where('field_in_nested', 'value2'))
        ->terms('field1', 'agg_name1')
        ->minmax('field2', 'agg_name2');
});

查询日志

与 Eloquent ElasticQuery 类似,Elasticsearch 有自己的查询日志,但您需要手动启用它。每条消息都包含 indexNamequerytimestamp

ElasticQuery::enableQueryLog();

/** @var \Illuminate\Support\Collection|Greensight\LaravelElasticQuery\Debug\QueryLogRecord[] $records */
$records = ElasticQuery::getQueryLog();

ElasticQuery::disableQueryLog();

贡献

有关详细信息,请参阅 CONTRIBUTING

测试

  1. composer install
  2. npm i
  3. 以您喜欢的任何方式启动 Elasticsearch。
  4. phpunit.xml.dist 复制到 phpunit.xml 并在那里设置正确的环境变量
  5. 执行 composer test

安全漏洞

请查阅我们的安全策略,了解如何报告安全漏洞。

许可协议

MIT 许可协议 (MIT)。请参阅许可文件获取更多信息。