fareselshinawy/elastic-search

elastic-search package provides a seamless integeration of elastic search into laravel appications, desinged to simplify search and indexing functionalities. It offers an easy-to-use interface for managing elastic search queries, along with full support for multi tenant and standard projects.

v1.0.0 2024-10-26 09:17 UTC

This package is auto-updated.

Last update: 2025-05-26 17:53:27 UTC


README

The package provides seamless integration with Elasticsearch, supporting multi-tenant architecture and offering an intuitive query builder interface.

Features

  • Easy integration with Laravel models
  • Built-in multi-tenant support using stancl/tenancy
  • Fluent query builder interface
  • Automated index management
  • Configurable schema mappings
  • Relationship syncing support
  • Artisan commands for index management

Installation

You can install the package via composer:

composer require fareselshinawy/elasticsearch

If you plan to use multi-tenant features: multi tenant can be extend to other packages be making your own tenant adapter implementing TenantAdapterInterface

composer require stancl/tenancy

Configuration

Publish the configuration file:

php artisan vendor:publish --provider="Fareselshinawy\ElasticSearch\Providers\ElasticSearchServiceProvider"

Configure your Elasticsearch credentials in your .env file:

ELASTIC_API_ENDPOINT=your-elasticsearch-endpoint
ELASTIC_API_KEY=your-api-key
ELASTIC_INDEX_PREFIX=optional-prefix
ELASTIC_DEFAULT_SIZE_VARIABLE=10
ELASTIC_INDEX_SYNC_CHUNK_SIZE=500
ENABLE_ELASTIC_FOR_TENANTS=true

Usage

Model Setup

To make your model searchable with Elasticsearch, add the following methods to your model:

use Fareselshinawy\ElasticSearch\Traits\ElasticSearchable;

class User extends Model
{
    use ElasticSearchable;

    // Required: Define the data to be synchronized with Elasticsearch
    public function getElasticSearchSyncAbleData()
    {
        return [
            "name"  => Str::lower($this->name),
            "email" => $this->email,
            "id"    => $this->id
        ];
    }

    // Optional: Define custom index mappings
    public function getIndexableProperties()
    {
        return [
            "name"  => ['type' => 'keyword'],
            "email" => ['type' => 'keyword'],
            "id"    => ['type' => 'integer']
        ];
    }

    // Optional: Define relations to sync as example department:id,name..etc
    public $elasticSyncAbleRelations = [];

    // Optional: Define dependent indexes that should be updated ( relation => class ) users => User::class
    public $dependentIndexesRelations = [];

    // Optional: Custom index name
    public function getElasticIndexKey()
    {
        return $this->indexPrefix() . 'users';
    }
}

Query Builder Usage

The package provides a fluent interface for building Elasticsearch queries:

// Basic queries
User::elasticWhere('name', 'John')
    ->elasticOrWhere('email', 'john@example.com')
    ->elasticGet();

// Wildcard searches
User::elasticWhereLike('name', 'jo')
    ->elasticWhereStartWith('email', 'john')
    ->elasticGet();

// Range queries
User::elasticRange('age', 18, 30)->elasticGet();

// Term queries
User::elasticTermMust('status', 'active')
    ->elasticTermMustNot('role', 'guest')
    ->elasticGet();

// Match queries
User::elasticWhereMatch('description', 'search text')
    ->elasticWhereMatchPhrase('title', 'exact phrase')
    ->elasticGet();

// Nested queries
User::elasticNested('orders', function($query) {
    $query->elasticWhere('status', 'completed');
})->elasticGet();

// Sorting
User::elasticSortBy('created_at', 'desc')->elasticGet();

// Pagination
User::elasticWhere('status', 'active')->elasticPaginate(15);

Available Query Methods

Term Queries

  • elasticTerm(field, value, conditionType = 'must')
  • elasticTermMust(field, value)
  • elasticTermMustNot(field, value)
  • elasticTermShould(field, value)

Terms Queries (Arrays)

  • elasticTerms(field, values, conditionType = 'must')
  • elasticTermMustIn(field, values)
  • elasticTermMustNotIn(field, values)
  • elasticTermShouldIn(field, values)

Match Queries

  • elasticMatch(field, value, conditionType = 'must')
  • elasticWhereMatch(field, value)
  • elasticOrWhereMatch(field, value)
  • elasticMatchMustNot(field, value)

Wildcard Queries

  • elasticWildcard(field, value)
  • elasticWildcardLike(field, value)
  • elasticWildcardStartWith(field, value)
  • elasticWildcardEndWith(field, value)

Range Queries

  • elasticRange(field, from, to)
  • elasticGreaterOrEqual(field, value)
  • elasticLessOrEqual(field, value)

Artisan Commands

The package provides several Artisan commands for index management:

Standard Commands

php artisan elastic:index-create        # Create index
php artisan elastic:index-delete        # Delete index
php artisan elastic:index-sync          # Sync data
php artisan elastic:index-update        # Update index

Multi-tenant Commands

php artisan elastic:tenants-index-create  # Create tenant index
php artisan elastic:tenants-index-delete  # Delete tenant index
php artisan elastic:tenants-index-sync    # Sync tenant data
php artisan elastic:tenants-index-update  # Update tenant index

For tenant-specific operations, use the --tenantReference flag:

php artisan elastic:tenants-index-sync --tenantReference=tenant1

Multi-tenant Support

The package integrates with stancl/tenancy for multi-tenant support. Configure tenant-specific settings in the config file:

'enable_elastic_for_tenants' => true,
'tenants_indexable' => [
    'user' => new App\Models\User
],
'tenant_model' => 'App\Models\Tenant',
'tenancy_facade' => 'Stancl\Tenancy\Facades\Tenancy',

Security

If you discover any security-related issues, please email [faresleshinawy560@gmail.com] instead of using the issue tracker.

Credits

  • [Fares Ashraf Ibrahim Elshinawy]

License

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