Weave Code
Code Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Elasticsearch Laravel Package

pdphilip/elasticsearch

Laravel Eloquent-style ORM for Elasticsearch. Use familiar models and query builder methods to create, update, paginate, delete, and run ES searches: term/phrase, match, fuzzy, geo distance, highlighting, and more—designed to feel native in Laravel.

View on GitHub
Deep Wiki
Context7

Latest Stable Version GitHub Tests Action Status GitHub Code Style Action Status Total Downloads

Laravel-Elasticsearch An Elasticsearch implementation of Laravel's Eloquent ORM

The Power of Elasticsearch with Laravel's Eloquent

This package extends Laravel's Eloquent model and query builder with seamless integration of Elasticsearch functionalities. Designed to feel native to Laravel, this package enables you to work with Eloquent models while leveraging the powerful search and analytics capabilities of Elasticsearch.


The Eloquent you already know:

UserLog::where('created_at','>=',Carbon::now()->subDays(30))->get();
UserLog::create([
    'user_id' => '2936adb0-b10d-11ed-8e03-0b234bda3e12',
    'ip' => '62.182.98.146',
    'location' => [40.7185,-74.0025],
    'country_code' => 'US',
    'status' => 1,
]);
UserLog::where('status', 1)->update(['status' => 4]);
UserLog::where('status', 4)->orderByDesc('created_at')->paginate(50);
UserProfile::whereIn('country_code',['US','CA'])
    ->orderByDesc('last_login')->take(10)->get();
UserProfile::where('state','unsubscribed')
    ->where('updated_at','<=',Carbon::now()->subDays(90))->delete();

Elasticsearch with Eloquent:

UserProfile::searchTerm('Laravel')->orSearchTerm('Elasticsearch')->get();
UserProfile::searchPhrasePrefix('loves espressos and t')->highlight()->get();
UserProfile::whereMatch('bio', 'PHP')->get();
UserLog::whereGeoDistance('location', '10km', [40.7185,-74.0025])->get();
UserProfile::whereFuzzy('description', 'qick brwn fx')->get();

Built in Relationships (even to SQL models):

UserLog::where('status', 1)->orderByDesc('created_at')->with('user')->get();

Read the Documentation

Installation

Maintained versions (Elasticsearch 8.x):

Laravel 11.x, 12.x & 13.x (main):

composer require pdphilip/elasticsearch
Laravel Version Command Maintained
Laravel 11/12/13 composer require pdphilip/elasticsearch:~5.6 ✅ Active
Laravel 10/11/12 composer require pdphilip/elasticsearch:~5.5 🛠️ LTS
Laravel 10/11 (v4) composer require pdphilip/elasticsearch:~4 🛠️ LTS
Laravel 9 composer require pdphilip/elasticsearch:~3.9 🛠️ LTS
Laravel 8 composer require pdphilip/elasticsearch:~3.8 🛠️ LTS

Unmaintained versions (Elasticsearch 8.x):

Laravel Version Command Maintained
Laravel 7.x composer require pdphilip/elasticsearch:~2.7 ❌ EOL
Laravel 6.x (5.8) composer require pdphilip/elasticsearch:~2.6 ❌ EOL

Unmaintained versions (Elasticsearch 7.x):

Laravel Version Command Maintained
Laravel 9.x composer require pdphilip/elasticsearch:~1.9 ❌ EOL
Laravel 8.x composer require pdphilip/elasticsearch:~1.8 ❌ EOL
Laravel 7.x composer require pdphilip/elasticsearch:~1.7 ❌ EOL
Laravel 6.x (5.8) composer require pdphilip/elasticsearch:~1.6 ❌ EOL

Configuration

  1. Set up your .env with the following Elasticsearch settings:
