triadev/laravel-elasticsearch-dsl

为 Laravel 提供流畅的 Elasticsearch 查询和聚合 DSL 的服务提供者。

v1.1.4 2019-01-08 19:02 UTC

This package is auto-updated.

Last update: 2024-09-09 14:19:41 UTC


README

为 Laravel 提供流畅的 Elasticsearch 查询和聚合 DSL 的服务提供者。

Software license Travis Coveralls CodeCov

Scrutinizer Code Quality Code Coverage Build Status

Latest stable Latest development Monthly installs

支持的 Laravel 版本

Laravel 5.5 Laravel 5.6 Laravel 5.7

支持的 Elasticsearch 版本

Elasticsearch 6.0 Elasticsearch 6.1 Elasticsearch 6.2 Elasticsearch 6.3 Elasticsearch 6.4

主要特性

  • 查询 (TermLevel, Fulltext, Geo, Compound, Joining, Specialized, InnerHit)
  • 聚合 (Bucketing, Metric, Pipeline)
  • 建议

安装

Composer

composer require triadev/laravel-elasticsearch-dsl

应用

该包通过 Laravel 和 Composer 的包发现注册。

https://laravel.net.cn/docs/5.7/packages

安装完成后,您现在可以发布您的配置文件并设置正确的配置以使用该包。

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。 :)

测试

  1. docker-compose -f docker-compose.yml up
  2. composer test

贡献

有关详细信息,请参阅 CONTRIBUTING

致谢

其他

项目相关链接

许可

laravel-elasticsearch-dsl 的代码根据 MIT 许可证分发(见 LICENSE)。