Algolia Search는 첫 번째 키 입력부터 실시간 결과를 제공할 수 있는 호스팅된 전체 텍스트, 숫자 및 패싯 검색 엔진입니다.
이 패키지는 더 이상 사용되지 않으므로 Laravel Scout 사용을 권장합니다 . Scout 기능을 확장하려면 전용 문서를 참조하세요.
이 PHP 패키지는 Algolia Search API를 Laravel Eloquent ORM에 통합합니다. 이는 algoliasearch-client-php 패키지를 기반으로 합니다.
참고: Laravel 4를 사용하는 경우 algoliasearch-laravel-4 저장소를 확인하세요.
Algolia 웹사이트에서 전체 참조 자료를 찾을 수 있습니다.
설치하다
빠른 시작
옵션
objectID
관계
인덱싱
인덱스 관리
뛰어난 호환성
composer.json
파일에 algolia/algoliasearch-laravel
추가합니다.
composer require algolia/algoliasearch-laravel
providers
배열의 config/app.php
에 서비스 공급자를 추가합니다.
AlgoliaSearch Laravel AlgoliaServiceProvider ::class
Laravel Algolia에는 연결 구성이 필요합니다. 시작하려면 모든 공급업체 자산을 게시해야 합니다.
php artisan vendor:publish
Algolia 패키지의 자산만 게시하려면 --provider="VinklaAlgoliaAlgoliaServiceProvider"
옵션을 추가할 수 있습니다.
이렇게 하면 구성을 설정하기 위해 수정할 수 있는 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 상속으로 인해).
기본적으로 인덱스 이름은 "연락처"와 같은 복수형 클래스 이름이 됩니다. $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 Call이 아니기 때문입니다. 이는 모델 뒤에 숨겨진 쿼리를 생성하는 편리한 방법일 뿐입니다.
이 쿼리를 Algolia에서 작동하게 하려면 다음과 같이 수행해야 합니다.
Ad :: find ( $ id )-> update ( $ attributes );
5.x 애플리케이션과 호환 가능