
Tam metin arama, kullanıcıların zengin içerikli web sitelerinde gezinmesine izin vermek için çok önemlidir. Bu yazıda, bir Laravel uygulaması için tam metin aramanın nasıl uygulanacağını göstereceğim. Aslında, tam metin arama uygulamasını kolay ve eğlenceli hale getiren Laravel Scout kitaplığını kullanacağız.
Laravel İzci tam olarak nedir? Resmi belgeler bunu şöyle özetliyor:
Laravel Scout, Eloquent modellerinize tam metin arama eklemek için basit, sürücü tabanlı bir çözüm sunar. Scout, model gözlemcileri kullanarak arama dizinlerinizi Eloquent kayıtlarınızla otomatik olarak senkronize tutacaktır.
Temel olarak, Laravel Scout, model verilerinde bir değişiklik olduğunda indeksin manipülasyonunu yöneten bir kütüphanedir. Verilerin indeksleneceği yer, Scout kitaplığı ile yapılandırdığınız sürücüye bağlıdır.
Şu andan itibaren, Laravel Scout kitaplığı, bulut tabanlı bir arama motoru API’si olan Algolia’yı desteklemektedir ve tam metin arama uygulamasını göstermek için bu makalede kullanacağımız şey budur.
Scout ve Algolia sunucu kitaplıklarını kurarak başlayacağız ve devam ederken, verilerinizi nasıl indeksleyebileceğinizi ve arayabileceğinizi göstermek için gerçek dünyadan bir örnek üzerinden gideceğiz.
Sunucu Yapılandırmaları
Bu bölümde Scout kütüphanesinin Laravel ile çalışması için gerekli olan bağımlılıkları kuracağız. Kurulumdan sonra, Laravel’in Scout kitaplığını algılayabilmesi için biraz yapılandırma yapmamız gerekecek.
Devam edelim ve Composer kullanarak Scout kütüphanesini kuralım.
$composer require laravel/scout
Scout kitaplığı kurulumu söz konusu olduğunda, aşağı yukarı bu kadar. Şimdi Scout kütüphanesini kurduk, hadi Laravel’in bunu bildiğinden emin olalım.
Laravel ile çalışırken, muhtemelen uygulamanızda servisleri yapılandırmanıza izin veren bir servis sağlayıcı kavramının farkındasınızdır. Bu nedenle, Laravel uygulamanızda yeni bir servisi etkinleştirmek istediğinizde, sadece ilgili servis sağlayıcı girişi eklemeniz yeterlidir. config/app.php.
Henüz Laravel servis sağlayıcılarına aşina değilseniz, kendinize bir iyilik yapmanızı ve bunu gözden geçirmenizi şiddetle tavsiye ederim. Laravel’deki hizmet sağlayıcıların temellerini açıklayan giriş makalesi.
Bizim durumumuzda, sadece eklememiz gerekiyor ScoutServiceProvider
sağlayıcı, içindeki hizmet sağlayıcılar listesine config/app.phpaşağıdaki snippet’te gösterildiği gibi.
... ... 'providers' => [ /* * Laravel Framework Service Providers... */ IlluminateAuthAuthServiceProvider::class, IlluminateBroadcastingBroadcastServiceProvider::class, IlluminateBusBusServiceProvider::class, IlluminateCacheCacheServiceProvider::class, IlluminateFoundationProvidersConsoleSupportServiceProvider::class, IlluminateCookieCookieServiceProvider::class, IlluminateDatabaseDatabaseServiceProvider::class, IlluminateEncryptionEncryptionServiceProvider::class, IlluminateFilesystemFilesystemServiceProvider::class, IlluminateFoundationProvidersFoundationServiceProvider::class, IlluminateHashingHashServiceProvider::class, IlluminateMailMailServiceProvider::class, IlluminateNotificationsNotificationServiceProvider::class, IlluminatePaginationPaginationServiceProvider::class, IlluminatePipelinePipelineServiceProvider::class, IlluminateQueueQueueServiceProvider::class, IlluminateRedisRedisServiceProvider::class, IlluminateAuthPasswordsPasswordResetServiceProvider::class, IlluminateSessionSessionServiceProvider::class, IlluminateTranslationTranslationServiceProvider::class, IlluminateValidationValidationServiceProvider::class, IlluminateViewViewServiceProvider::class, /* * Package Service Providers... */ /* * Application Service Providers... */ AppProvidersAppServiceProvider::class, AppProvidersAuthServiceProvider::class, // AppProvidersBroadcastServiceProvider::class, AppProvidersEventServiceProvider::class, AppProvidersRouteServiceProvider::class, LaravelScoutScoutServiceProvider::class, ], ... ...
Şimdi, Laravel bunun farkında ScoutServiceProvider
servis sağlayıcı. Scout kitaplığı, API kimlik bilgilerini ayarlamamıza izin veren bir yapılandırma dosyasıyla birlikte gelir.
Devam edelim ve aşağıdaki komutu kullanarak Scout kitaplığı tarafından sağlanan varlıkları yayınlayalım.
$ php artisan vendor:publish --provider="LaravelScoutScoutServiceProvider" Copied File [/vendor/laravel/scout/config/scout.php] To [/config/scout.php] Publishing complete.
Gördüğünüz gibi kopyalamış satıcı/laravel/scout/config/scout.php dosyalamak config/scout.php.
Ardından, devam edin ve bir hesap oluşturun Algolia çünkü ilk etapta API kimlik bilgilerine ihtiyacımız olacak. API bilgisine sahip olduğunuzda, devam edelim ve gerekli ayarları yapılandıralım. config/scout.php dosya, aşağıdaki snippet’te gösterildiği gibi.
<?php return [ /* |-------------------------------------------------------------------------- | Default Search Engine |-------------------------------------------------------------------------- | | This option controls the default search connection that gets used while | using Laravel Scout. This connection is used when syncing all models | to the search service. You should adjust this based on your needs. | | Supported: "algolia", "null" | */ 'driver' => env('SCOUT_DRIVER', 'algolia'), /* |-------------------------------------------------------------------------- | Index Prefix |-------------------------------------------------------------------------- | | Here you may specify a prefix that will be applied to all search index | names used by Scout. This prefix may be useful if you have multiple | "tenants" or applications sharing the same search infrastructure. | */ 'prefix' => env('SCOUT_PREFIX', ''), /* |-------------------------------------------------------------------------- | Queue Data Syncing |-------------------------------------------------------------------------- | | This option allows you to control if the operations that sync your data | with your search engines are queued. When this is set to "true" then | all automatic data syncing will get queued for better performance. | */ 'queue' => env('SCOUT_QUEUE', false), /* |-------------------------------------------------------------------------- | Database Transactions |-------------------------------------------------------------------------- | | This configuration option determines if your data will only be synced | with your search indexes after every open database transaction has | been committed, thus preventing any discarded data from syncing. | */ 'after_commit' => false, /* |-------------------------------------------------------------------------- | Chunk Sizes |-------------------------------------------------------------------------- | | These options allow you to control the maximum chunk size when you are | mass importing data into the search engine. This allows you to fine | tune each of these chunk sizes based on the power of the servers. | */ 'chunk' => [ 'searchable' => 500, 'unsearchable' => 500, ], /* |-------------------------------------------------------------------------- | Soft Deletes |-------------------------------------------------------------------------- | | This option allows you to control whether to keep soft deleted records in | the search indexes. Maintaining soft deleted records can be useful | if your application still needs to search for the records later. | */ 'soft_delete' => false, /* |-------------------------------------------------------------------------- | Identify User |-------------------------------------------------------------------------- | | This option allows you to control whether to notify the search engine | of the user performing the search. This is sometimes useful if the | engine supports any analytics based on this application's users. | | Supported engines: "algolia" | */ 'identify' => env('SCOUT_IDENTIFY', false), /* |-------------------------------------------------------------------------- | Algolia Configuration |-------------------------------------------------------------------------- | | Here you may configure your Algolia settings. Algolia is a cloud hosted | search engine which works great with Scout out of the box. Just plug | in your application ID and admin API key to get started searching. | */ 'algolia' => [ 'id' => env('ALGOLIA_APP_ID', 'XXXXXX'), 'secret' => env('ALGOLIA_SECRET', 'XXXXXXXXXXXXXXXXXXXXXXXX'), ], ];
değerini belirlediğimizi unutmayın. SCOUT_DRIVER
ile algolia
sürücü. Bu nedenle dosyanın sonunda Algolia sürücüsü için gerekli ayarları yapılandırmanız gerekmektedir. Temel olarak, sadece ayarlamanız gerekir id
ve secret
Algolia hesabından aldığın bilgiler.
Gördüğünüz gibi, ortam değişkenlerinden değerler alıyoruz. Öyleyse, aşağıdaki değişkenleri ayarladığımızdan emin olalım. .env uygun şekilde dosyalayın.
... ... ALGOLIA_APP_ID=XXXXXX ALGOLIA_SECRET=XXXXXXXXXXXXXXXXXXXXXXXXXXXX ... ...
Son olarak, API’leri kullanarak Algolia ile etkileşim kurmak için kullanılacak olan Algolia PHP SDK’sını kurmamız gerekiyor. Aşağıdaki snippet’te gösterildiği gibi Composer kullanarak yükleyelim.
$composer require algolia/algoliasearch-client-php
Ve bununla birlikte, Algolia hizmetine veri göndermek ve indekslemek için gerekli olan tüm bağımlılıkları kurduk.
Modelleri Dizine Alınabilir ve Aranabilir Hale Getirme
Bir önceki bölümde, Algolia arama hizmetini kullanarak verileri indeksleyebilmek ve arayabilmek için Scout ve Algolia kitaplıklarını kurmak için tüm zor işleri yaptık.
Bu bölümde, mevcut verileri nasıl indeksleyebileceğinizi ve Algolia’dan arama sonuçlarını nasıl alabileceğinizi göstermek için bir örnek üzerinden gideceğiz. bir varsayılanın olduğunu varsayıyorum Post
uygulamanızdaki model.
Yapmamız gereken ilk şey, LaravelScoutSearchable
özellik Post
modeli. bu yapar Post
model aranabilir; Laravel, kayıt her eklendiğinde, güncellendiğinde veya silindiğinde kayıt kayıtlarını Algolia indeksi ile senkronize eder.
<?php namespace App; use IlluminateDatabaseEloquentModel; use LaravelScoutSearchable; class Post extends Model { use Searchable; ... ... }
Bununla, Post
model arama dostudur!
Ardından, ilk etapta dizine alınması gereken alanları yapılandırmak istiyoruz. Elbette, Algolia’daki modelinizin tüm alanlarını etkili ve hafif tutmak için dizine eklemek istemezsiniz. Aslında, çoğu zaman buna ihtiyacınız olmayacak.
ekleyebilirsiniz toSearchableArray
dizine eklenecek alanları yapılandırmak için model sınıfında.
/** * Get the indexable data array for the model. * * @return array */ public function toSearchableArray() { $array = $this->toArray(); return array('id' => $array['id'],'name' => $array['name']); }
Şimdi, mevcut olanları içe aktarmaya ve dizine eklemeye hazırız Post
Algolia’ya kaydeder. Aslında, Scout kütüphanesi aşağıdaki artisan komutunu sağlayarak bunu kolaylaştırır.
$php artisan scout:import "AppPost"
Bu, tüm kayıtları içe aktarmalıdır. Post
tek seferde model! İçe aktarıldıkları anda dizine eklenirler, bu nedenle kayıtları sorgulamaya şimdiden hazırız. Devam edin ve içe aktarılan kayıtları ve diğer yardımcı programları görmek için Algolia panosunu keşfedin.
Hep Birlikte Nasıl Çalışır?
Bu bölümde, Algolia dizini ile gerçek zamanlı olarak senkronize edilen arama ve CRUD işlemlerinin nasıl gerçekleştirileceğini gösteren bir örnek oluşturacağız.
Devam edin ve app/Http/Controllers/SearchController.php Aşağıdaki içeriğe sahip dosya.
<?php namespace AppHttpControllers; use AppHttpControllersController; use AppPost; class SearchController extends Controller { public function query() { // queries to Algolia search index and returns matched records as Eloquent Models $posts = Post::search('title')->get(); // do the usual stuff here foreach ($posts as $post) { // ... } } public function add() { // this post should be indexed at Algolia right away! $post = new Post; $post->setAttribute('name', 'Another Post'); $post->setAttribute('user_id', '1'); $post->save(); } public function delete() { // this post should be removed from the index at Algolia right away! $post = Post::find(1); $post->delete(); } }
Elbette ilgili rotaları da eklememiz gerekiyor.
Route::get('search/query', 'SearchController@query'); Route::get('search/add', 'SearchController@add'); Route::get('search/delete', 'SearchController@delete');
geçelim query
Algolia’da nasıl arama yapılacağını görme yöntemi.
public function query() { // queries to Algolia search index and returns matched records as Eloquent Models $posts = Post::search('title')->get(); // do the usual stuff here foreach ($posts as $post) { // ... } }
yaptığımızı hatırlayın. Post
eklenerek aranabilir model Searchable
karakter. Böylece Post
modeli kullanabilir search
Algolia dizininden kayıtları alma yöntemi. Yukarıdaki örnekte, aşağıdakilerle eşleşen kayıtları getirmeye çalışıyoruz. title
anahtar kelime.
Sonra, orada add
yeni bir gönderi kaydı ekleme iş akışını taklit eden yöntem.
public function add() { // this post should be indexed at Algolia right away! $post = new Post; $post->setAttribute('name', 'Another Post'); $post->setAttribute('user_id', '1'); $post->save(); }
Yukarıdaki kodda süslü bir şey yok; sadece kullanarak yeni bir gönderi kaydı oluşturur. Post
modeli. Fakat Post
modeli uygular Searchable
Bu nedenle Laravel, Algolia’da yeni oluşturulan kaydı indeksleyerek bu sefer fazladan bir iş yapıyor. Gördüğünüz gibi, indeksleme gerçek zamanlı olarak yapılır.
Sonunda, orada delete
yöntem. Onu da geçelim.
public function delete() { // this post should be removed from the index at Algolia right away! $post = Post::find(1); $post->delete(); }
Beklediğiniz gibi, kayıt, veritabanından silinir silinmez Algolia dizininden hemen silinir.
Temel olarak, mevcut modelleri aranabilir hale getirmek istiyorsanız, sizin tarafınızdan ekstra bir çaba harcamanıza gerek yoktur. Her şey, model gözlemciler kullanılarak Scout kütüphanesi tarafından gerçekleştirilir.
Özel Arama Motoru/Sürücüsü Nasıl Yapılır?
Varsayılan olarak, Scout kitaplığı aşağıdakileri destekler: Algolia
ve MeiliSearch
sürücüler. Ek olarak, şunları da kullanabilirsiniz: database
Hafif bir veritabanı için sürücü. Öte yandan, kendi özel motorunuzu uygulamak istiyorsanız, Scout bunu başarmanıza izin verir. Özel motorunuzu yazmanız ve Scout’a kaydetmeniz yeterli!
Özel motor sınıfınız şöyle görünebilir:
<?php namespace AppEngines; use LaravelScoutBuilder; use LaravelScoutEnginesEngine; class CustomScoutEngine extends Engine { public function update($models) {} public function delete($models) {} public function search(Builder $builder) {} public function paginate(Builder $builder, $perPage, $page) {} public function mapIds($results) {} public function map(Builder $builder, $results, $model) {} public function getTotalCount($results) {} public function flush($model) {} }
Tabii ki, gereksinimlerinize göre soyut yöntemler uygulamanız gerekir.
Özel motor sınıfınızı uyguladıktan sonra, onu kaydetmeniz yeterlidir. yardımı ile yapabilirsiniz. boot
Aşağıdaki snippet’te gösterildiği gibi servis sağlayıcının yöntemi.
use AppEnginesCustomScoutEngine; use LaravelScoutEngineManager; /** * Bootstrap any application services. * * @return void */ public function boot() { resolve(EngineManager::class)->extend('custom_scout_engine', function () { return new CustomScoutEngine; }); }
Ve son olarak, özel motorunuz kaydedildikten sonra, onu config/scout.php dosya.
'driver' => 'custom_scout_engine',
Çözüm
Bugün, Laravel Scout kitaplığını kullanarak Laravel’de tam metin aramayı nasıl uygulayabileceğinizi tartıştık. Bu süreçte, bunu göstermek için gerekli kurulumları ve gerçek dünyadan bir örneği inceledik.