triadev / laravel-elasticsearch-dsl
为 Laravel 提供流畅的 Elasticsearch 查询和聚合 DSL 的服务提供者。
Requires
- php: >=7.1
- ext-json: *
- elasticsearch/elasticsearch: ^6.0
- laravel/framework: 5.5.* || 5.6.* || 5.7.*
- ongr/elasticsearch-dsl: ^6.0
- triadev/laravel-elasticsearch-provider: ^3.0
- triadev/laravel-prometheus-exporter: ^1.6
Requires (Dev)
- fzaninotto/faker: ~1.4
- mockery/mockery: ~1.0
- orchestra/testbench: ~3.0
- phpunit/phpunit: ^6.0 || ^7.0
- squizlabs/php_codesniffer: ^3.0
This package is auto-updated.
Last update: 2024-09-09 14:19:41 UTC
README
为 Laravel 提供流畅的 Elasticsearch 查询和聚合 DSL 的服务提供者。
支持的 Laravel 版本
支持的 Elasticsearch 版本
主要特性
- 查询 (TermLevel, Fulltext, Geo, Compound, Joining, Specialized, InnerHit)
- 聚合 (Bucketing, Metric, Pipeline)
- 建议
安装
Composer
composer require triadev/laravel-elasticsearch-dsl
应用
该包通过 Laravel 和 Composer 的包发现注册。
安装完成后,您现在可以发布您的配置文件并设置正确的配置以使用该包。
php artisan vendor:publish --provider="Triadev\Es\Dsl\Provider\ServiceProvider" --tag="config"
这将创建一个文件 config/laravel-elasticsearch-dsl.php。
配置
度量
度量是通过包 LaravelPrometheusExporter 生成的。
详细的配置选项在包的说明中有所记录。
以下度量在 metrics.enabled = true 时生成
命名空间: triadev_laravel_elasticsearch_dsl
直方图
用法
此包提供 Elasticsearch 的 DSL。每个查询/聚合的入口点是外观。
Triadev\Es\Dsl\Facade\ElasticDsl;
每个查询/聚合返回一个包含搜索结果和聚合的对象。
Triadev\Es\Dsl\Model\SearchResult
int: time needed to execute the query $result->took(); bool $result->timedOut(); float $result->maxScore(); int: number of matched documents $result->totalHits(); Illuminate\Support\Collection: collection of searchable eloquent models $result->hits(); array|null $result->aggregation();
Bool
对于基于 bool 的每个查询,都可以更改 bool 状态。
默认 bool 状态:must
ElasticDsl::search()->termLevel() ->must() ->term('FIELD', 'VALUE') ->mustNot() ->term('FIELD', 'VALUE') ->should() ->term('FIELD', 'VALUE') ->filter() ->term('FIELD', 'VALUE') })->get()
Nested bool 查询
使用 bool(\Closure $closure) 实现嵌套查询。
ElasticDsl::search() ->termLevel() ->term('FIELD', 'VALUE') ->bool(function (Search $search) { $search->termLevel() ->term('FIELD', 'VALUE') ->bool(function (Search $search) { $search->fulltext() ->match('FIELD1', 'QUERY1') ->matchPhrase('FIELD2', 'QUERY2'); }); }) ->prefix('FIELD', 'VALUE') ->get(); -------------------------------------------------- [ "query" => [ "bool" => [ "must" => [ [ "term" => [ "FIELD" => "VALUE" ] ], [ "bool" => [ "must" => [ [...], [...] ] ] ], [ "prefix" => [ "FIELD" => [ "value" => "VALUE" ] ] ] ] ] ] ]
TermLevel
matchAll, exists, fuzzy, ids, prefix, range, regexp, term, terms, type, wildcard
ElasticDsl::search()->termLevel()->filter()->term('FIELD', 'VALUE')->get();
Fulltext
match, matchPhrase, matchPhrasePrefix, multiMatch, queryString, simpleQueryString, commonTerms
ElasticDsl::search()->fulltext()->must()->match('FIELD', 'QUERY')->get();
Geo
geoBoundingBox, geoDistance, geoPolygon, geoShape
ElasticDsl::search()->geo()->filter()->geoDistance('FIELD','10km', new Location(1, 2))->get();
Compound
functionScore, constantScore, boosting, disMax
ElasticDsl::search()->compound()->functionScore( function (Search $search) { $search->termLevel()->term('FIELD1', 'VALUE1'); }, function (FunctionScore $functionScore) { $functionScore->simple([]); } )->get();
Joining
nested, hasChild, hasParent
ElasticDsl::search()->joining()->nested('PATH', function (Search $search) { $search->termLevel()->filter()->term('FIELD', 'VALUE'); })->get();
Specialized
moreLikeThis
ElasticDsl::search()->specialized()->moreLikeThis('LIKE')->toDsl();
InnerHit
nestedInnerHit, parentInnerHit
ElasticDsl::search()->nestedInnerHit('NAME', 'PATH', function (Search $search) { $search->termLevel()->term('FIELD', 'VALUE'); })->get();
单个索引和类型
要为每个查询设置单个索引或类型,您有两个覆盖方法。
ElasticDsl::search() ->overwriteIndex('INDEX') ->overwriteType('TYPE') ->termLevel() ->matchAll() ->get();
聚合
Bucketing, Metric, Pipeline
ElasticDsl::search()->aggregation(function (Aggregation $aggregation) { $aggregation->metric(function (Aggregation\Metric $metric) { ... }); })->get(); ElasticDsl::search()->aggregation(function (Aggregation $aggregation) { $aggregation->bucketing(function (Aggregation\Bucketing $metric) { ... }); })->get(); ElasticDsl::search()->aggregation(function (Aggregation $aggregation) { $aggregation->pipeline(function (Aggregation\Pipeline $metric) { ... }); })->get();
建议
term, phrase, completion
ElasticDsl::suggest()->term('NAME', 'TEXT', 'FIELD')->get();
报告问题
如果您发现任何问题,请随时通过该项目的 GitHub 错误跟踪器报告。
或者,将该项目的分支 fork 出来并提交一个 pull request。 :)
测试
- docker-compose -f docker-compose.yml up
- composer test
贡献
有关详细信息,请参阅 CONTRIBUTING。
致谢
其他
项目相关链接
许可
laravel-elasticsearch-dsl 的代码根据 MIT 许可证分发(见 LICENSE)。