algolia/algoliasearch-client-php
Official Algolia Search API client for PHP (8.0+). A thin, low-level HTTP SDK to index, update, and search records, manage indices, and interact with Algolia’s APIs. Install via Composer and start using SearchClient with your App ID and API key.
Installation:
composer require algolia/algoliasearch-client-php "^4.43"
Verify PHP version compatibility (^8.0 required).
First Use Case:
Initialize the client in config/services.php:
'algolia' => [
'app_id' => env('ALGOLIA_APP_ID'),
'api_key' => env('ALGOLIA_API_KEY'),
'index_prefix' => env('ALGOLIA_INDEX_PREFIX', ''),
],
Create a helper facade in app/Providers/AppServiceProvider.php:
use Algolia\AlgoliaSearch\SearchClient;
use Illuminate\Support\Facades\Facade;
Facade::register('Algolia', function () {
return SearchClient::create(config('algolia.app_id'), config('algolia.api_key'));
});
Basic Indexing:
$response = Algolia::saveObject('products', [
'objectID' => '123',
'name' => 'Laravel T-Shirt',
'price' => 19.99
]);
src/Api/ directory for low-level API methods (e.g., SearchApi, IndexingApi).Index Management:
// Create/update index settings
Algolia::setSettings('products', ['searchableAttributes' => ['name', 'description']]);
// Delete index
Algolia::deleteIndex('products');
Batch Operations:
// Partial update
Algolia::partialUpdateObject('products', '123', ['price' => 24.99]);
// Batch indexing
Algolia::saveObjects('products', [
['objectID' => '1', 'name' => 'Item 1'],
['objectID' => '2', 'name' => 'Item 2']
]);
Search with Facets:
$results = Algolia::search([
'indexName' => 'products',
'query' => 'laravel',
'facets' => ['category', 'price_range'],
'hitsPerPage' => 20
]);
Async Task Handling:
$taskId = $response['taskID']; // From saveObject/saveObjects
Algolia::waitForTask('products', $taskId, 5); // Timeout: 5s
Ingestion API Workflows (Updated in 4.43.1) Leverage the fixed Ingestion API for advanced ingestion workflows:
// Use the updated destination payload structure
$ingestionApi = Algolia::getIngestionApi();
$response = $ingestionApi->pushItems('products', [
['objectID' => '1', 'name' => 'Item 1', 'destination' => ['index' => 'products']]
]);
Composition API Workflows (4.43.0) Leverage the improved Composition API for advanced indexing:
// Define a rule for composition
$rule = new \Algolia\AlgoliaSearch\Api\CompositionApi\Rule([
'id' => 'rule_1',
'conditions' => [['field' => 'category', 'operator' => '==', 'value' => 'electronics']],
]);
// Run composition with feedsOrder
$compositionResponse = Algolia::runComposition('products', [
'rules' => [$rule],
'feedsOrder' => ['feed_1', 'feed_2'],
]);
Scout Integration:
Use algolia/scout-extended for Eloquent model indexing:
use Algolia\ScoutExtended\ScoutExtendedServiceProvider;
ScoutExtendedServiceProvider::configure(function ($config) {
$config->algolia = [
'app_id' => config('algolia.app_id'),
'api_key' => config('algolia.api_key'),
'index_prefix' => config('algolia.index_prefix'),
];
});
Query Builder: Extend Laravel’s query builder for Algolia searches:
use Algolia\AlgoliaSearch\SearchClient;
class AlgoliaQueryBuilder extends Builder {
public function algoliaSearch($query) {
$results = SearchClient::search([
'indexName' => $this->getModel()->getAlgoliaIndex(),
'query' => $query,
]);
return $this->model->hydrate($results['hits']);
}
}
Middleware for API Keys: Secure API keys in middleware:
public function handle($request, Closure $next) {
config(['algolia.api_key' => $request->user()->algolia_api_key]);
return $next($request);
}
Custom HTTP Client: Override the default HTTP client for logging/retries:
use Algolia\AlgoliaSearch\Configuration;
use Algolia\AlgoliaSearch\Transport\CurlHttpClient;
$config = Configuration::create(config('algolia.app_id'), config('algolia.api_key'));
$config->setHttpClient(new CustomCurlHttpClient());
$client = new SearchClient($config);
Retry Strategy: Configure retries for transient failures:
$config = Configuration::create(config('algolia.app_id'), config('algolia.api_key'));
$config->setRetryStrategy([
'max_retries' => 3,
'delay' => 100, // ms
]);
Logging: Enable debug logging:
$config = Configuration::create(config('algolia.app_id'), config('algolia.api_key'));
$config->setDebug(true);
Ingestion API with Native Connector (Updated in 4.43.1) Use the fixed native connector for ingestion workflows:
$connector = new \Algolia\AlgoliaSearch\Api\IngestionApi\AlgoliaIndexConnector(
'products',
config('algolia.app_id'),
config('algolia.api_key')
);
$connector->pushItems([['objectID' => '1', 'name' => 'Item 1', 'destination' => ['index' => 'products']]]);
API Key Permissions:
search-only keys for frontend searches (no write access).admin keys for backend operations (indexing, settings).403 Forbidden error often means insufficient API key permissions.Rate Limits:
429 Too Many Requests with retries:
try {
$client->search(...);
} catch (\Algolia\AlgoliaSearch\Exceptions\RateLimitExceededException $e) {
sleep($e->getRetryAfter());
retry();
}
Async Task Timeouts:
waitForTask() defaults to 30s timeout. Adjust as needed:
Algolia::waitForTask('products', $taskId, 10); // 10s timeout
Index Naming:
index_prefix in config to avoid naming collisions in multi-tenant apps.Pagination:
page and hitsPerPage for pagination. Avoid offset for large datasets (use cursor-based pagination instead).Empty String Validation (New in 4.43.1):
// This will throw an exception
Algolia::saveObject('products', [
'objectID' => '', // Empty string will fail validation
'name' => 'Item'
]);
Ingestion API Destination Payload (Fixed in 4.43.1):
destination payload is correctly formatted when using the Ingestion API:
// Correct format
How can I help you explore Laravel packages today?