• This repository has been archived on 01/Aug/2018
  • Stars
    star
    239
  • Rank 162,440 (Top 4 %)
  • Language
    PHP
  • License
    MIT License
  • Created almost 9 years ago
  • Updated about 6 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

[Deprecated] We now recommend using Laravel Scout, see =>

[DEPRECATED] Algolia Search API Client for Laravel

Algolia Search is a hosted full-text, numerical, and faceted search engine capable of delivering realtime results from the first keystroke.


This package is deprecated, we recommend you to use Laravel Scout. If you want to extend Scout capabilities, please refer to our dedicated documentation


Build Status Latest Version License

This PHP package integrates the Algolia Search API into the Laravel Eloquent ORM. It's based on the algoliasearch-client-php package.

Note: If you're using Laravel 4, checkout the algoliasearch-laravel-4 repository.

API Documentation

You can find the full reference on Algolia's website.

Table of Contents

  1. Install

  2. Quick Start

  3. Options

  4. Relationships

  5. Indexing

  6. Manage indices

  7. Eloquent compatibility

Install

Install via composer

Add algolia/algoliasearch-laravel to your composer.json file:

composer require algolia/algoliasearch-laravel

Service provider

Add the service provider to config/app.php in the providers array.

AlgoliaSearch\Laravel\AlgoliaServiceProvider::class

Publish vendor

Laravel Algolia requires a connection configuration. To get started, you'll need to publish all vendor assets:

php artisan vendor:publish

You can add the --provider="Vinkla\Algolia\AlgoliaServiceProvider" option to only publish assets of the Algolia package.

This will create a config/algolia.php file in your app that you can modify to set your configuration. Also, make sure you check for changes compared to the original config file after an upgrade.

Quick Start

Quick Start

The following code adds search capabilities to your Contact model creating a Contact index:

use Illuminate\Database\Eloquent\Model;
use AlgoliaSearch\Laravel\AlgoliaEloquentTrait;

class Contact extends Model
{
    use AlgoliaEloquentTrait;
}

By default all visible attributes are sent. If you want to send specific attributes you can do something like:

use Illuminate\Database\Eloquent\Model;

class Contact extends Model
{
    use AlgoliaEloquentTrait;

    public function getAlgoliaRecord()
    {
        return array_merge($this->toArray(), [
            'custom_name' => 'Custom Name'
        ]);
    }
}

After setting up your model, you need to manually do an initial import of your data. You can do this by calling reindex on your model class. Using our previous example, this would be:

Contact::reindex();

Ranking & Relevance

We provide many ways to configure your index settings to tune the overall relevancy, but the most important ones are the searchable attributes and the attributes reflecting the record popularity. You can configure them with the following code:

use Illuminate\Database\Eloquent\Model;

class Contact extends Model
{
    use AlgoliaEloquentTrait;

    public $algoliaSettings = [
        'searchableAttributes' => [
            'id',
            'name',
        ],
        'customRanking' => [
            'desc(popularity)',
            'asc(name)',
        ],
    ];
}

You can propagate (save) the settings to algolia by using the setSetting method:

Contact::setSettings();

Synonyms

Synonyms are used to tell the engine about words or expressions that should be considered equal in regard to the textual relevance.

Our synonyms API has been designed to manage as easily as possible a large set of synonyms for an index and its replicas.

You can use the synonyms API by adding a synonyms in $algoliaSettings class property like this:

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']
            ]
        ]
    ];
}

You can propagate (save) the settings to algolia using the setSetting method:

Contact::setSettings();

Frontend Search (realtime experience)

Traditional search implementations tend to have search logic and functionality on the backend. This made sense when the search experience consisted of a user entering a search query, executing that search, and then being redirected to a search result page.

Implementing search on the backend is no longer necessary. In fact, in most cases it is harmful to performance because of the extra network and processing latency. We highly recommend the usage of our JavaScript API Client issuing all search requests directly from the end user's browser, mobile device, or client. It will reduce the overall search latency while offloading your servers at the same time.

In your JavaScript code you can do:

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 });

Backend Search

You could also use the search method, but it's not recommended to implement an instant/realtime search experience from the backend (having a frontend search gives a better user experience):

Contact::search('jon doe');

Options

Auto-indexing & Asynchronism

