Full Text Search Using Scout And Algolia in Laravel 6

10-Apr-2023

.

Admin

Full Text Search Using Scout And Algolia in Laravel 6

hii guys,

In this example,I will show you how to add full text search using scout in your laravel 6 application.Here we will use scout ans algolia to perform full text search.

You just need to create an account in algolia.com and create one index where your data will store.

Follow below step to add full text search in your application :

Install Laravel 6


you will create laravel 6 fresh application.

composer create-project --prefer-dist laravel/laravel ScoutFullTextSearch

Install Scout Package

Now here we will run below command to install scout package.

composer require laravel/scout

config/app.php

Add ScoutServiceProvider to providers array in app.php file like as below :

'providers' => [

....

Laravel\Scout\ScoutServiceProvider::class,

]

Publish Assets

Let's go ahead and publish the assets provided by the Scout library using the following command.

php artisan vendor:publish --provider="Laravel\Scout\ScoutServiceProvider"

Install Algolia

Now we have to install algolia package by running below command.

composer require algolia/algoliasearch-client-php

Package Configuration

Now we have to create new account in algolia.com. So if you haven't account on algolia.com site then click here and create new account : algolia.com.

From above screenshot you can get app id and secret from dashboard.

config/scout.php

Add id and secret in scout.php file like as below .

'algolia' => [

'id' => env('ALGOLIA_APP_ID', '*******'),

'secret' => env('ALGOLIA_SECRET', '******************'),

],

.env

Also put id and secret in .env file .

ALGOLIA_APP_ID=*********

ALGOLIA_SECRET=***********************

routes/web.php

Add product route in web.php file.

Route::get('product', ['as'=>'product.index','uses'=>'ProductController@index']);

Route::post('product-add', ['as'=>'product.add','uses'=>'ProductController@create']);

Create Controller

Run below command to make product controller

php artisan make:controller ProductController

app\Http\Controllers\ProductController.php

update productcontroller.php like as below :

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Product;

class ProductController extends Controller

{

/**

* Get the index name for the model.

*

* @return string

*/

public function index(Request $request)

{

if($request->has('search')){

$products = Product::search($request->search)->paginate(5);

}else{

$products = Product::paginate(5);

}

return view('product-index',compact('products'));

}

/**

* Get the index name for the model.

*

* @return string

*/

public function create(Request $request)

{

$this->validate($request,[

'name'=>'required',

'quantity'=>'required'

]);

$products = Product::create($request->all());

return back();

}

}

Create Model

Run below command to make product model

php artisan make:model Product

app\Product.php

update product.php like as below :

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

use Laravel\Scout\Searchable;

class Product extends Model

{

use Searchable;

public $fillable = [

'name','quantity'

];

/**

* Get the index name for the model.

*

* @return string

*/

public function searchableAs()

{

return 'product';

}

}

Create Blade File

Put below code in your product blade file .

product-index.blade.php

<!DOCTYPE html>

<html>

<head>

<title>Laravel 6 Scout Search</title>

<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">

</head>

<body>

<div class="container">

<div class="row">

<div class="col-md-12">

<h2 class="mt-5">Laravel 6 Scout Search</h2><br/>

<form method="POST" action="{{ route('product.add') }}" autocomplete="off">

<input type="hidden" name="_token" value="{{ csrf_token() }}">

<div class="row">

<div class="col-md-4">

<div class="form-group {{ $errors->has('name') ? 'has-error' : '' }}">

<input type="text" id="name" name="name" class="form-control" placeholder="Enter Name" value="{{ old('name') }}">

<span class="text-danger">{{ $errors->first('name') }}</span>

</div>

</div>

<div class="col-md-4">

<div class="form-group {{ $errors->has('quantity') ? 'has-error' : '' }}">

<input type="text" id="quantity" name="quantity" class="form-control" placeholder="Enter Quantity" value="{{ old('quantity') }}">

<span class="text-danger">{{ $errors->first('quantity') }}</span>

</div>

</div>

<div class="col-md-4">

<div class="form-group">

<button class="btn btn-primary rounded-0">Create New Product</button>

</div>

</div>

</div>

</form>

</div>

</div>

<div class="row mt-3">

<div class="col-md-12">

<h5><strong>Product</strong></h5><hr>

<form method="GET" action="{{ route('product.index') }}">

<div class="row">

<div class="col-md-6">

<div class="form-group">

<input type="text" name="search" class="form-control" placeholder="Search" value="{{ Request::get('search') }}">

</div>

</div>

<div class="col-md-6">

<div class="form-group">

<button class="btn btn-primary rounded-0">Search</button>

</div>

</div>

</div>

</form>

<table class="table table-bordered">

<thead>

<th width="5%">Id</th>

<th>Name</th>

<th>Quantity</th>

</thead>

<tbody>

@if($products->count())

@foreach($products as $key => $value)

<tr>

<td>{{ ++$key }}</td>

<td>{{ $value->name }}</td>

<td>{{ $value->quantity }}</td>

</tr>

@endforeach

@else

<tr>

<td colspan="4">There are no data.</td>

</tr>

@endif

</tbody>

</table>

{{ $products->links() }}

</div>

</div>

</div>

</body>

</html>

It will help you....

#Laravel

#Laravel 6