{"id":13563694,"url":"https://github.com/babenkoivan/scout-elasticsearch-driver","last_synced_at":"2025-09-28T20:31:49.938Z","repository":{"id":40533474,"uuid":"83650803","full_name":"babenkoivan/scout-elasticsearch-driver","owner":"babenkoivan","description":"This package offers advanced functionality for searching and filtering data in Elasticsearch.","archived":true,"fork":false,"pushed_at":"2021-09-02T08:03:10.000Z","size":356,"stargazers_count":1168,"open_issues_count":141,"forks_count":307,"subscribers_count":32,"default_branch":"master","last_synced_at":"2024-04-04T09:45:06.408Z","etag":null,"topics":["elastic","elasticsearch","laravel","scout"],"latest_commit_sha":null,"homepage":"","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/babenkoivan.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2017-03-02T07:57:58.000Z","updated_at":"2024-03-19T10:31:56.000Z","dependencies_parsed_at":"2022-06-29T21:29:42.219Z","dependency_job_id":null,"html_url":"https://github.com/babenkoivan/scout-elasticsearch-driver","commit_stats":null,"previous_names":[],"tags_count":55,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/babenkoivan%2Fscout-elasticsearch-driver","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/babenkoivan%2Fscout-elasticsearch-driver/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/babenkoivan%2Fscout-elasticsearch-driver/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/babenkoivan%2Fscout-elasticsearch-driver/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/babenkoivan","download_url":"https://codeload.github.com/babenkoivan/scout-elasticsearch-driver/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":234563123,"owners_count":18853056,"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":["elastic","elasticsearch","laravel","scout"],"created_at":"2024-08-01T13:01:22.326Z","updated_at":"2025-09-28T20:31:49.651Z","avatar_url":"https://github.com/babenkoivan.png","language":"PHP","funding_links":["https://www.paypal.me/babenkoi"],"categories":["PHP"],"sub_categories":[],"readme":"# Scout Elasticsearch Driver   \n\n💥 **Introducing [a new Elasticsearch ecosystem for Laravel](#alternatives).** 💥 \n\n---\n\n[![Packagist](https://img.shields.io/packagist/v/babenkoivan/scout-elasticsearch-driver.svg)](https://packagist.org/packages/babenkoivan/scout-elasticsearch-driver)\n[![Packagist](https://img.shields.io/packagist/dt/babenkoivan/scout-elasticsearch-driver.svg)](https://packagist.org/packages/babenkoivan/scout-elasticsearch-driver)\n[![Build Status](https://travis-ci.com/babenkoivan/scout-elasticsearch-driver.svg?branch=master)](https://travis-ci.com/babenkoivan/scout-elasticsearch-driver)\n[![Donate](https://img.shields.io/badge/donate-PayPal-blue.svg)](https://www.paypal.me/babenkoi)\n\n---\n\nThis package offers advanced functionality for searching and filtering data in Elasticsearch.\nCheck out its [features](#features)!\n\n## Contents\n\n* [Features](#features)\n* [Requirements](#requirements)\n* [Installation](#installation)\n* [Configuration](#configuration)\n* [Index configurator](#index-configurator)\n* [Searchable model](#searchable-model)\n* [Usage](#usage)\n* [Console commands](#console-commands)\n* [Search rules](#search-rules)\n* [Available filters](#available-filters)\n* [Zero downtime migration](#zero-downtime-migration)\n* [Debug](#debug)\n* [Alternatives](#alternatives)\n\n## Features\n\n* An easy way to [configure](#index-configurator) and [create](#console-commands) an Elasticsearch index.\n* A fully configurable mapping for each [model](#searchable-model).\n* A possibility to add a new field to an existing mapping [automatically](#configuration) or using [the artisan command](#console-commands).\n* Lots of different ways to implement your search algorithm: using [search rules](#search-rules) or a [raw search](#usage).\n* [Various filter types](#available-filters) to make a search query more specific.\n* [Zero downtime migration](#zero-downtime-migration) from an old index to a new index.\n* Bulk indexing, see [the configuration section](#configuration).\n\n## Requirements\n\nThe package has been tested in the following configuration: \n\n* PHP version \u0026gt;=7.1.3, \u0026lt;=7.3\n* Laravel Framework version \u0026gt;=5.8, \u0026lt;=6\n* Elasticsearch version \u0026gt;=7\n\n## Installation\n\nUse composer to install the package:\n\n```\ncomposer require babenkoivan/scout-elasticsearch-driver\n```\n\nIf you are using Laravel version \u0026lt;= 5.4 or [the package discovery](https://laravel.com/docs/5.5/packages#package-discovery)\nis disabled, add the following providers in `config/app.php`:\n\n```php\n'providers' =\u003e [\n    Laravel\\Scout\\ScoutServiceProvider::class,\n    ScoutElastic\\ScoutElasticServiceProvider::class,\n]\n``` \n\n## Configuration\n\nTo configure the package you need to publish settings first:\n\n```\nphp artisan vendor:publish --provider=\"Laravel\\Scout\\ScoutServiceProvider\"\nphp artisan vendor:publish --provider=\"ScoutElastic\\ScoutElasticServiceProvider\"\n```\n\nThen, set the driver setting to `elastic` in the `config/scout.php` file (or set `SCOUT_DRIVER=elastic` in the `.env`) and configure the driver itself in the `config/scout_elastic.php` file.\nThe available options are:\n\nOption | Description\n--- | ---\nclient | A setting hash to build Elasticsearch client. More information you can find [here](https://www.elastic.co/guide/en/elasticsearch/client/php-api/current/configuration.html#_building_the_client_from_a_configuration_hash). By default the host is set to `localhost:9200`.\nupdate_mapping | The option that specifies whether to update a mapping automatically or not. By default it is set to `true`.\nindexer | Set to `single` for the single document indexing and to `bulk` for the bulk document indexing. By default is set to `single`.\ndocument_refresh | This option controls when updated documents appear in the search results. Can be set to `'true'`, `'false'`, `'wait_for'` or `null`. More details about this option you can find [here](https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-refresh.html). By default set to `null`.\n\nNote, that if you use the bulk document indexing you'll probably want to change the chunk size, you can do that in the `config/scout.php` file.\n\n## Index configurator\n\nAn index configurator class is used to set up settings for an Elasticsearch index.\nTo create a new index configurator use the following artisan command:\n\n```\nphp artisan make:index-configurator MyIndexConfigurator\n```\n\nIt'll create the file `MyIndexConfigurator.php` in the `app` folder of your project. \nYou can specify index name and settings like in the following example:\n\n```php\n\u003c?php\n\nnamespace App;\n\nuse ScoutElastic\\IndexConfigurator;\n\nclass MyIndexConfigurator extends IndexConfigurator\n{\n    // It's not obligatory to determine name. By default it'll be a snaked class name without `IndexConfigurator` part.\n    protected $name = 'my_index';  \n    \n    // You can specify any settings you want, for example, analyzers. \n    protected $settings = [\n        'analysis' =\u003e [\n            'analyzer' =\u003e [\n                'es_std' =\u003e [\n                    'type' =\u003e 'standard',\n                    'stopwords' =\u003e '_spanish_'\n                ]\n            ]    \n        ]\n    ];\n}\n```\n\nMore about index settings you can find in the [index management section](https://www.elastic.co/guide/en/elasticsearch/guide/current/index-management.html) of Elasticsearch documentation.\n\nTo create an index just run the artisan command:\n \n```\nphp artisan elastic:create-index \"App\\MyIndexConfigurator\"\n```\n\nNote, that every searchable model requires its own index configurator.\n\n\u003e Indices created in Elasticsearch 6.0.0 or later may only contain a single mapping type. Indices created in 5.x with multiple mapping types will continue to function as before in Elasticsearch 6.x. Mapping types will be completely removed in Elasticsearch 7.0.0.\n\nYou can find more information [here](https://www.elastic.co/guide/en/elasticsearch/reference/6.x/removal-of-types.html).\n\n## Searchable model\n\nTo create a model with the ability to perform search requests in an Elasticsearch index use the command:\n\n```\nphp artisan make:searchable-model MyModel --index-configurator=MyIndexConfigurator\n``` \n\nAfter executing the command you'll find the file `MyModel.php` in you `app` folder:\n\n```php\n\u003c?php\n\nnamespace App;\n\nuse ScoutElastic\\Searchable;\nuse Illuminate\\Database\\Eloquent\\Model;\n\nclass MyModel extends Model\n{\n    use Searchable;\n\n    protected $indexConfigurator = MyIndexConfigurator::class;\n\n    protected $searchRules = [\n        //\n    ];\n\n    // Here you can specify a mapping for model fields\n    protected $mapping = [\n        'properties' =\u003e [\n            'title' =\u003e [\n                'type' =\u003e 'text',\n                // Also you can configure multi-fields, more details you can find here https://www.elastic.co/guide/en/elasticsearch/reference/current/multi-fields.html\n                'fields' =\u003e [\n                    'raw' =\u003e [\n                        'type' =\u003e 'keyword',\n                    ]\n                ]\n            ],\n        ]\n    ];\n}\n```\n\nEach searchable model represents an Elasticsearch type.\nBy default a type name is the same as a table name, but you can set any type name you want through the `searchableAs` method.\nYou can also specify fields which will be indexed by the driver through the `toSearchableArray` method.\nMore information about these options you will find in [the scout official documentation](https://laravel.com/docs/5.5/scout#configuration).\n\nThe last important option you can set in the `MyModel` class is the `$searchRules` property. \nIt allows you to set different search algorithms for a model. \nWe'll take a closer look at it in [the search rules section](#search-rules).\n\nAfter setting up a mapping in your model you can update an Elasticsearch type mapping:\n\n```\nphp artisan elastic:update-mapping \"App\\MyModel\"\n```\n\n## Usage\n\nOnce you've created an index configurator, an Elasticsearch index itself and a searchable model, you are ready to go.\nNow you can [index](https://laravel.com/docs/5.5/scout#indexing) and [search](https://laravel.com/docs/5.5/scout#searching) data according to the documentation.\n\nBasic search usage example:\n\n```php\n// set query string\nApp\\MyModel::search('phone')\n    // specify columns to select\n    -\u003eselect(['title', 'price'])\n    // filter \n    -\u003ewhere('color', 'red')\n    // sort\n    -\u003eorderBy('price', 'asc')\n    // collapse by field\n    -\u003ecollapse('brand')\n    // set offset\n    -\u003efrom(0)\n    // set limit\n    -\u003etake(10)\n    // get results\n    -\u003eget();\n```\n\nIf you only need the number of matches for a query, use the `count` method:\n\n```php\nApp\\MyModel::search('phone') \n    -\u003ecount();\n```\n\nIf you need to load relations, use the `with` method:\n\n```php\nApp\\MyModel::search('phone') \n    -\u003ewith('makers')\n    -\u003eget();\n```\n\nIn addition to standard functionality the package offers you the possibility to filter data in Elasticsearch without specifying a query string:\n  \n```php\nApp\\MyModel::search('*')\n    -\u003ewhere('id', 1)\n    -\u003eget();\n```\n\nAlso you can override model [search rules](#search-rules):\n\n```php\nApp\\MyModel::search('Brazil')\n    -\u003erule(App\\MySearchRule::class)\n    -\u003eget();\n```\n\nAnd use [variety](#available-filters) of `where` conditions: \n\n```php\nApp\\MyModel::search('*')\n    -\u003ewhereRegexp('name.raw', 'A.+')\n    -\u003ewhere('age', '\u003e=', 30)\n    -\u003ewhereExists('unemployed')\n    -\u003eget();\n```\n\nAnd filter out results with a score less than [min_score](https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-body.html#request-body-search-min-score): \n\n```php\nApp\\MyModel::search('sales')\n    -\u003eminScore(1.0)\n    -\u003eget();\n```\n\nAnd add more complex sorting (geo_distance eg.)\n\n```php\n$model = App\\MyModel::search('sales')\n    -\u003eorderRaw([\n       '_geo_distance' =\u003e  [\n           'coordinates' =\u003e [\n               'lat'   =\u003e  51.507351,\n               'lon'   =\u003e  -0.127758\n           ],\n           'order'     =\u003e  'asc',\n           'unit'      =\u003e  'm'\n       ]\n    ])\n    -\u003eget();\n\n// To retrieve sort result, use model `sortPayload` attribute:\n$model-\u003esortPayload;\n```\n\n\n\nAt last, if you want to send a custom request, you can use the `searchRaw` method:\n\n```php\nApp\\MyModel::searchRaw([\n    'query' =\u003e [\n        'bool' =\u003e [\n            'must' =\u003e [\n                'match' =\u003e [\n                    '_all' =\u003e 'Brazil'\n                ]\n            ]\n        ]\n    ]\n]);\n```\n\nThis query will return raw response.\n\n## Console commands\n\nAvailable artisan commands are listed below:\n\nCommand | Arguments | Description\n--- | --- | ---\nmake:index-configurator | `name` - The name of the class | Creates a new Elasticsearch index configurator.\nmake:searchable-model | `name` - The name of the class | Creates a new searchable model.\nmake:search-rule | `name` - The name of the class | Creates a new search rule.\nelastic:create-index | `index-configurator` - The index configurator class | Creates an Elasticsearch index.\nelastic:update-index | `index-configurator` - The index configurator class | Updates settings and mappings of an Elasticsearch index.\nelastic:drop-index | `index-configurator` - The index configurator class | Drops an Elasticsearch index.\nelastic:update-mapping | `model` - The model class | Updates a model mapping.\nelastic:migrate-model | `model` - The model class, `target-index` - The index name to migrate | Migrates model to another index.\n\nFor detailed description and all available options run `php artisan help [command]` in the command line.\n\n## Search rules\n\nA search rule is a class that describes how a search query will be executed. \nTo create a search rule use the command:\n\n```\nphp artisan make:search-rule MySearchRule\n```\n\nIn the file `app/MySearchRule.php` you will find a class definition:\n\n```php\n\u003c?php\n\nnamespace App;\n\nuse ScoutElastic\\SearchRule;\n\nclass MySearch extends SearchRule\n{\n    // This method returns an array, describes how to highlight the results.\n    // If null is returned, no highlighting will be used. \n    public function buildHighlightPayload()\n    {\n        return [\n            'fields' =\u003e [\n                'name' =\u003e [\n                    'type' =\u003e 'plain'\n                ]\n            ]\n        ];\n    }\n    \n    // This method returns an array, that represents bool query.\n    public function buildQueryPayload()\n    {\n        return [\n            'must' =\u003e [\n                'match' =\u003e [\n                    'name' =\u003e $this-\u003ebuilder-\u003equery\n                ]\n            ]\n        ];\n    }\n}\n```\n\nYou can read more about bool queries [here](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html) \nand about highlighting [here](https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-body.html#request-body-search-highlighting).\n\nThe default search rule returns the following payload:\n\n```php\nreturn [\n   'must' =\u003e [\n       'query_string' =\u003e [\n           'query' =\u003e $this-\u003ebuilder-\u003equery\n       ]\n   ]\n];\n```\n\nThis means that by default when you call `search` method on a model it tries to find the query string in any field.\n\nTo determine default search rules for a model just add a property:\n\n```php\n\u003c?php\n\nnamespace App;\n\nuse ScoutElastic\\Searchable;\nuse Illuminate\\Database\\Eloquent\\Model;\n\nclass MyModel extends Model\n{\n    use Searchable;\n    \n    // You can set several rules for one model. In this case, the first not empty result will be returned.\n    protected $searchRules = [\n        MySearchRule::class\n    ];\n}\n```\n\nYou can also set a search rule in a query builder:\n\n```php\n// You can set either a SearchRule class\nApp\\MyModel::search('Brazil')\n    -\u003erule(App\\MySearchRule::class)\n    -\u003eget();\n    \n// or a callable\nApp\\MyModel::search('Brazil')\n    -\u003erule(function($builder) {\n        return [\n            'must' =\u003e [\n                'match' =\u003e [\n                    'Country' =\u003e $builder-\u003equery\n                ]\n            ]\n        ];\n    })\n    -\u003eget();\n```\n\nTo retrieve highlight, use model `highlight` attribute:\n\n```php\n// Let's say we highlight field `name` of `MyModel`.\n$model = App\\MyModel::search('Brazil')\n    -\u003erule(App\\MySearchRule::class)\n    -\u003efirst();\n\n// Now you can get raw highlighted value:\n$model-\u003ehighlight-\u003ename;\n\n// or string value:\n $model-\u003ehighlight-\u003enameAsString;\n```\n\n## Available filters\n\nYou can use different types of filters:\n\nMethod | Example | Description\n--- | --- | ---\nwhere($field, $value) | where('id', 1) | Checks equality to a simple value.\nwhere($field, $operator, $value) | where('id', '\u003e=', 1) | Filters records according to a given rule. Available operators are: =, \u003c, \u003e, \u003c=, \u003e=, \u003c\u003e.    \nwhereIn($field, $value) | whereIn('id', [1, 2, 3]) | Checks if a value is in a set of values. \nwhereNotIn($field, $value) | whereNotIn('id', [1, 2, 3]) | Checks if a value isn't in a set of values. \nwhereBetween($field, $value) | whereBetween('price', [100, 200]) | Checks if a value is in a range.\nwhereNotBetween($field, $value) | whereNotBetween('price', [100, 200]) | Checks if a value isn't in a range.\nwhereExists($field) | whereExists('unemployed') | Checks if a value is defined.\nwhereNotExists($field) | whereNotExists('unemployed') | Checks if a value isn't defined.  \nwhereMatch($field, $value) | whereMatch('tags', 'travel') | Filters records matching exact value. [Here](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-match-query.html) you can find more about syntax.\nwhereNotMatch($field, $value) | whereNotMatch('tags', 'travel') | Filters records not matching exact value. [Here](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-match-query.html) you can find more about syntax.\nwhereRegexp($field, $value, $flags = 'ALL') | whereRegexp('name.raw', 'A.+') | Filters records according to a given regular expression. [Here](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-regexp-query.html#regexp-syntax) you can find more about syntax.\nwhereGeoDistance($field, $value, $distance) | whereGeoDistance('location', [-70, 40], '1000m') | Filters records according to given point and distance from it. [Here](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-geo-distance-query.html) you can find more about syntax.\nwhereGeoBoundingBox($field, array $value) | whereGeoBoundingBox('location', ['top_left' =\u003e  [-74.1, 40.73], 'bottom_right' =\u003e [-71.12, 40.01]]) | Filters records within given boundings. [Here](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-geo-bounding-box-query.html) you can find more about syntax.\nwhereGeoPolygon($field, array $points) | whereGeoPolygon('location', [[-70, 40],[-80, 30],[-90, 20]]) | Filters records within given polygon. [Here](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-geo-polygon-query.html) you can find more about syntax.\nwhereGeoShape($field, array $shape, $relation = 'INTERSECTS') | whereGeoShape('shape', ['type' =\u003e 'circle', 'radius' =\u003e '1km', 'coordinates' =\u003e [4, 52]], 'WITHIN') | Filters records within given shape. [Here](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-geo-shape-query.html) you can find more about syntax.\n\nIn most cases it's better to use raw fields to filter records, i.e. not analyzed fields.\n\n## Zero downtime migration\n\nAs you might know, you can't change the type of already created field in Elasticsearch. \nThe only choice in such case is to create a new index with necessary mapping and import your models into the new index.      \nA migration can take quite a long time, so to avoid downtime during the process the driver reads from the old index and writes to the new one.\nAs soon as migration is over it starts reading from the new index and removes the old index.\nThis is how the artisan `elastic:migrate-model` command works.  \n\nBefore you run the command, make sure that your index configurator uses the `ScoutElastic\\Migratable` trait.\nIf it's not, add the trait and run the artisan `elastic:update-index` command using your index configurator class name as an argument:\n\n```\nphp artisan elastic:update-index \"App\\MyIndexConfigurator\"\n```\n\nWhen you are ready, make changes in the model mapping and run the `elastic:migrate-model` command using the model class as the first argument and desired index name as the second argument:\n\n```\nphp artisan elastic:migrate-model \"App\\MyModel\" my_index_v2\n``` \n\nNote, that if you need just to add new fields in your mapping, use the `elastic:update-mapping` command.\n\n## Debug\n\nThere are two methods that can help you to analyze results of a search query:\n\n* [explain](https://www.elastic.co/guide/en/elasticsearch/reference/current/search-explain.html)\n \n    ```php\n    App\\MyModel::search('Brazil')\n        -\u003eexplain();\n    ```\n    \n* [profile](https://www.elastic.co/guide/en/elasticsearch/reference/current/search-profile.html)\n\n    ```php\n    App\\MyModel::search('Brazil')\n        -\u003eprofile();\n    ```\n    \nBoth methods return raw data from ES.\n\nBesides, you can get a query payload that will be sent to ES, by calling the `buildPayload` method.\n\n```php\nApp\\MyModel::search('Brazil')\n    -\u003ebuildPayload();\n```\n\nNote, that this method returns a collection of payloads, because of possibility of using multiple search rules in one query. \n\n## Alternatives\n\nRecently I've released a new Elasticsearch ecosystem for Laravel, it includes:\n\n* [Elastic Scout Driver](https://github.com/babenkoivan/elastic-scout-driver) - a generic Elasticsearch driver for Laravel Scout.\nIt's perfect, if you need to build a simple search in your Laravel application. \n* [Elastic Scout Driver Plus](https://github.com/babenkoivan/elastic-scout-driver-plus) - an extension for Elastic Scout Driver.\nIf you want to take advantage of such Elasticsearch features as bool queries, highlighting, etc., it's a way to go.\n* [Elastic Migrations](https://github.com/babenkoivan/elastic-migrations) - an easy way to create, delete or update \nElasticsearch index schema and share it with your teammates. It has quite similar interface to Laravel database migrations.\n\nIf any of it sounds interesting to you and you want to get more details, please read \n[The Ultimate Guide to Elasticsearch in Laravel Application](https://itnext.io/the-ultimate-guide-to-elasticsearch-in-laravel-application-ee636b79419c). \nThe article makes a good overview of the mentioned packages and provides usage examples.\n\nFAQ:\n* Why did you create a new package instead of a new `scout-elasticsearch-driver` version? - I didn't want to create another \nall in one package for obvious reasons: no separation of concerns, not compatible with other Scout drivers, hard to test\nand develop, etc. As Elastic Scout Driver is a generic driver and doesn't implement all the `scout-elasticsearch-driver` \nfeatures, it would be wrong to call it a new `scout-elasticsearch-driver` version.   \n* What does it mean for scout-elasticsearch-driver? - Well, it's maintained by the community at the moment \n(thank you @iget-esoares and @lucamichot for keeping the project alive 🎉). I hope they will continue contributing to the \nproject and bring a new version of `scout-elasticsearch-driver` in the future.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbabenkoivan%2Fscout-elasticsearch-driver","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbabenkoivan%2Fscout-elasticsearch-driver","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbabenkoivan%2Fscout-elasticsearch-driver/lists"}