Each time a record is saved; it will be - asynchronously - indexed. On the other hand, each time a record is destroyed, it will be - asynchronously - removed from the index.

You can disable the auto-indexing and auto-removing by setting the following options:

use Illuminate\Database\Eloquent\Model;

class Contact extends Model
{
    use AlgoliaEloquentTrait;

    public static $autoIndex = false;
    public static $autoDelete = false;
}

You can temporarily disable auto-indexing. This is often done for performance reasons.

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;

You can also make a dynamic condition for those two parameters by creating an autoIndex and/or autoDelete method on your model

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;
    }
}

Be careful to define those two methods in AlgoliaEloquentTrait. When putting those methods in a parent class they will be "erased" by AlgoliaEloquentTrait if used in a child class (because of php inheritance).

Custom Index Name

By default, the index name will be the pluralized class name, e.g. "Contacts". You can customize the index name by using the $indices option:

use Illuminate\Database\Eloquent\Model;

class Contact extends Model
{
    use AlgoliaEloquentTrait;

    public $indices = ['contact_all'];
}

Per-environment Indexes

You can suffix the index name with the current App environment using the following option:

use Illuminate\Database\Eloquent\Model;

class Contact extends Model
{
    use AlgoliaEloquentTrait;

    public static $perEnvironment = true; // Index name will be 'Contacts_{\App::environnement()}';
}

Custom objectID

By default, the objectID is based on your record's keyName (id by default). You can change this behavior specifying the objectIdKey option (be sure to use a uniq field).

use Illuminate\Database\Eloquent\Model;

class Contact extends Model
{
    use AlgoliaEloquentTrait;

    public static $objectIdKey = 'new_key';
}

Restrict Indexing to a Subset of Your Data

You can add constraints controlling if a record must be indexed by defining the indexOnly() method.

use Illuminate\Database\Eloquent\Model;

class Contact extends Model
{
    use AlgoliaEloquentTrait;

    public function indexOnly($index_name)
    {
        return (bool) $condition;
    }
}

Relationships

Relationships

By default the Algolia package will fetch the loaded relationships.

If you want to index records that haven't yet loaded any relations, you can do it by loading them in the getAlgoliaRecord that you can create in your model.

It will look like:

public function getAlgoliaRecord()
{
    /**
     * Load the categories relation so that it's available
     *  in the laravel toArray method
     */
    $this->categories;

   return $this->toArray();
}

In the resulted object, you will have categories converted to array by Laravel. If you want a custom relation structure you will instead do something like:

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);
}

Indexing

Visibility

By default, Algolia will only be able to access visible attributes of your model. So, for example, you will receive a No content in PUT request exception when using this example code, because invisible_attribute key returns an empty/null variable.

protected $visible = ['visible_attribute', 'other_visible_attribute'];

public function getAlgoliaRecord()
{
    return [
        'invisible_attribute' => $this->invisible_attribute
    ];
}

Before Indexing, be sure to have correctly listed your visible attributes. To bypass this safety mask imposed by Laravel, you may use $this->attributes['invisible_attribute'] to access directly to the attribute even if is not visible, but the recommendation is to avoid this type of access to attributes in your Model.

Manual Indexing

You can trigger indexing using the pushToIndex instance method.

$contact = Contact::firstOrCreate(['name' => 'Jean']);
$contact->pushToIndex();

Manual Removal

And trigger the removal using the removeFromIndex instance method.

$contact = Contact::firstOrCreate(['name' => 'Jean']);
$contact->removeFromIndex();

Reindexing

To safely reindex all your records (index to a temporary index + move the temporary index to the current one atomically), use the reindex class method:

Contact::reindex();

To reindex all your records (in place, without deleting outdated records):

Contact::reindex(false);

To set settings during the reindexing process:

Contact::reindex(true, true);

To keep settings that you set on the Algolia dashboard when reindexing and changing settings:

Contact::reindex(true, true, true);

To implement a callback that gets called everytime a batch of entities is indexed:

Contact::reindex(true, true, false, function ($entities)
{
    foreach ($entities as $entity)
    {
        var_dump($entity->id); // Contact::$id
    }
});

Clearing an Index

To clear an index, use the clearIndices class method:

Contact::clearIndices();

Manage indices

Primary/Replica

You can define replica indexes using the $algolia_settings variable:

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'
            ]
        ]
    ];
}

