Algolia Search adalah mesin pencari teks lengkap, numerik, dan segi yang dihosting yang mampu memberikan hasil waktu nyata dari penekanan tombol pertama.
Paket ini tidak digunakan lagi, kami menyarankan Anda untuk menggunakan Laravel Scout . Jika Anda ingin memperluas kemampuan Pramuka, silakan merujuk ke dokumentasi khusus kami
Paket PHP ini mengintegrasikan Algolia Search API ke dalam Laravel Eloquent ORM. Ini didasarkan pada paket algoliasearch-client-php.
Catatan: Jika Anda menggunakan Laravel 4, periksa repositori algoliasearch-laravel-4.
Anda dapat menemukan referensi lengkapnya di website Algolia.
Memasang
Mulai Cepat
Pilihan
objectID
khususHubungan
Pengindeksan
Kelola indeks
Kompatibilitas yang fasih
Tambahkan algolia/algoliasearch-laravel
ke file composer.json
Anda:
composer require algolia/algoliasearch-laravel
Tambahkan penyedia layanan ke config/app.php
di array providers
.
AlgoliaSearch Laravel AlgoliaServiceProvider ::class
Laravel Algolia memerlukan konfigurasi koneksi. Untuk memulai, Anda harus memublikasikan semua aset vendor:
php artisan vendor:publish
Anda dapat menambahkan opsi --provider="VinklaAlgoliaAlgoliaServiceProvider"
untuk hanya mempublikasikan aset paket Algolia.
Ini akan membuat file config/algolia.php
di aplikasi Anda yang dapat Anda modifikasi untuk mengatur konfigurasi Anda. Selain itu, pastikan Anda memeriksa perubahan dibandingkan dengan file konfigurasi asli setelah peningkatan.
Kode berikut menambahkan kemampuan pencarian ke model Contact
Anda dengan membuat indeks Contact
:
use Illuminate Database Eloquent Model ;
use AlgoliaSearch Laravel AlgoliaEloquentTrait ;
class Contact extends Model
{
use AlgoliaEloquentTrait ;
}
Secara default, semua atribut yang terlihat dikirim. Jika Anda ingin mengirim atribut tertentu, Anda dapat melakukan sesuatu seperti:
use Illuminate Database Eloquent Model ;
class Contact extends Model
{
use AlgoliaEloquentTrait ;
public function getAlgoliaRecord ()
{
return array_merge ( $ this -> toArray (), [
' custom_name ' => ' Custom Name '
]);
}
}
Setelah menyiapkan model, Anda perlu melakukan impor awal data secara manual. Anda dapat melakukan ini dengan memanggil reindex
pada kelas model Anda. Menggunakan contoh kita sebelumnya, ini akan menjadi:
Contact :: reindex ();
Kami menyediakan banyak cara untuk mengonfigurasi pengaturan indeks Anda untuk menyesuaikan relevansi secara keseluruhan, namun yang paling penting adalah atribut yang dapat dicari dan atribut yang mencerminkan popularitas rekaman . Anda dapat mengkonfigurasinya dengan kode berikut:
use Illuminate Database Eloquent Model ;
class Contact extends Model
{
use AlgoliaEloquentTrait ;
public $ algoliaSettings = [
' searchableAttributes ' => [
' id ' ,
' name ' ,
],
' customRanking ' => [
' desc(popularity) ' ,
' asc(name) ' ,
],
];
}
Anda dapat menyebarkan (menyimpan) pengaturan ke algolia dengan menggunakan metode setSetting
:
Contact :: setSettings ();
Sinonim digunakan untuk memberi tahu mesin tentang kata atau ungkapan yang harus dianggap setara dalam kaitannya dengan relevansi tekstual.
API sinonim kami telah dirancang untuk mengelola sekumpulan besar sinonim untuk indeks dan replikanya semudah mungkin.
Anda dapat menggunakan API sinonim dengan menambahkan synonyms
di properti kelas $algoliaSettings
seperti ini:
use Illuminate Database Eloquent Model ;
class Contact extends Model
{
use AlgoliaEloquentTrait ;
public $ algoliaSettings = [
' synonyms ' => [
[
' objectID ' => ' red-color ' ,
' type ' => ' synonym ' ,
' synonyms ' => [ ' red ' , ' another red ' , ' yet another red ' ]
]
]
];
}
Anda dapat menyebarkan (menyimpan) pengaturan ke algolia menggunakan metode setSetting
:
Contact :: setSettings ();
Implementasi penelusuran tradisional cenderung memiliki logika dan fungsionalitas penelusuran di backend. Hal ini masuk akal jika pengalaman penelusuran terdiri dari pengguna yang memasukkan kueri penelusuran, menjalankan penelusuran tersebut, dan kemudian dialihkan ke laman hasil penelusuran.
Menerapkan pencarian di backend tidak lagi diperlukan. Faktanya, dalam banyak kasus, hal ini merugikan kinerja karena jaringan ekstra dan latensi pemrosesan. Kami sangat menyarankan penggunaan Klien API JavaScript kami yang mengeluarkan semua permintaan pencarian langsung dari browser pengguna akhir, perangkat seluler, atau klien. Ini akan mengurangi latensi pencarian keseluruhan saat membongkar server Anda pada saat yang bersamaan.
Dalam kode JavaScript Anda, Anda dapat melakukan:
var client = algoliasearch ( 'ApplicationID' , 'Search-Only-API-Key' ) ;
var index = client . initIndex ( 'YourIndexName' ) ;
index . search ( 'something' , function ( success , hits ) {
console . log ( success , hits )
} , { hitsPerPage : 10 , page : 0 } ) ;
Anda juga dapat menggunakan metode search
, namun tidak disarankan untuk menerapkan pengalaman pencarian instan/waktu nyata dari backend (memiliki pencarian frontend memberikan pengalaman pengguna yang lebih baik):
Contact :: search ( ' jon doe ' );
Setiap kali rekaman disimpan; itu akan - secara asinkron - diindeks. Di sisi lain, setiap kali sebuah record dimusnahkan, record tersebut akan - secara asinkron - dihapus dari indeks.
Anda dapat menonaktifkan pengindeksan otomatis dan penghapusan otomatis dengan mengatur opsi berikut:
use Illuminate Database Eloquent Model ;
class Contact extends Model
{
use AlgoliaEloquentTrait ;
public static $ autoIndex = false ;
public static $ autoDelete = false ;
}
Anda dapat menonaktifkan pengindeksan otomatis untuk sementara. Hal ini sering dilakukan karena alasan kinerja.
Contact :: $ autoIndex = false ;
Contact :: clearIndices ();
for ( $ i = 0 ; $ i < 10000 ; $ i ++) {
$ contact = Contact :: firstOrCreate ([ ' name ' => ' Jean ' ]);
}
Contact :: reindex (); // Will use batch operations.
Contact :: $ autoIndex = true ;
Anda juga dapat membuat kondisi dinamis untuk kedua parameter tersebut dengan membuat metode autoIndex
dan/atau autoDelete method
pada model Anda
use Illuminate Database Eloquent Model ;
class Contact extends Model
{
use AlgoliaEloquentTrait ;
public function autoIndex ()
{
if ( App :: environment () === ' test ' ) {
return false ;
}
return true ;
}
public static autoDelete()
{
if ( App ::environment() === 'test') {
return false ;
}
return true ;
}
}
Berhati-hatilah saat mendefinisikan kedua metode tersebut di AlgoliaEloquentTrait. Saat meletakkan metode tersebut di kelas induk, metode tersebut akan "dihapus" oleh AlgoliaEloquentTrait jika digunakan di kelas anak (karena warisan php).
Secara default, nama indeks akan berupa nama kelas jamak, misalnya "Kontak". Anda dapat menyesuaikan nama indeks dengan menggunakan opsi $indices
:
use Illuminate Database Eloquent Model ;
class Contact extends Model
{
use AlgoliaEloquentTrait ;
public $ indices = [ ' contact_all ' ];
}
Anda dapat menambahkan akhiran nama indeks dengan lingkungan Aplikasi saat ini menggunakan opsi berikut:
use Illuminate Database Eloquent Model ;
class Contact extends Model
{
use AlgoliaEloquentTrait ;
public static $ perEnvironment = true ; // Index name will be 'Contacts_{App::environnement()}';
}
objectID
khusus Secara default, objectID
didasarkan pada keyName
rekaman Anda ( id
secara default). Anda dapat mengubah perilaku ini dengan menentukan opsi objectIdKey
(pastikan untuk menggunakan bidang uniq).
use Illuminate Database Eloquent Model ;
class Contact extends Model
{
use AlgoliaEloquentTrait ;
public static $ objectIdKey = ' new_key ' ;
}
Anda dapat menambahkan batasan yang mengontrol apakah suatu catatan harus diindeks dengan mendefinisikan metode indexOnly()
.
use Illuminate Database Eloquent Model ;
class Contact extends Model
{
use AlgoliaEloquentTrait ;
public function indexOnly ( $ index_name )
{
return ( bool ) $ condition ;
}
}
Secara default, paket Algolia akan mengambil hubungan yang dimuat .
Jika Anda ingin mengindeks rekaman yang belum memuat relasi apa pun, Anda dapat melakukannya dengan memuatnya di getAlgoliaRecord
yang dapat Anda buat di model Anda.
Ini akan terlihat seperti:
public function getAlgoliaRecord ()
{
/**
* Load the categories relation so that it's available
* in the laravel toArray method
*/
$ this -> categories ;
return $ this -> toArray ();
}
Di objek yang dihasilkan, Anda akan memiliki kategori yang dikonversi ke array oleh Laravel. Jika Anda menginginkan struktur relasi khusus, Anda akan melakukan sesuatu seperti:
public function getAlgoliaRecord ()
{
/**
* Load the categories relation so that it's available
* in the laravel toArray method
*/
$ extra_data = [];
$ extra_data [ ' categories ' ] = array_map ( function ( $ data ) {
return $ data [ ' name ' ];
}, $ this -> categories -> toArray ());
return array_merge ( $ this -> toArray (), $ extra_data );
}
Secara default, Algolia hanya dapat mengakses atribut model Anda yang terlihat . Jadi, misalnya, Anda akan menerima pengecualian No content in PUT request
saat menggunakan kode contoh ini, karena invisible_attribute
mengembalikan variabel kosong/null.
protected $ visible = [ ' visible_attribute ' , ' other_visible_attribute ' ];
public function getAlgoliaRecord ()
{
return [
' invisible_attribute ' => $ this -> invisible_attribute
];
}
Sebelum Mengindeks, pastikan Anda telah mencantumkan atribut yang terlihat dengan benar. Untuk melewati masker pengaman yang diterapkan oleh Laravel, Anda dapat menggunakan $this->attributes['invisible_attribute']
untuk mengakses langsung ke atribut meskipun tidak terlihat, namun rekomendasinya adalah untuk menghindari jenis akses ke atribut dalam Model Anda.
Anda dapat memicu pengindeksan menggunakan metode instance pushToIndex
.
$ contact = Contact :: firstOrCreate ([ ' name ' => ' Jean ' ]);
$ contact -> pushToIndex ();
Dan picu penghapusan menggunakan metode instance removeFromIndex
.
$ contact = Contact :: firstOrCreate ([ ' name ' => ' Jean ' ]);
$ contact -> removeFromIndex ();
Untuk mengindeks ulang semua catatan Anda dengan aman (mengindeks ke indeks sementara + memindahkan indeks sementara ke indeks saat ini secara atom), gunakan metode kelas reindex
:
Contact :: reindex ();
Untuk mengindeks ulang semua catatan Anda (di tempatnya, tanpa menghapus catatan lama):
Contact :: reindex ( false );
Untuk mengatur pengaturan selama proses pengindeksan ulang:
Contact :: reindex ( true , true );
Untuk mempertahankan pengaturan yang Anda atur di dasbor Algolia saat mengindeks ulang dan mengubah pengaturan:
Contact :: reindex ( true , true , true );
Untuk mengimplementasikan callback yang dipanggil setiap kali kumpulan entitas diindeks:
Contact :: reindex ( true , true , false , function ( $ entities )
{
foreach ( $ entities as $ entity )
{
var_dump ( $ entity -> id ); // Contact::$id
}
});
Untuk menghapus indeks, gunakan metode kelas clearIndices
:
Contact :: clearIndices ( ) ;
Anda dapat menentukan indeks replika menggunakan variabel $algolia_settings
:
use Illuminate Database Eloquent Model ;
class Contact extends Model
{
use AlgoliaEloquentTrait ;
public $ algoliaSettings = [
' searchableAttributes ' => [
' id ' ,
' name ' ,
],
' customRanking ' => [
' desc(popularity) ' ,
' asc(name) ' ,
],
' replicas ' => [
' contacts_desc ' ,
],
];
public $ replicasSettings = [
' contacts_desc ' => [
' ranking ' => [
' desc(name) ' ,
' typo ' ,
' geo ' ,
' words ' ,
' proximity ' ,
' attribute ' ,
' exact ' ,
' custom '
]
]
];
}
Untuk mencari menggunakan replika, gunakan kode berikut:
Book :: search ( ' foo bar ' , [ ' index ' => ' contacts_desc ' ]);
Anda dapat mengindeks catatan di beberapa indeks menggunakan properti $indices
:
use Illuminate Database Eloquent Model ;
class Contact extends Model
{
use AlgoliaEloquentTrait ;
public $ indices = [
' contact_public ' ,
' contact_private ' ,
];
public function indexOnly ( $ indexName )
{
if ( $ indexName == ' contact_public ' )
return true ;
return $ this -> private ;
}
}
Untuk mencari menggunakan indeks tambahan, gunakan kode berikut:
Book :: search ( ' foo bar ' , [ ' index ' => ' contacts_private ' ]);
Sedang mengerjakan:
Ad :: where ( ' id ' , $ id )-> update ( $ attributes );
tidak akan memicu apa pun pada model (jadi tidak ada pembaruan yang akan terjadi di Algolia). Hal ini karena ini bukan panggilan Fasih. Ini hanyalah cara mudah untuk menghasilkan kueri yang tersembunyi di balik model.
Agar kueri ini berfungsi dengan Algolia, Anda perlu melakukannya seperti ini:
Ad :: find ( $ id )-> update ( $ attributes );
Kompatibel dengan aplikasi 5.x