Laravel 9 Elasticsearch Integration From Scratch With Example
In this article, we will discuss how to integrate Elasticsearch from scratch with example in laravel 9.
Elasticsearch is a real-time distributed and multitenant-capable full-text search engine. it provides an HTTP web interface and JSON documents.
Overview
Step 1: Install Elasticsearch
Step 2: Create Table using migration
Step 3: Install Package
Step 4: Add providers and aliases
Step 5: Create Route
Step 6: Create a Model and Controller
Step 7: Create Blade Files
Step 8: Run Our Laravel Application
Step 1: Install Elasticsearch
We are going to install Elasticsearch in our system, If you haven’t downloaded elastic search then you can follow here.
Step 2: Create Table using migration
Now, We need to create a migration. so we will below command using create the student’s table migration.
1 | php artisan make:migration create_students_table --create=students |
After complete migration. we need below changes in the database/migrations/create_students_table file.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | <?php use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreateStudentsTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('students', function (Blueprint $table) { $table->bigIncrements('id'); $table->string('first_name'); $table->string('last_name'); $table->text('address'); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('students'); } } ?> |
Run the below command. after the changes above file.
1 | php artisan migrate |
Step 3: Install Package
Now, We will install “elasticquent/elasticquent” package. so first open the composer.json file and add the below line.
1 | "elasticquent/elasticquent": "dev-master" |
Step 5: Add providers and aliases
We will add below providers and aliases in the “config/app.php” file.
1 2 3 4 5 6 7 8 | 'providers' => [ .... Elasticquent\ElasticquentServiceProvider::class, ], 'aliases' => [ .... 'Es' => Elasticquent\ElasticquentElasticsearchFacade::class, ] |
Now, We will generate a configuration file for elastic search using the following command.
1 | php artisan vendor:publish --provider="Elasticquent\ElasticquentServiceProvider" |
Step 6: Create Route
Add the following route code in the “routes/web.php” file.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <?php use App\Http\Controllers\StudentController; /* |-------------------------------------------------------------------------- | Web Routes |-------------------------------------------------------------------------- | | Here is where you can register web routes for your application. These | routes are loaded by the RouteServiceProvider within a group which | contains the "web" middleware group. Now create something great! | */ Route::get('/', function () { // return view('welcome'); }); Route::get('studentSearch',[StudentController::class, 'index']); Route::post('studentSearchCreate',[StudentController::class, 'create']); ?> |
Step 7: Create a Model and Controller
Here below command help to create the controller and model.
1 2 | php artisan make:controller StudentController php artisan make:model Student |
Student.php
1 2 3 4 5 6 7 8 9 10 11 12 | <?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Student extends Model { use HasFactory; protected $fillable = [ 'first_name','last_name', 'address' ]; } ?> |
StudentController.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | <?php namespace App\Http\Controllers; use App\Models\Student; use Illuminate\Http\Request; use Response; class StudentController extends Controller { /** * Display a listing of the resource. * * @return \Illuminate\Http\Response */ public function index(Request $request) { if($request->has('search')){ $students= Student::search($request->input('search'))->toArray(); } return view('student-search',compact('students')); } /** * create student. * * @return \Illuminate\Http\Response */ public function create(Request $request) { $this->validate($request, [ 'first_name' => 'required', 'last_name' => 'required', 'address' => 'required', ]); $student= Student::create($request->all()); $student->addToIndex(); return redirect()->back(); } } ?> |
Step 8: Create Blade Files
Finally, We will create a student-search file in the “resources/views/” folder directory and paste the below code.
student-search.blade.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 | @extends('layouts.app') @section('content') <div class="row"> <div class="col-md-8 col-md-offset-2"> <h1 class="text-primary" style="text-align: center;">Laravel 9 Elasticsearch integration from scratch with example</h1> </div> </div> <div class="container"> <div class="panel panel-primary"> <div class="panel-heading"> <div class="row"> <div class="col-lg-6"> {{ Form::open(array('method'=>'get','class'=>'')) }} <div class="input-group"> <input name="search" value="{{ old('search') }}" type="text" class="form-control" placeholder="Search for..."> <span class="input-group-btn"> <button class="btn btn-default" type="submit">Go!</button> </span> </div><!-- /input-group --> {{ Form::close() }} </div><!-- /.col-lg-6 --> </div><!-- /.row --> </div> <div class="panel-body"> <div class="row"> <div class="col-lg-6"> @if(!empty($students)) @foreach($students as $key => $value) <h3 class="text-danger">{{ $value['first_name'] }}</h3> <p>{{ $value['last_name'] }}</p> <p>{{ $value['address'] }}</p> @endforeach @endif </div> <div class="col-lg-6"> <div class="panel panel-default"> <div class="panel-heading"> Create New Student </div> <div class="panel-body"> @if (count($errors) > 0) <div class="alert alert-danger"> <strong>Whoops!</strong> There were some problems with your input.<br><br> <ul> @foreach ($errors->all() as $error) <li>{{ $error }}</li> @endforeach </ul> </div> @endif {{ Form::open(array('url' => 'StudentSearchCreate','autocomplete'=>'off')) }} <div class="row"> <div class="col-xs-12 col-sm-12 col-md-12"> <div class="form-group"> <strong>First Name:</strong> {{ Form::text('first_name', null, array('placeholder' => 'First Name','class' => 'form-control')) }} </div> </div> <div class="col-xs-12 col-sm-12 col-md-12"> <div class="form-group"> <strong>Last Name:</strong> {{ Form::text('last_name', null, array('placeholder' => 'Last Name','class' => 'form-control')) }} </div> </div> <div class="col-xs-12 col-sm-12 col-md-12"> <div class="form-group"> <strong>Address:</strong> {{ Form::text('address', null, array('placeholder' => 'Address','class' => 'form-control')) }} </div> </div> </div> <div class="text-center"> <button type="submit" class="btn btn-primary">Submit</button> </div> {{ Form::close() }} </div> </div> </div> </div> </div> </div> </div> @endsection |
Step 9: Run Our Laravel Application
We can start the server and run this example using the below command.
1 | php artisan serve |
Now we will run our example using the below Url in the browser.
1 | http://127.0.0.1:8000/studentSearch |