To search using a replica, use the following code:

Book::search('foo bar', ['index' => 'contacts_desc']);

Target Multiple Indexes

You can index a record in several indexes using the $indices property:

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;
    }

}

To search using an extra index, use the following code:

Book::search('foo bar', ['index' => 'contacts_private']);

Eloquent compatibility

Eloquent compatibility

Doing:

Ad::where('id', $id)->update($attributes);

will not trigger anything in the model (so no update will happen in Algolia). This is because it is not an Eloquent call. It is just a convenient way to generate the query hidden behind the model.

To make this query work with Algolia you need to do it like this:

Ad::find($id)->update($attributes);

Compatibility

Compatible with 5.x applications

More Repositories

1

places

๐ŸŒ Turn any <input> into an address autocomplete
JavaScript
5,372
star
2

autocomplete

๐Ÿ”ฎ Fast and full-featured autocomplete library
TypeScript
4,668
star
3

docsearch

๐Ÿ“˜ The easiest way to add search to your documentation.
TypeScript
3,748
star
4

instantsearch

โšก๏ธ Libraries for building performant and instant search experiences with Algolia. Compatible with JavaScript, TypeScript, React and Vue.
TypeScript
3,468
star
5

react-instantsearch

โšก๏ธ Lightning-fast search for React and React Native applications, by Algolia.
TypeScript
1,973
star
6

algoliasearch-client-javascript

โšก๏ธ A fully-featured and blazing-fast JavaScript API client to interact with Algolia.
TypeScript
1,259
star
7

github-awesome-autocomplete

:octocat: Add instant search capabilities to GitHub's search bar
JavaScript
1,062
star
8

vue-instantsearch

๐Ÿ‘€ Algolia components for building search UIs with Vue.js
JavaScript
856
star
9

shipjs

Take control of what is going to be your next release.
JavaScript
749
star
10

awesome-algolia

๐Ÿ”๐Ÿ‘‹ START HERE! A curated list of Algolia libraries, resources and projects.
681
star
11

algoliasearch-client-php

โšก๏ธ A fully-featured and blazing-fast PHP API client to interact with Algolia.
PHP
661
star
12

instantsearch-ios

โšก๏ธ A library of widgets and helpers to build instant-search applications on iOS.
Swift
573
star
13

voice-overlay-ios

๐Ÿ—ฃ An overlay that gets your userโ€™s voice permission and input as text in a customizable UI
Swift
535
star
14

hn-search

Hacker News Search
TypeScript
489
star
15

react-element-to-jsx-string

Turn a ReactElement into the corresponding JSX string
JavaScript
478
star
16

docsearch-configs

DocSearch - Configurations
JavaScript
454
star
17

sup3rS3cretMes5age

Simple to use, simple to deploy, one time self destruct messaging service, with hashicorp vault as a backend
Go
445
star
18

expect-jsx

โœ… toEqualJSX for expect assertion library
JavaScript
410
star
19

algoliasearch-rails

AlgoliaSearch integration to your favorite ORM
Ruby
398
star
20

scout-extended

Scout Extended: The Full Power of Algolia in Laravel
PHP
382
star
21

algoliasearch-wordpress

โŒ๐Ÿ—‘๐Ÿ™…โ€โ™‚๏ธ Algolia Search plugin for WordPress is no longer supported. Please use our API client guide instead
JavaScript
355
star
22

docsearch-scraper

DocSearch - Scraper
Python
293
star
23

color-extractor

Extract the dominant color(s) of your fashion articles!
Python
271
star
24

algoliasearch-netlify

Official Algolia Plugin for Netlify. Index your website to Algolia when deploying your project to Netlify with the Algolia Crawler
TypeScript
260
star
25

angular-instantsearch

โšก๏ธLightning-fast search for Angular apps, by Algolia
TypeScript
255
star
26

voice-overlay-android

๐Ÿ—ฃ An overlay that gets your userโ€™s voice permission and input as text in a customizable UI
Kotlin
243
star
27

jekyll-algolia

Add fast and relevant search to your Jekyll site
Ruby
211
star
28

algoliasearch-client-swift

โšก๏ธ A fully-featured and blazing-fast Swift API client to interact with Algolia.
Swift
203
star
29

algoliasearch-client-go

