Algolia Search — это размещенная полнотекстовая, числовая и фасетная поисковая система, способная выдавать результаты в реальном времени с первого нажатия клавиши.
Этот пакет устарел, мы рекомендуем вам использовать Laravel Scout . Если вы хотите расширить возможности Scout, обратитесь к нашей специальной документации.
Этот пакет PHP интегрирует API поиска Algolia в Laravel Eloquent ORM. Он основан на пакете algoliasearch-client-php.
Примечание. Если вы используете Laravel 4, проверьте репозиторий algoliasearch-laravel-4.
Вы можете найти полную ссылку на веб-сайте Algolia.
Установить
Быстрый старт
Параметры
objectID
Отношения
Индексирование
Управление индексами
Красноречивая совместимость
Добавьте algolia/algoliasearch-laravel
в файл composer.json
:
composer require algolia/algoliasearch-laravel
Добавьте поставщика услуг в config/app.php
в массиве providers
.
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) ' ,
],
];
}
Вы можете распространить (сохранить) настройки в algolia, используя метод setSetting
:
Contact :: setSettings ();
Синонимы используются, чтобы сообщить движку о словах или выражениях, которые следует считать равными с точки зрения текстовой релевантности.
Наш API-интерфейс синонимов был разработан для максимально простого управления большим набором синонимов для индекса и его реплик.
Вы можете использовать API синонимов, добавив synonyms
в свойство класса $algoliaSettings
следующим образом:
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 ' ]
]
]
];
}
Вы можете распространить (сохранить) настройки в algolia, используя метод setSetting
:
Contact :: setSettings ();
Традиционные реализации поиска, как правило, имеют логику и функциональность поиска на серверной стороне. Это имело смысл, когда процесс поиска состоял из того, что пользователь вводил поисковый запрос, выполнял этот поиск, а затем был перенаправлен на страницу результатов поиска.
Реализация поиска на серверной стороне больше не требуется. Фактически, в большинстве случаев это вредно для производительности из-за дополнительной сети и задержки обработки. Мы настоятельно рекомендуем использовать наш клиент API JavaScript, отправляющий все поисковые запросы непосредственно из браузера, мобильного устройства или клиента конечного пользователя. Это уменьшит общую задержку поиска и одновременно разгрузит ваши серверы.
В вашем коде 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).
По умолчанию имя индекса будет представлять собой имя класса во множественном числе, например «Контакты». Вы можете настроить имя индекса, используя опцию $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
возвращает пустую/нулевую переменную.
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, вам нужно сделать это следующим образом:
Ad :: find ( $ id )-> update ( $ attributes );
Совместимость с приложениями 5.x.