{"id":19324828,"url":"https://github.com/spatie/elasticsearch-query-builder","last_synced_at":"2025-05-15T05:08:25.599Z","repository":{"id":37860468,"uuid":"374627170","full_name":"spatie/elasticsearch-query-builder","owner":"spatie","description":"Build and execute an Elasticsearch search query using a fluent PHP API","archived":false,"fork":false,"pushed_at":"2025-04-14T09:31:34.000Z","size":133,"stargazers_count":172,"open_issues_count":2,"forks_count":45,"subscribers_count":9,"default_branch":"main","last_synced_at":"2025-05-13T14:19:11.534Z","etag":null,"topics":["elasticsearch","php"],"latest_commit_sha":null,"homepage":"https://spatie.be/open-source","language":"PHP","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/spatie.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null},"funding":{"github":"spatie"}},"created_at":"2021-06-07T10:36:25.000Z","updated_at":"2025-04-23T15:18:01.000Z","dependencies_parsed_at":"2024-06-19T00:02:44.425Z","dependency_job_id":"beacfd25-e075-40a0-935d-14ee8ff2de68","html_url":"https://github.com/spatie/elasticsearch-query-builder","commit_stats":{"total_commits":111,"total_committers":21,"mean_commits":5.285714285714286,"dds":0.7027027027027026,"last_synced_commit":"8d23b489695facb5424600c957711df8a5659cc9"},"previous_names":[],"tags_count":29,"template":false,"template_full_name":"spatie/package-skeleton-php","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/spatie%2Felasticsearch-query-builder","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/spatie%2Felasticsearch-query-builder/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/spatie%2Felasticsearch-query-builder/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/spatie%2Felasticsearch-query-builder/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/spatie","download_url":"https://codeload.github.com/spatie/elasticsearch-query-builder/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254276447,"owners_count":22043867,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["elasticsearch","php"],"created_at":"2024-11-10T02:06:57.996Z","updated_at":"2025-05-15T05:08:20.583Z","avatar_url":"https://github.com/spatie.png","language":"PHP","funding_links":["https://github.com/sponsors/spatie"],"categories":[],"sub_categories":[],"readme":"# Build and execute ElasticSearch queries using a fluent PHP API\n\n[![Latest Version on Packagist](https://img.shields.io/packagist/v/spatie/elasticsearch-query-builder.svg?style=flat-square)](https://packagist.org/packages/spatie/elasticsearch-query-builder)\n[![Tests](https://github.com/spatie/elasticsearch-query-builder/actions/workflows/run-tests.yml/badge.svg)](https://github.com/spatie/elasticsearch-query-builder/actions/workflows/run-tests.yml)\n[![Total Downloads](https://img.shields.io/packagist/dt/spatie/elasticsearch-query-builder.svg?style=flat-square)](https://packagist.org/packages/spatie/elasticsearch-query-builder)\n\n---\n\nThis package is a _lightweight_ query builder for ElasticSearch. It was specifically built for our [elasticsearch-search-string-parser](https://github.com/spatie/elasticsearch-search-string-parser) so it covers most use-cases but might lack certain features. We're always open for PRs if you need anything specific!\n\n```php\nuse Spatie\\ElasticsearchQueryBuilder\\Aggregations\\MaxAggregation;\nuse Spatie\\ElasticsearchQueryBuilder\\Builder;\nuse Spatie\\ElasticsearchQueryBuilder\\Queries\\MatchQuery;\n\n$client = Elastic\\Elasticsearch\\ClientBuilder::create()-\u003ebuild();\n\n$companies = (new Builder($client))\n    -\u003eindex('companies')\n    -\u003eaddQuery(MatchQuery::create('name', 'spatie', fuzziness: 3))\n    -\u003eaddAggregation(MaxAggregation::create('score'))\n    -\u003esearch();\n```\n\n## Support us\n\n[\u003cimg src=\"https://github-ads.s3.eu-central-1.amazonaws.com/elasticsearch-query-builder.jpg?t=1\" width=\"419px\" /\u003e](https://spatie.be/github-ad-click/elasticsearch-query-builder)\n\nWe invest a lot of resources into creating [best in class open source packages](https://spatie.be/open-source). You can support us by [buying one of our paid products](https://spatie.be/open-source/support-us).\n\nWe highly appreciate you sending us a postcard from your hometown, mentioning which of our package(s) you are using. You'll find our address on [our contact page](https://spatie.be/about-us). We publish all received postcards on [our virtual postcard wall](https://spatie.be/open-source/postcards).\n\n## Installation\n\nYou can install the package via composer:\n\n```bash\ncomposer require spatie/elasticsearch-query-builder\n```\n\n\u003e **Note**\n\u003e If you're using `elasticsearch/elasticsearch` v7 you need to use [v1](https://github.com/spatie/elasticsearch-query-builder/tree/v1) of this package.\n\n## Basic usage\n\nThe only class you really need to interact with is the `Spatie\\ElasticsearchQueryBuilder\\Builder` class. It requires an `\\Elastic\\Elasticsearch\\Client` passed in the constructor. Take a look at the [ElasticSearch SDK docs](https://www.elastic.co/guide/en/elasticsearch/client/php-api/current/installation.html) to learn more about connecting to your ElasticSearch cluster.\n\nThe `Builder` class contains some methods to [add queries](#adding-queries), [aggregations](#adding-aggregations), [sorts](#adding-sorts), [fields](#retrieve-specific-fields) and some extras for [pagination](#pagination). You can read more about these methods below. Once you've fully built-up the query you can use `$builder-\u003esearch()` to execute the query or `$builder-\u003egetPayload()` to get the raw payload for ElasticSearch.\n\n```php\nuse Spatie\\ElasticsearchQueryBuilder\\Queries\\RangeQuery;\nuse Spatie\\ElasticsearchQueryBuilder\\Builder;\n\n$client = Elastic\\Elasticsearch\\ClientBuilder::create()-\u003ebuild();\n\n$builder = new Builder($client);\n\n$builder-\u003eaddQuery(RangeQuery::create('age')-\u003egte(18));\n\n$results = $builder-\u003esearch(); // raw response from ElasticSearch\n```\n\n#### Multi-Search Queries\n\nMulti-Search queries are also available using the [`MultiBuilder` class](#multi-search-query-builder).\n\n## Adding queries\n\nThe `$builder-\u003eaddQuery()` method can be used to add any of the available `Query` types to the builder. The available query types can be found below or in the `src/Queries` directory of this repo. Every `Query` has a static `create()` method to pass its most important parameters.\n\nThe following query types are available:\n\n#### `ExistsQuery`\n\n[https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-exists-query.html](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-exists-query.html)\n\n```php\n\\Spatie\\ElasticsearchQueryBuilder\\Queries\\ExistsQuery::create('terms_and_conditions');\n```\n\n#### `GeoshapeQuery`\n\n[https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-geo-shape-query.html](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-geo-shape-query.html);\n\n```php\n\\Spatie\\ElasticsearchQueryBuilder\\Queries\\GeoshapeQuery::create(\n  'location',\n  \\Spatie\\ElasticsearchQueryBuilder\\Queries\\GeoshapeQuery::TYPE_POLYGON,\n  [[1.0, 2.0]],\n  \\Spatie\\ElasticsearchQueryBuilder\\Queries\\GeoShapeQuery::RELATION_INTERSECTS,\n);\n```\n\n#### `MatchQuery`\n\n[https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-match-query.html](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-match-query.html)\n\n```php\n\\Spatie\\ElasticsearchQueryBuilder\\Queries\\MatchQuery::create('name', 'john doe', fuzziness: 2, boost: 5.0);\n```\n\n#### `MatchPhraseQuery`\n\n[https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-match-query-phrase.html](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-match-query-phrase.html)\n\n```php\n\\Spatie\\ElasticsearchQueryBuilder\\Queries\\MatchPhraseQuery::create('name', 'john doe', slop: 2,zeroTermsQuery: \"none\",analyzer: \"my_analyzer\");\n```\n\n#### `MultiMatchQuery`\n\n[https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-multi-match-query.html](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-multi-match-query.html)\n\n```php\n\\Spatie\\ElasticsearchQueryBuilder\\Queries\\MultiMatchQuery::create('john', ['email', 'email'], fuzziness: 'auto');\n```\n\n#### `NestedQuery`\n\n[https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-nested-query.html](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-nested-query.html)\n\n```php\n\\Spatie\\ElasticsearchQueryBuilder\\Queries\\NestedQuery::create(\n    'user',\n    new \\Spatie\\ElasticsearchQueryBuilder\\Queries\\MatchQuery('name', 'john')\n);\n```\n\n##### `NestedQuery` `InnerHits`\n\n[https://www.elastic.co/guide/en/elasticsearch/reference/current/inner-hits.html](https://www.elastic.co/guide/en/elasticsearch/reference/current/inner-hits.html)\n\n```php\n$nestedQuery = \\Spatie\\ElasticsearchQueryBuilder\\Queries\\NestedQuery::create(\n    'comments',\n    \\Spatie\\ElasticsearchQueryBuilder\\Queries\\TermsQuery::create('comments.published', true)\n);\n\n$nestedQuery-\u003einnerHits(\n    \\Spatie\\ElasticsearchQueryBuilder\\Queries\\NestedQuery\\InnerHits::create('top_three_liked_comments')\n        -\u003esize(3)\n        -\u003eaddSort(\n            \\Spatie\\ElasticsearchQueryBuilder\\Sorts\\Sort::create(\n                'comments.likes',\n                \\Spatie\\ElasticsearchQueryBuilder\\Sorts\\Sort::DESC\n            )\n        )\n        -\u003efields(['comments.content', 'comments.author', 'comments.likes'])\n);\n```\n\n#### `RangeQuery`\n\n[https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-range-query.html](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-range-query.html)\n\n```php\n\\Spatie\\ElasticsearchQueryBuilder\\Queries\\RangeQuery::create('age')\n    -\u003egte(18)\n    -\u003elte(1337);\n```\n\n#### `TermQuery`\n\n[https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-term-query.html](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-term-query.html)\n\n```php\n\\Spatie\\ElasticsearchQueryBuilder\\Queries\\TermQuery::create('user.id', 'flx');\n```\n\n#### `TermsQuery`\n\n[https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-terms-query.html](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-terms-query.html)\n\n```php\n\\Spatie\\ElasticsearchQueryBuilder\\Queries\\TermsQuery::create('user.id', ['flx', 'fly'], boost: 5.0);\n```\n\n#### `WildcardQuery`\n\n[https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-wildcard-query.html](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-wildcard-query.html)\n\n```php\n\\Spatie\\ElasticsearchQueryBuilder\\Queries\\WildcardQuery::create('user.id', '*doe');\n```\n\n#### `PercolateQuery`\n\n[https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-percolate-query.html](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-percolate-query.html)\n\n```php\n\\Spatie\\ElasticsearchQueryBuilder\\Queries\\PercolateQuery::create('query', ['title' =\u003e 'foo', 'body' =\u003e 'bar']);\n```\n\n#### `BoolQuery`\n\n[https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html)\n\n```php\n\\Spatie\\ElasticsearchQueryBuilder\\Queries\\BoolQuery::create()\n    -\u003eadd($matchQuery, 'must_not')\n    -\u003eadd($existsQuery, 'must_not');\n```\n\n#### `collapse`\n\nThe `collapse` feature allows grouping search results by a specific field while retrieving top documents from each group using `inner_hits`. This is useful for avoiding duplicate entities in search results while still accessing grouped data.\n\n[https://www.elastic.co/guide/en/elasticsearch/reference/current/collapse-search-results.html](https://www.elastic.co/guide/en/elasticsearch/reference/current/collapse-search-results.html)\n\n```php\nuse Spatie\\ElasticsearchQueryBuilder\\Sorts\\Sort;\nuse Spatie\\ElasticsearchQueryBuilder\\Builder;\n\n// Initialize ExtendedBuilder with an Elasticsearch client\n$builder = new Builder($client);\n\n// Apply collapse to group by 'user_id'\n$builder-\u003ecollapse(\n    'user_id', // Field to collapse on\n    [\n        'name' =\u003e 'top_three_liked_posts',\n        'size' =\u003e 3, // Retrieve top 3 posts per user\n        'sort' =\u003e [\n            Sort::create('post.likes', Sort::DESC), // Sort posts by likes (descending)\n        ],\n        'fields' =\u003e ['post.title', 'post.content', 'post.likes'], // Select specific fields\n    ],\n    10, // Max concurrent group searches\n);\n\n// Execute the search\n$response = $builder-\u003esearch();\n```\n\n### Chaining multiple queries\n\nMultiple `addQuery()` calls can be chained on one `Builder`. Under the hood they'll be added to a `BoolQuery` with occurrence type `must`. By passing a second argument to the `addQuery()` method you can select a different occurrence type:\n\n```php\n$builder\n    -\u003eaddQuery(\n        MatchQuery::create('name', 'billie'),\n        'must_not' // available types: must, must_not, should, filter\n    )\n    -\u003eaddQuery(\n        MatchQuery::create('team', 'eillish')\n    );\n```\n\nMore information on the boolean query and its occurrence types can be found [in the ElasticSearch docs](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html).\n\n## Adding aggregations\n\nThe `$builder-\u003eaddAggregation()` method can be used to add any of the available `Aggregation`s to the builder. The available aggregation types can be found below or in the `src/Aggregations` directory of this repo. Every `Aggregation` has a static `create()` method to pass its most important parameters and sometimes some extra methods.\n\n```php\nuse Spatie\\ElasticsearchQueryBuilder\\Aggregations\\TermsAggregation;\nuse Spatie\\ElasticsearchQueryBuilder\\Builder;\n\n$results = (new Builder(Elastic\\Elasticsearch\\ClientBuilder::create()-\u003ebuild()))\n    -\u003eaddAggregation(TermsAggregation::create('genres', 'genre'))\n    -\u003esearch();\n\n$genres = $results['aggregations']['genres']['buckets'];\n```\n\nThe following query types are available:\n\n#### `CardinalityAggregation`\n\n```php\n\\Spatie\\ElasticsearchQueryBuilder\\Aggregations\\CardinalityAggregation::create('team_agg', 'team_name');\n```\n\n#### `FilterAggregation`\n\n[https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-filter-aggregation.html](https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-filter-aggregation.html)\n\n```php\n\\Spatie\\ElasticsearchQueryBuilder\\Aggregations\\FilterAggregation::create(\n    'tshirts',\n    \\Spatie\\ElasticsearchQueryBuilder\\Queries\\TermQuery::create('type', 'tshirt'),\n    \\Spatie\\ElasticsearchQueryBuilder\\Aggregations\\MaxAggregation::create('max_price', 'price')\n);\n```\n\n#### `MaxAggregation`\n\n[https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-metrics-max-aggregation.html](https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-metrics-max-aggregation.html)\n\n```php\n\\Spatie\\ElasticsearchQueryBuilder\\Aggregations\\MaxAggregation::create('max_price', 'price');\n```\n\n#### `MinAggregation`\n\n[https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-metrics-min-aggregation.html](https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-metrics-min-aggregation.html)\n\n```php\n\\Spatie\\ElasticsearchQueryBuilder\\Aggregations\\MinAggregation::create('min_price', 'price');\n```\n\n#### `SumAggregation`\n\n[https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-metrics-sum-aggregation.html](https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-metrics-sum-aggregation.html)\n\n```php\n\\Spatie\\ElasticsearchQueryBuilder\\Aggregations\\SumAggregation::create('sum_price', 'price');\n```\n\n#### `NestedAggregation`\n\n[https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-nested-aggregation.html](https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-nested-aggregation.html)\n\n```php\n\\Spatie\\ElasticsearchQueryBuilder\\Aggregations\\NestedAggregation::create(\n    'resellers',\n    'resellers',\n    \\Spatie\\ElasticsearchQueryBuilder\\Aggregations\\MinAggregation::create('min_price', 'resellers.price'),\n    \\Spatie\\ElasticsearchQueryBuilder\\Aggregations\\MaxAggregation::create('max_price', 'resellers.price'),\n);\n```\n\n#### `ReverseNestedAggregation`\n\n[https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-reverse-nested-aggregation.html](https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-reverse-nested-aggregation.html)\n\n```php\n\\Spatie\\ElasticsearchQueryBuilder\\Aggregations\\ReverseNestedAggregation::create(\n    'name',\n    ...$aggregations\n);\n```\n\n#### `TermsAggregation`\n\n[https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-terms-aggregation.html](https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-terms-aggregation.html)\n\n```php\n\\Spatie\\ElasticsearchQueryBuilder\\Aggregations\\TermsAggregation::create(\n    'genres',\n    'genre'\n)\n    -\u003esize(10)\n    -\u003eorder(['_count' =\u003e 'asc'])\n    -\u003emissing('N/A')\n    -\u003eaggregation(/* $subAggregation */);\n```\n\n#### `TopHitsAggregation`\n\n[https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-metrics-top-hits-aggregation.html](https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-metrics-top-hits-aggregation.html)\n\n```php\n\\Spatie\\ElasticsearchQueryBuilder\\Aggregations\\TopHitsAggregation::create(\n    'top_sales_hits',\n    size: 10,\n);\n```\n\n## Adding sorts\n\nThe `Builder` (and some aggregations) has a `addSort()` method that takes a `Sort` instance to sort the results. You can read more about how sorting works in [the ElasticSearch docs](https://www.elastic.co/guide/en/elasticsearch/reference/current/sort-search-results.html).\n\n```php\nuse Spatie\\ElasticsearchQueryBuilder\\Sorts\\Sort;\n\n$builder\n    -\u003eaddSort(Sort::create('age', Sort::DESC))\n    -\u003eaddSort(\n        Sort::create('score', Sort::ASC)\n            -\u003eunmappedType('long')\n            -\u003emissing(0)\n    );\n```\n\n### Nested sort\n\n[https://www.elastic.co/guide/en/elasticsearch/reference/current/sort-search-results.html#\\_nested_sorting_examples](https://www.elastic.co/guide/en/elasticsearch/reference/current/sort-search-results.html#_nested_sorting_examples)\n\n```php\nuse Spatie\\ElasticsearchQueryBuilder\\Sorts\\NestedSort;\n\n$builder\n    -\u003eaddSort(\n        NestedSort::create('books', 'books.rating', NestedSort::ASC)\n    );\n```\n\n#### Nested sort with filter\n\n```php\nuse Spatie\\ElasticsearchQueryBuilder\\Sorts\\NestedSort;\nuse Spatie\\ElasticsearchQueryBuilder\\Queries\\BoolQuery;\nuse Spatie\\ElasticsearchQueryBuilder\\Queries\\TermQuery;\n\n$builder\n    -\u003eaddSort(\n        NestedSort::create(\n            'books',\n            'books.rating',\n            NestedSort::ASC\n        )-\u003efilter(BoolQuery::create()-\u003eadd(TermQuery::create('books.category', 'comedy'))\n    );\n```\n\n## Retrieve specific fields\n\nThe `fields()` method can be used to request specific fields from the resulting documents without returning the entire `_source` entry. You can read more about the specifics of the fields parameter in [the ElasticSearch docs](https://www.elastic.co/guide/en/elasticsearch/reference/current/search-fields.html).\n\n```php\n$builder-\u003efields('user.id', 'http.*.status');\n```\n\n## Highlighting\n\nThe `highlight()` method can be used to add a highlight section to your query along the rules in [the ElasticSearch docs](https://www.elastic.co/guide/en/elasticsearch/reference/current/highlighting.html).\n\n```php\n$highlightSettings = [\n    'pre_tags' =\u003e ['\u003cem\u003e'],\n    'post_tags' =\u003e ['\u003c/em\u003e'],\n    'fields' =\u003e [\n        '*' =\u003e (object) []\n    ]\n];\n\n$builder-\u003ehighlight($highlightSettings);\n```\n\n## Post filter\n\nThe `addPostFilterQuery()` method can be used to add a post_filter BoolQuery to your query along the rules in [the ElasticSearch docs](https://www.elastic.co/guide/en/elasticsearch/reference/current/filter-search-results.html#post-filter).\n\n```php\nuse Spatie\\ElasticsearchQueryBuilder\\Queries\\TermsQuery;\n\n$builder-\u003eaddPostFilterQuery(TermsQuery::create('user.id', ['flx', 'fly']));\n```\n\n## Pagination\n\nFinally the `Builder` also features a `size()` and `from()` method for the corresponding ElasticSearch search parameters. These can be used to build a paginated search. Take a look the following example to get a rough idea:\n\n```php\nuse Spatie\\ElasticsearchQueryBuilder\\Builder;\n\n$pageSize = 100;\n$pageNumber = $_GET['page'] ?? 1;\n\n$pageResults = (new Builder(Elastic\\Elasticsearch\\ClientBuilder::create()))\n    -\u003esize($pageSize)\n    -\u003efrom(($pageNumber - 1) * $pageSize)\n    -\u003esearch();\n```\n\n## Multi-Search Query Builder\n\nElasticsearch provides a [\"multi-search\" API](https://www.elastic.co/guide/en/elasticsearch/reference/current/search-multi-search.html) that allows for multiple query bodies to be included in a single request.\n\nUse the `MultiBuilder` class and [add builders](#add-builders) to add builders to your query request. The response will include a `responses` array of the query results, in the same order the requests are added. Use the `$multiBuilder-\u003esearch()` to execute the queries, or `$multiBuilder-\u003egetPayload()` for the raw request payload.\n\n```php\nuse Spatie\\ElasticsearchQueryBuilder\\MultiBuilder;\nuse Spatie\\ElasticsearchQueryBuilder\\Builder;\n\n$client = Elastic\\Elasticsearch\\ClientBuilder::create();\n$multiBuilder = (new MultiBuilder($client));\n\n$multiBuilder-\u003eaddBuilder(\n    (new Builder($client))-\u003eindex('custom_index')-\u003esize(10)\n);\n// you can pass the index name to the addBuilder method second param\n$multiBuilder-\u003eaddBuilder(\n    (new Builder($client))-\u003esize(10)\n    'different_index'\n);\n\n$multiResults = $multiBuilder-\u003esearch();\n```\n\nReturns the following response JSON shape:\n\n```\n{\n    \"took\": 2,\n    \"responses\": [\n        {... first query result ...},\n        {... second query result ...},\n    ]\n}\n```\n\n## Testing\n\n```bash\ncomposer test\n```\n\n## Changelog\n\nPlease see [CHANGELOG](CHANGELOG.md) for more information on what has changed recently.\n\n## Contributing\n\nPlease see [CONTRIBUTING](https://github.com/spatie/.github/blob/main/CONTRIBUTING.md) for details.\n\n## Security Vulnerabilities\n\nPlease review [our security policy](../../security/policy) on how to report security vulnerabilities.\n\n## Credits\n\n-   [Alex Vanderbist](https://github.com/alexvanderbist)\n-   [Ruben Van Assche](https://github.com/rubenvanassche)\n-   [All Contributors](../../contributors)\n\n## License\n\nThe MIT License (MIT). Please see [License File](LICENSE.md) for more information.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fspatie%2Felasticsearch-query-builder","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fspatie%2Felasticsearch-query-builder","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fspatie%2Felasticsearch-query-builder/lists"}