Einführung
Die Suche ist der kniffligste Teil in jeder Anwendung, während jeder eine schnelle und effektive Suchmaschine für seine Anwendung haben möchte. Lassen Sie uns sehen, wie wir diesen Prozess in einer Laravel-Anwendung einfach und skalierbar gestalten können. Wir werden ein Paket namens TNTSearch ist eine in PHP geschriebene Volltextsuchmaschine.
Installation von TNT Search
Da wir Composer als Industriestandard haben, ist die Installation von Paketen kein Problem. Fügen Sie einfach die folgende Zeile in Ihre composer.json-Datei ein
{
"require"
: {
"teamtnt/tntsearch"
: "0.6.*"
}
}
oder führen Sie einfach den folgenden Befehl direkt in Ihrem Terminal aus.
composer require teamtnt/tntsearch
wird die passende Version für Sie ausgewählt.
Öffnen Sie nun die Datei config/app.php und registrieren Sie den folgenden Dienstanbieter und erstellen Sie einen Alias für die namenstragende Fassade.
Service Provider
TeamTNT\TNTSearch\TNTSearchServiceProvider::class
Alias
‘TNTSearch’=> TeamTNT\TNTSearch\Facades\TNTSearch::class
Nun, da der Installationsteil abgeschlossen ist, können wir uns den coolen Dingen widmen.
Indizierung
Nehmen wir an, wir haben eine Produkttabelle mit den Feldern Titel, Beschreibung und Preis. Wir werden einen Artisan-Befehl erstellen, um unsere Indizierungsoperationen durchzuführen.
Öffnen Sie ein Terminalfenster und führen Sie den folgenden Befehl aus, um die Klasse ProductIndexer zu erzeugen.
php artisan make:console ProductIndexer
Finden Sie die Datei unter app/Console/Commands/ProductIndexer.php und die Handle-Methode wie folgt einstellen
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use TeamTNT\TNTSearch\Facades\TNTSearch;
class ProductIndexer extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'index:products';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Index the Products';
/**
* Create a new command instance.
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
$indexer = TNTSearch::createIndex('products.index');
$indexer->query("SELECT id, title, description, price FROM products");
$indexer->run();
}
}
Super! Registrieren Sie nun den Befehl bei Laravel, indem Sie die folgende Zeile an das Array $commands in app/Console/Kernal.php
\App\Console\Commands\ProductIndexer::class
Unser Indizierungsteil ist fast fertig, wir können unsere Produkte jederzeit indizieren, indem wir den folgenden artisan-Befehl ausführen
php artisan index:products
Sie finden die neu erstellte Indexdatei unter storage/products.index
Durchführen einer Suche
Lassen Sie uns schnell ein Suchformular mit Routen und Controller-Aktionen einrichten
# Displays our search form
Route::get('products', 'ProductsController@index');
# Displays our search results
Route::get('products/search', 'ProductsController@search');
Von PrdouctController@index geben wir einfach eine Ansicht zurück, die unser Suchformular wiedergibt, und übermitteln dieses Formular an ProductsController@search
Schauen wir uns an, wie wir die Suche angehen,
<?php
namespace App\Http\Controllers;
use App\Http\Requests;
use App\Product;
use Illuminate\Http\Request;
use TeamTNT\TNTSearch\Facades\TNTSearch;
class ProductsController extends Controller
{
....
public function search( Request $request )
{
TNTSearch::selectIndex("products.index");
$results = TNTSearch::search($request->get('query'), 1000);
$products = Product::whereIn('id', $results[ 'ids' ])->get();
return view('search.results', compact('products'));
}
....
}
Wir sind fast fertig, jetzt hat unsere Website eine einfache, aber leistungsfähige Suchmaschine.
Ich werde einen weiteren Teil dieses Artikels teilen, um die Neuindizierung und das Verschieben des Indizierungsjargons in den Hintergrund mit Laravels Scheduler zu besprechen.