ES_AUTH_TYPE=http
ES_HOSTS="http://localhost:9200"
ES_USERNAME=
ES_PASSWORD=
ES_CLOUD_ID=
ES_API_ID=
ES_API_KEY=
ES_SSL_CA=
ES_INDEX_PREFIX=my_app_
# prefix will be added to all indexes created by the package with an underscore
# ex: my_app_user_logs for UserLog model
ES_SSL_CERT=
ES_SSL_CERT_PASSWORD=
ES_SSL_KEY=
ES_SSL_KEY_PASSWORD=
# Options
ES_OPT_ID_SORTABLE=false
ES_OPT_VERIFY_SSL=true
ES_OPT_RETRIES=
ES_OPT_META_HEADERS=true
ES_ERROR_INDEX=
ES_OPT_BYPASS_MAP_VALIDATION=false
ES_OPT_DEFAULT_LIMIT=1000

For multiple nodes, pass in as comma-separated:

ES_HOSTS="http://es01:9200,http://es02:9200,http://es03:9200"
ES_AUTH_TYPE=cloud
ES_HOSTS="https://xxxxx-xxxxxx.es.europe-west1.gcp.cloud.es.io:9243"
ES_USERNAME=elastic
ES_PASSWORD=XXXXXXXXXXXXXXXXXXXX
ES_CLOUD_ID=XXXXX:ZXVyb3BlLXdl.........SQwYzM1YzU5ODI5MTE0NjQ3YmEyNDZlYWUzOGNkN2Q1Yg==
ES_API_ID=
ES_API_KEY=
ES_SSL_CA=
ES_INDEX_PREFIX=my_app_
ES_ERROR_INDEX=
  1. In config/database.php, add the elasticsearch connection:
'elasticsearch' => [
    'driver' => 'elasticsearch',
    'auth_type' => env('ES_AUTH_TYPE', 'http'), //http or cloud
    'hosts' => explode(',', env('ES_HOSTS', 'http://localhost:9200')),
    'username' => env('ES_USERNAME', ''),
    'password' => env('ES_PASSWORD', ''),
    'cloud_id' => env('ES_CLOUD_ID', ''),
    'api_id' => env('ES_API_ID', ''),
    'api_key' => env('ES_API_KEY', ''),
    'ssl_cert' => env('ES_SSL_CA', ''),
    'ssl' => [
        'cert' => env('ES_SSL_CERT', ''),
        'cert_password' => env('ES_SSL_CERT_PASSWORD', ''),
        'key' => env('ES_SSL_KEY', ''),
        'key_password' => env('ES_SSL_KEY_PASSWORD', ''),
    ],
    'index_prefix' => env('ES_INDEX_PREFIX', false),
    'options' => [
        'bypass_map_validation' => env('ES_OPT_BYPASS_MAP_VALIDATION', false),
        'logging' => env('ES_OPT_LOGGING', false),
        'ssl_verification' => env('ES_OPT_VERIFY_SSL', true),
        'retires' => env('ES_OPT_RETRIES', null),
        'meta_header' => env('ES_OPT_META_HEADERS', true),
        'default_limit' => env('ES_OPT_DEFAULT_LIMIT', 1000),
        'allow_id_sort' => env('ES_OPT_ID_SORTABLE', false),
    ],
],

3. If packages are not autoloaded, add the service provider:

For Laravel 11 +:

//bootstrap/providers.php
<?php
return [
    App\Providers\AppServiceProvider::class,
    PDPhilip\Elasticsearch\ElasticServiceProvider::class,
];

For Laravel 10 and below:

//config/app.php
'providers' => [
    ...
    ...
    PDPhilip\Elasticsearch\ElasticServiceProvider::class,
    ...

Now, you're all set to use Elasticsearch with Laravel as if it were native to the framework.


Documentation Links

Getting Started

Eloquent

Relationships

Migrations: Schema/Index

Misc

Credits

License

The MIT License (MIT). Please see License File for more information.

Looking to use Elasticsearch for full-text search of your SQL models?

Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
davejamesmiller/laravel-breadcrumbs
artisanry/parsedown
christhompsontldr/phpsdk
enqueue/dsn
bunny/bunny
enqueue/test
enqueue/null
enqueue/amqp-tools
bower-asset/punycode
bower-asset/inputmask
bower-asset/jquery
bower-asset/yii2-pjax
laravel/nova
spatie/laravel-mailcoach
spatie/laravel-superseeder
laravel/liferaft
nst/json-test-suite
danielmiessler/sec-lists
jackalope/jackalope-transport
twbs/bootstrap4