Algolia Search は、最初のキーストロークからリアルタイムの結果を提供できる、ホスト型の全文検索、数値検索、およびファセット検索エンジンです。
このパッケージは非推奨です。Laravel Scout を使用することをお勧めします。 Scout の機能を拡張したい場合は、専用のドキュメントを参照してください。
この PHP パッケージは、Algolia Search API を Laravel Eloquent ORM に統合します。これは algoliasearch-client-php パッケージに基づいています。
注: Laravel 4 を使用している場合は、algoliasearch-laravel-4 リポジトリをチェックアウトしてください。
完全なリファレンスは Algolia の Web サイトでご覧いただけます。
インストール
クイックスタート
オプション
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
メソッドを使用して、設定をアルゴリアに伝播 (保存) できます。
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
作成することで、これら 2 つのパラメーターの動的な条件を作成することもできます。
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 でこれら 2 つのメソッドを定義する場合は注意してください。これらのメソッドを親クラスに配置すると、子クラスで使用されると、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 はモデルの表示属性のみにアクセスできます。したがって、たとえば、このコード例を使用すると、 invisible_attribute
キーが空/null 変数を返すため、 No content in PUT request
という例外が発生します。
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 アプリケーションとの互換性