Algolia Search 是一個託管的全文、數位和多面搜尋引擎,能夠透過第一次擊鍵提供即時結果。
該軟體包已棄用,我們建議您使用 Laravel Scout 。如果您想擴展 Scout 功能,請參閱我們的專用文檔
該 PHP 套件將 Algolia Search API 整合到 Laravel Eloquent ORM 中。它基於 algoliasearch-client-php 套件。
注意:如果您使用 Laravel 4,請查看 algoliasearch-laravel-4 儲存庫。
您可以在 Algolia 網站上找到完整的參考資料。
安裝
快速入門
選項
objectID
人際關係
索引
管理指數
口才相容
將algolia/algoliasearch-laravel
加入您的composer.json
檔案:
composer require algolia/algoliasearch-laravel
將服務提供者加入到providers
陣列中的config/app.php
。
AlgoliaSearch Laravel AlgoliaServiceProvider ::class
Laravel Algolia 需要連接配置。首先,您需要發布所有供應商資產:
php artisan vendor:publish
您可以新增--provider="VinklaAlgoliaAlgoliaServiceProvider"
選項以僅發布 Algolia 套件的資產。
這將在您的應用程式中建立一個config/algolia.php
文件,您可以修改該文件來設定您的配置。另外,請確保在升級後檢查與原始設定檔相比的變更。
以下程式碼將搜尋功能新增至建立Contact
索引Contact
模型:
use Illuminate Database Eloquent Model ;
use AlgoliaSearch Laravel AlgoliaEloquentTrait ;
class Contact extends Model
{
use AlgoliaEloquentTrait ;
}
預設情況下發送所有可見屬性。如果您想傳送特定屬性,您可以執行下列操作:
use Illuminate Database Eloquent Model ;
class Contact extends Model
{
use AlgoliaEloquentTrait ;
public function getAlgoliaRecord ()
{
return array_merge ( $ this -> toArray (), [
' custom_name ' => ' Custom Name '
]);
}
}
設定模型後,您需要手動執行資料的初始導入。您可以透過在模型類別上呼叫reindex
來完成此操作。使用我們之前的範例,這將是:
Contact :: reindex ();
我們提供了多種方法來配置索引設定以調整整體相關性,但最重要的是可搜尋屬性和反映記錄流行度的屬性。您可以使用以下程式碼配置它們:
use Illuminate Database Eloquent Model ;
class Contact extends Model
{
use AlgoliaEloquentTrait ;
public $ algoliaSettings = [
' searchableAttributes ' => [
' id ' ,
' name ' ,
],
' customRanking ' => [
' desc(popularity) ' ,
' asc(name) ' ,
],
];
}
您可以使用setSetting
方法將設定傳播(儲存)到 algolia:
Contact :: setSettings ();
同義詞用於告訴引擎在文本相關性方面應被視為相同的單字或表達方式。
我們的同義詞 API 旨在盡可能輕鬆地管理索引及其副本的大量同義詞。
您可以透過在$algoliaSettings
類別屬性中加入synonyms
來使用同義詞 API,如下所示:
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 ' ]
]
]
];
}
您可以使用setSetting
方法將設定傳播(儲存)到 algolia:
Contact :: setSettings ();
傳統的搜尋實作往往在後端具有搜尋邏輯和功能。當搜尋體驗包括使用者輸入搜尋查詢、執行該搜索,然後重定向到搜尋結果頁面時,這是有意義的。
不再需要在後端實現搜尋。事實上,在大多數情況下,由於額外的網路和處理延遲,這對效能有害。我們強烈建議使用我們的 JavaScript API 用戶端直接從最終用戶的瀏覽器、行動裝置或用戶端發出所有搜尋請求。它將減少整體搜尋延遲,同時減輕伺服器的負擔。
在您的 JavaScript 程式碼中您可以執行以下操作:
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 } ) ;
您也可以使用search
方法,但不建議從後端實現即時/即時搜尋體驗(使用前端搜尋可以提供更好的使用者體驗):
Contact :: search ( ' jon doe ' );
每次保存一筆記錄;它將被非同步索引。另一方面,每次銷毀記錄時,它都會從索引中非同步刪除。
您可以透過設定以下選項來停用自動索引和自動刪除:
use Illuminate Database Eloquent Model ;
class Contact extends Model
{
use AlgoliaEloquentTrait ;
public static $ autoIndex = false ;
public static $ autoDelete = false ;
}
您可以暫時停用自動索引。這樣做通常是出於性能原因。
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 ;
您也可以透過在模型上建立autoIndex
和/或autoDelete method
來為這兩個參數建立動態條件
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 ;
}
}
請小心在 AlgoliaEloquentTrait 中定義這兩個方法。當將這些方法放入父類別中時,如果在子類別中使用它們,它們將被 AlgoliaEloquentTrait「刪除」(因為 php 繼承)。
預設情況下,索引名稱將為複數類別名稱,例如“Contacts”。您可以使用$indices
選項自訂索引名稱:
use Illuminate Database Eloquent Model ;
class Contact extends Model
{
use AlgoliaEloquentTrait ;
public $ indices = [ ' contact_all ' ];
}
您可以使用下列選項在索引名稱後面新增目前應用程式環境的後綴:
use Illuminate Database Eloquent Model ;
class Contact extends Model
{
use AlgoliaEloquentTrait ;
public static $ perEnvironment = true ; // Index name will be 'Contacts_{App::environnement()}';
}
objectID
預設情況下, objectID
是基於記錄的keyName
(預設為id
)。您可以透過指定objectIdKey
選項來變更此行為(請確保使用 uniq 欄位)。
use Illuminate Database Eloquent Model ;
class Contact extends Model
{
use AlgoliaEloquentTrait ;
public static $ objectIdKey = ' new_key ' ;
}
您可以新增約束來控制是否必須透過定義indexOnly()
方法對記錄建立索引。
use Illuminate Database Eloquent Model ;
class Contact extends Model
{
use AlgoliaEloquentTrait ;
public function indexOnly ( $ index_name )
{
return ( bool ) $ condition ;
}
}
預設情況下,Algolia 套件將取得載入的關係。
如果您想要對尚未載入任何關係的記錄建立索引,可以透過將它們載入到您可以在模型中建立的getAlgoliaRecord
中來實現。
它看起來像:
public function getAlgoliaRecord ()
{
/**
* Load the categories relation so that it's available
* in the laravel toArray method
*/
$ this -> categories ;
return $ this -> toArray ();
}
在結果物件中,Laravel 將類別轉換為陣列。如果您想要自訂關係結構,您將執行以下操作:
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 );
}
預設情況下,Algolia 只能存取模型的可見屬性。因此,例如,在使用此範例程式碼時,您將收到No content in PUT request
異常,因為invisible_attribute
鍵會傳回空/null 變數。
protected $ visible = [ ' visible_attribute ' , ' other_visible_attribute ' ];
public function getAlgoliaRecord ()
{
return [
' invisible_attribute ' => $ this -> invisible_attribute
];
}
在建立索引之前,請確保已正確列出您的可見屬性。若要繞過 Laravel 施加的此安全性掩碼,您可以使用$this->attributes['invisible_attribute']
直接存取該屬性,即使該屬性不可見,但建議避免對模型中的屬性進行這種類型的存取。
您可以使用pushToIndex
實例方法觸發索引。
$ contact = Contact :: firstOrCreate ([ ' name ' => ' Jean ' ]);
$ contact -> pushToIndex ();
並使用removeFromIndex
實例方法觸發刪除。
$ contact = Contact :: firstOrCreate ([ ' name ' => ' Jean ' ]);
$ contact -> removeFromIndex ();
若要安全地重新索引所有記錄(索引到臨時索引 + 將臨時索引自動移至目前索引),請使用reindex
類別方法:
Contact :: reindex ();
若要重新索引所有記錄(就地,不刪除過時的記錄):
Contact :: reindex ( false );
若要在重新索引過程中設定設定:
Contact :: reindex ( true , true );
若要在重新索引和變更設定時保留您在 Algolia 儀表板上設定的設定:
Contact :: reindex ( true , true , true );
要實現每次對一批實體建立索引時呼叫的回呼:
Contact :: reindex ( true , true , false , function ( $ entities )
{
foreach ( $ entities as $ entity )
{
var_dump ( $ entity -> id ); // Contact::$id
}
});
若要清除索引,請使用clearIndices
類別方法:
Contact :: clearIndices ( ) ;
您可以使用$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 '
]
]
];
}
要使用副本進行搜索,請使用以下程式碼:
Book :: search ( ' foo bar ' , [ ' index ' => ' contacts_desc ' ]);
您可以使用$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 ;
}
}
要使用額外索引進行搜索,請使用以下程式碼:
Book :: search ( ' foo bar ' , [ ' index ' => ' contacts_private ' ]);
正在做:
Ad :: where ( ' id ' , $ id )-> update ( $ attributes );
不會觸發模型中的任何內容(因此 Algolia 中不會發生任何更新)。這是因為它不是 Eloquent 呼叫。它只是產生隱藏在模型後面的查詢的便捷方法。
要使此查詢與 Algolia 一起使用,您需要這樣做:
Ad :: find ( $ id )-> update ( $ attributes );
與 5.x 應用程式相容