โšก๏ธ A fully-featured and blazing-fast Go API client to interact with Algolia.
Go
193
star
30

algoliasearch-client-python

โšก๏ธ A fully-featured and blazing-fast Python API client to interact with Algolia.
Python
192
star
31

search-bundle

Seamless integration of Algolia Search into your Symfony project.
PHP
191
star
32

atom-autocomplete-module-import

โš›๏ธ Search & install npm packages from import/require statements.
JavaScript
182
star
33

gatsby-plugin-algolia

A plugin to push to Algolia based on graphQl queries
JavaScript
176
star
34

algoliasearch-helper-js

Helper for implementing advanced search features with Algolia
JavaScript
174
star
35

datasets

Interesting datasets you could use with Algolia
173
star
36

youtube-captions-scraper

Fetch youtube user submitted or fallback to auto-generated captions
JavaScript
173
star
37

algoliasearch-django

Seamless integration of Algolia into your Django project.
Python
167
star
38

algoliasearch-client-ruby

โšก๏ธ A fully-featured and blazing-fast Ruby API client to interact with Algolia.
Ruby
166
star
39

algoliasearch-magento-2

Algolia Search integration for Magento 2 - compatible with versions from 2.3.x to 2.4.x
PHP
156
star
40

instantsearch-android

A library of widgets and helpers to build instant-search applications on Android.
Kotlin
153
star
41

pwa-ecom-ui-template

React/Next.js based starter kit, focused on delivering a rich Search & Discovery e-commerce experience.
TypeScript
145
star
42

instant-search-demo

Instant-search demo (facets, sliders, paginations & more)
CSS
140
star
43

npm-search

๐Ÿ—ฟ npm โ†”๏ธ Algolia replication tool โ›ท๏ธ ๐ŸŒ ๐Ÿ›ฐ๏ธ
TypeScript
127
star
44

algoliasearch-jekyll

โš  DEPRECATED Use jekyll-algolia instead.
Ruby
124
star
45

algoliasearch-client-csharp

โšก๏ธ A fully-featured and blazing-fast C# API client to interact with Algolia.
C#
113
star
46

kubernetes-hands-on

Kubernetes Hands-on by Algolia
110
star
47

firestore-algolia-search

TypeScript
108
star
48

frontman

๐Ÿ’Ž A Ruby-based static website generator
Ruby
107
star
49

create-instantsearch-app

โšก๏ธ Build InstantSearch apps at the speed of thought
JavaScript
107
star
50

algoliasearch-client-android

Algolia Search API Client for Android
Java
98
star
51

faux-jax

NO MORE MAINTAINED: Intercept and respond to requests in the browser (AJAX) and Node.js (http(s) module)
JavaScript
96
star
52

cli

๐Ÿ” Algoliaโ€™s official CLI devtool
Go
94
star
53

algolia-cli-old

[DEPRECATED] This repo and npm package are no longer maintained or supported. The new official command line tool can be found here: https://github.com/algolia/cli
JavaScript
82
star
54

doc-code-samples

This repository holds the Algolia documentation big code samples like GeoSearch, Calendar...
TypeScript
82
star
55

rollup-jest-boilerplate

๐ŸŽ‰ Full featured boilerplate for building JavaScript libraries the modern way
JavaScript
80
star
56

marvel-search

Searchable list of all Marvel superheroes and supervillains
JavaScript
77
star
57

examples

Set of code samples highlighting the different ways to use the Algolia API
CSS
76
star
58

instantsearch-ios-examples

Example apps built with InstantSearch iOS
Swift
67
star
59

instantsearch-android-examples

Example apps built with algolia/instantsearch-android
Kotlin
63
star
60

algoliasearch-client-css

Algolia Search API Client for CSS
JavaScript
63
star
61

mongoolia

Keep your mongoose schemas synced with Algolia
JavaScript
58
star
62

algoliasearch-client-kotlin

โšก๏ธ A fully-featured and blazing-fast Kotlin/Android API client to interact with Algolia.
Kotlin
56
star
63

hn-reactnative-sample

Sample Hacker News Search app by Algolia based on React Native.
JavaScript
54
star
64

jest-serializer-html

Jest snapshot serializer that beautifies HTML.
JavaScript
51
star
65

search-insights.js

Library for reporting click, conversion and view metrics using the Algolia Insights API
TypeScript
51
star
66

