greensight / laravel-elastic-query
Requires
- php: ^8.0
- elasticsearch/elasticsearch: ^7.13
- illuminate/support: ^8.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^2.16
- mockery/mockery: ^1.4
- orchestra/testbench: ^6.0
- php-parallel-lint/php-var-dump-check: ^0.5.0
- phpunit/phpunit: ^9.0
README
已废弃,请使用 https://github.com/ensi-platform/laravel-telemetry 代替
以 Eloquent 类似的方式与 Elasticsearch 合作。
安装
您可以通过 composer 安装此包
composer require greensight/laravel-elastic-query
- 在您的
.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') );
第二个属性是方向。它支持 asc
和 desc
值。默认为 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);
在这种情况下返回 current
、next
和 previous
而不是 total
、size
和 offset
。您可以在 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 有自己的查询日志,但您需要手动启用它。每条消息都包含 indexName
、query
和 timestamp
。
ElasticQuery::enableQueryLog(); /** @var \Illuminate\Support\Collection|Greensight\LaravelElasticQuery\Debug\QueryLogRecord[] $records */ $records = ElasticQuery::getQueryLog(); ElasticQuery::disableQueryLog();
贡献
有关详细信息,请参阅 CONTRIBUTING。
测试
- composer install
- npm i
- 以您喜欢的任何方式启动 Elasticsearch。
- 将
phpunit.xml.dist
复制到phpunit.xml
并在那里设置正确的环境变量 - 执行 composer test
安全漏洞
请查阅我们的安全策略,了解如何报告安全漏洞。
许可协议
MIT 许可协议 (MIT)。请参阅许可文件获取更多信息。