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 应用程序兼容