redux-updeep

small reducer generator that uses updeep to immutably deep merge partial updates into the reducer's state
JavaScript
50
star
67

algoliasearch-alexa

๐Ÿ”Š Search by voice in Alexa, powered by Algolia
JavaScript
45
star
68

chunk-text

๐Ÿ”ช chunk/split a string by length without cutting/truncating words.
JavaScript
43
star
69

algoliasearch-client-java

โšก๏ธ A fully-featured and blazing-fast Java API client to interact with Algolia.
Java
43
star
70

react-nouislider

CSS
42
star
71

react-test-boilerplate

Companion project for Algolia's React unit testing blog post
JavaScript
41
star
72

demo-geo-search

Demo code illustrating the geo search features of Algolia
JavaScript
39
star
73

laravel-scout-algolia-macros

DEPRECATED: Use of this repository is deprecated. Please use Scout Extended - https://github.com/algolia/scout-extended instead.
PHP
39
star
74

algoliasearch-client-objc

Algolia Search API Client for iOS & OS X
Objective-C
38
star
75

algoliasearch-crawler-github-actions

Algolia Crawler Github action
TypeScript
38
star
76

docsearch-website

Previous repository for the DocSearch documentation website, now at https://github.com/algolia/docsearch/tree/next/packages/website
CSS
38
star
77

algoliasearch-client-node

DEPRECATED
36
star
78

wordpress-docker

Simple docker based environment for WordPress plugins and themes development.
Shell
36
star
79

algoliasearch-rails-example

AlgoliaSearch+Ruby on Rails examples
Ruby
36
star
80

elasticsearch-topk-plugin

Elasticsearch Top-K Aggregation Plugin
Java
35
star
81

algolia-sitemap

a node library allowing you to generate sitemaps from an Algolia index.
JavaScript
33
star
82

jekyll-algolia-example

Front-end example of the jekyll-algolia plugin
HTML
33
star
83

vue-instantsearch-examples

Examples for Vue InstantSearch v1, v2 links: https://github.com/algolia/vue-instantsearch-examples/issues/50
Shell
33
star
84

unified-instantsearch-ecommerce

The fastest way to implement Algolia, for e-commerce customers.
JavaScript
32
star
85

talksearch-scraper

Extract captions and metadata from YouTube playlists and push them to Algolia
JavaScript
31
star
86

diffable-html

Opinionated HTML formatter focused towards making HTML diffs readable.
JavaScript
30
star
87

algoliasearch-client-java-legacy

*DEPRECATED* Algolia Search API Client for Java, see https://github.com/algolia/algoliasearch-client-java-2
Java
30
star
88

api-clients-automation

๐Ÿค– Auto-generated Algolia API clients, specs and tests with โค๏ธ
PHP
30
star
89

recommend

A UI library for Algolia Recommend, available for Vanilla JavaScript and React.
TypeScript
28
star
90

eslint-config-algolia

Algolia's ESLint config and prettier instructions for JavaScript projects
JavaScript
27
star
91

talksearch

๐ŸŽค An interactive search experience for video titles and transcripts
JavaScript
25
star
92

algolia-firebase-nodejs

An example showing how to push data from Firebase to Algolia
JavaScript
24
star
93

algoliasearch-client-scala

โšก๏ธ A fully-featured and blazing-fast Scala API client to interact with Algolia.
Scala
24
star
94

redux-magic-async-middleware

redux-magic-async-middleware is a middleware which makes it easy to handle asynchronous data with redux
JavaScript
23
star
95

laravel-scout-settings

DEPRECATED: Use of this repository is deprecated. Please use Scout Extended - https://github.com/algolia/scout-extended instead.
PHP
23
star
96

pdrone

Control Parrot drones with JavaScript
JavaScript
23
star
97

algolia-swift-demo

iOS instant search tutorial
Swift
23
star
98

algolia-react-boilerplate

๐Ÿ”ฅ A highly scalable, and customizable boilerplate, made with ReactInstantSearchHooks and with many Algolia's features. Ready to configure and deploy. You have just to follow steps in readme file. ๐Ÿ’ฅ
JavaScript
23
star
99

algolia-coding-contest

Welcome to the first Algolia Coding Contest, until May 5th.
22
star
100

algoliasearch-django-example

Python
22
star