savingfor/elasticsearch-query-builder

Build and execute an Elasticsearch search query using a fluent PHP API

v1.1.1 2022-05-11 07:32 UTC

This package is auto-updated.

Last update: 2024-05-11 12:41:14 UTC


README

这个包是 ElasticSearch 的轻量级查询构建器。它是专门为我们的elasticsearch-search-string-parser构建的,因此它涵盖了大多数使用方法,但会缺少部分某些功能。如果您需要任何特定的东西,也可以进行补充,这一点不胜荣幸。

安装

请确保您安装好composer

composer require savingfor/elasticsearch-query-builder

基本用法

您真正需要与之交互的唯一类是Savingfor\ElasticsearchQueryBuilder\Builder该类。它需要\Elasticsearch\Client在构造函数中传递引用。通过 ElasticSearch SDK文档 了解更多PHP-ElasticSearch更多信息。

use Elasticsearch\ClientBuilder;
use Savingfor\ElasticsearchQueryBuilder\Aggregations\TermsAggregation;

// 您的es连接配置
$host[] = [
    "host" => "127.0.0.1",
    "port" => "9200",
    "user" => "elastic",
    "pass" => "elastic"
];

// 创建连接客户端
$client = ClientBuilder::create()
    ->setHosts($host)
    ->setConnectionPool('\Elasticsearch\ConnectionPool\SimpleConnectionPool', [])
    ->setRetries(10)->build();

$builder = new Builder($client);

// 生成查询quuery
$builder->index("test")
    ->addQuery(
        TermQuery::create("day", "2022-02-22")
    );

// 通过调用$builder->search()来执行查询
$result = $builder->search();

新增搜索查询

$builder->addQuery()方法可用于将任何可用Query类型添加到构建器。可用的查询类型可以在下面或src/Queries此 repo 的目录中找到。每个Query都有一个静态create()方法来传递其最重要的参数。

可以使用以下查询类型:

TermQuery

官方文档使用详情

\Savingfor\ElasticsearchQueryBuilder\Queries\TermQuery::create('age', '18');

RangeQuery

官方文档使用详情

\Savingfor\ElasticsearchQueryBuilder\Queries\RangeQuery::create('age')
    ->gte(18)
    ->lte(28);

BoolQuery

官方文档使用详情

\Savingfor\ElasticsearchQueryBuilder\Queries\BoolQuery::create()
    ->add($matchQuery, 'must_not')
    ->add($existsQuery, 'must_not');

ExistsQuery

官方文档使用详情

\Savingfor\ElasticsearchQueryBuilder\Queries\ExistsQuery::create('conditions');

MatchQuery

官方文档使用详情

\Savingfor\ElasticsearchQueryBuilder\Queries\MatchQuery::create('name', 'john saving', fuzziness: 2);

MultiMatchQuery

官方文档使用详情

\Savingfor\ElasticsearchQueryBuilder\Queries\MultiMatchQuery::create('john', ['email', 'email'], fuzziness: 'auto');

NestedQuery

官方文档使用详情

\Savingfor\ElasticsearchQueryBuilder\Queries\NestedQuery::create(
    'user', 
    new \Savingfor\ElasticsearchQueryBuilder\Queries\MatchQuery('name', 'john')
);

WildcardQuery

官方文档使用详情

\Savingfor\ElasticsearchQueryBuilder\Queries\WildcardQuery::create('user.id', '*doe');

多个搜索查询

多个addQuery()调用可以链接在一个上Builder。多次调用中,它们将被添加到BoolQuery 中。通过将第二个参数传递给该addQuery()方法,您可以选择不同的出现类型:

$builder->index("test")
    ->addQuery(
        TermQuery::create("name", "john"),
  			"must_not"  // 可用类型: must, must_not, should, filter
    )
    ->addQuery(
  		RangeQuery::create("money")->gte("20")
    );

有关布尔查询及其出现类型的更多信息,请参阅Elasticsearch文档

聚合查询

$builder->addAggregation()方法可用于将任何可用Aggregation 添加到构建器。可用的聚合类型可以在下面或src/Aggregations此 repo 的目录中找到。每个Aggregation都有一个静态create()方法来传递其最重要的参数,有时还有一些额外的方法。

use Savingfor\ElasticsearchQueryBuilder\Aggregations\TermsAggregation;
use Savingfor\ElasticsearchQueryBuilder\Builder;

$client = ClientBuilder::create()
    ->setHosts($host)
    ->setConnectionPool('\Elasticsearch\ConnectionPool\SimpleConnectionPool', [])
    ->setRetries(10)->build();

$builder = new Builder($client);

$results = $builder
    ->addAggregation(TermsAggregation::create('my_agg', 'age'))
    ->search();

$genres = $results['aggregations']['my_agg']['buckets'];

可以使用以下聚合查询类型:

TermsAggregation

官方文档使用详情

\Savingfor\ElasticsearchQueryBuilder\Aggregations\TermsAggregation::create(
    'genres',
    'genre'
)
    ->size(10)
    ->order(['_count' => 'asc']) // _count按文档数排序;_term按词项的字符串值的字母顺序排序
    ->missing('N/A')
    ->aggregation(/* $subAggregation */);

CardinalityAggregation

官方文档使用详情

\Savingfor\ElasticsearchQueryBuilder\Aggregations\CardinalityAggregation::create('team_agg', 'team_name');

FilterAggregation

官方文档使用详情

\Savingfor\ElasticsearchQueryBuilder\Aggregations\FilterAggregation::create(
    'tshirts',
    \Savingfor\ElasticsearchQueryBuilder\Queries\TermQuery::create('type', 'tshirt'),
    \Savingfor\ElasticsearchQueryBuilder\Aggregations\MaxAggregation::create('max_price', 'price')
);

MaxAggregation

官方文档使用详情

\Savingfor\ElasticsearchQueryBuilder\Aggregations\MinAggregation::create('min_price', 'price');

MinAggregation

官方文档使用详情

\Savingfor\ElasticsearchQueryBuilder\Aggregations\MinAggregation::create('min_price', 'price');

ReverseNestedAggregation

官方文档使用详情

\Savingfor\ElasticsearchQueryBuilder\Aggregations\ReverseNestedAggregation::create(
    'name',
    ...$aggregations
);

TopHitsAggregation

官方文档使用详情

\Savingfor\ElasticsearchQueryBuilder\Aggregations\TopHitsAggregation::create(
    'top_sales_hits',
    size: 10,
);

添加排序

Builder和一些聚合查询)有一个addSort()方法,它需要一个Sort实例来对结果进行排序。您可以在ElasticSearch 文档中阅读有关排序工作原理的更多信息。

use Savingfor\ElasticsearchQueryBuilder\Sorts\Sort;

$builder
    ->addSort(Sort::create('age', Sort::DESC))
    ->addSort(
        Sort::create('score', Sort::ASC)
            ->unmappedType('long')
            ->missing(0)
    );

返回特定字段

fields()方法可用于从结果文档中请求特定字段,而无需返回整个_source条目。您可以在ElasticSearch 文档中阅读有关 fields 参数细节的更多信息。

$builder->fields('user.id', 'http.*.status');

分页

最后Builder还提供了相应的 ElasticSearch 搜索参数的方法size()from()这些可用于构建分页搜索。看看下面的例子来大致了解一下:

use Savingfor\ElasticsearchQueryBuilder\Builder;

$pageSize = 100;
$pageNumber = $_GET['page'] ?? 1;

$pageResults = (new Builder(\Elasticsearch\ClientBuilder::create()))
    ->size($pageSize)
    ->from(($pageNumber - 1) * $pageSize)
    ->search();

License

MIT