Download the PHP package linshunwei/laravel-scout-elasticsearch without Composer
On this page you can find all versions of the php package linshunwei/laravel-scout-elasticsearch. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.
Download linshunwei/laravel-scout-elasticsearch
More information about linshunwei/laravel-scout-elasticsearch
Files in linshunwei/laravel-scout-elasticsearch
Package laravel-scout-elasticsearch
Short Description The Elasticsearch Driver for Laravel Scout
License MIT
Homepage https://github.com/linshunwei/laravel-scout-elasticsearch
Informations about the package laravel-scout-elasticsearch
laravel-scout-elasticsearch
This package offers advanced functionality for searching and filtering data in Elasticsearch. Check out its features!
Contents
- Features
- Requirements
- Installation
- Configuration
- Index configurator
- Searchable model
- Usage
- Console commands
- Search rules
- Available filters
- Zero downtime migration
- Debug
Features
- An easy way to create an Elasticsearch index.
- A fully configurable mapping for each model.
- A possibility to add a new field to an existing mapping the artisan command.
- Lots of different ways to implement your search algorithm: using raw search.
- Various filter types to make a search query more specific.
- Zero downtime migration from an old index to a new index.
- Bulk indexing, see the configuration section.
Requirements
The package has been tested in the following configuration:
- PHP version >= 7.1.3
- Laravel Framework version >= 5.6
- Elasticsearch version >= 6
Installation
Use composer to install the package:
If you are using Laravel version <= 5.4 or the package discovery
is disabled, add the following providers in config/app.php
:
Configuration
To configure the package you need to publish settings first:
Then, set the driver setting to elastic
in the config/scout.php
file and configure the driver itself in the config/scout_elastic.php
file.
The available options are:
Option | Description |
---|---|
client | A setting hash to build Elasticsearch client. More information you can find here. By default the host is set to localhost:9200 . |
update_mapping | The option that specifies whether to update a mapping automatically or not. By default it is set to true . |
indexer | Set to single for the single document indexing and to bulk for the bulk document indexing. By default is set to single . |
document_refresh | This option controls when updated documents appear in the search results. Can be set to 'true' , 'false' , 'wait_for' or null . More details about this option you can find here. By default set to null . |
Note, that if you use the bulk document indexing you'll probably want to change the chunk size, you can do that in the config/scout.php
file.
Index configurator
An index configurator class is used to set up settings for an Elasticsearch index. To create a new index configurator use the following artisan command:
It'll create the file MyIndexConfigurator.php
in the app
folder of your project.
You can specify index name and settings like in the following example:
More about index settings you can find in the index management section of Elasticsearch documentation.
To create an index just run the artisan command:
Note, that every searchable model requires its own index configurator.
Indices created in Elasticsearch 6.0.0 or later may only contain a single mapping type. Indices created in 5.x with multiple mapping types will continue to function as before in Elasticsearch 6.x. Mapping types will be completely removed in Elasticsearch 7.0.0.
You can find more information here.
Searchable model
To create a model with the ability to perform search requests in an Elasticsearch index use the command:
After executing the command you'll find the file MyModel.php
in you app
folder:
Each searchable model represents an Elasticsearch type.
By default a type name is the same as a table name, but you can set any type name you want through the searchableAs
method.
You can also specify fields which will be indexed by the driver through the toSearchableArray
method.
More information about these options you will find in the scout official documentation.
The last important option you can set in the MyModel
class is the $searchRules
property.
It allows you to set different search algorithms for a model.
We'll take a closer look at it in the search rules section.
After setting up a mapping in your model you can update an Elasticsearch type mapping:
Usage
Once you've created an index configurator, an Elasticsearch index itself and a searchable model, you are ready to go. Now you can index and search data according to the documentation.
Basic search usage example:
If you only need the number of matches for a query, use the count
method:
If you need to load relations, use the with
method:
In addition to standard functionality the package offers you the possibility to filter data in Elasticsearch without specifying a query string:
Also you can override model search rules:
And use variety of where
conditions:
At last, if you want to send a custom request, you can use the searchRaw
method:
This query will return raw response.
Console commands
Available artisan commands are listed below:
Command | Arguments | Description |
---|---|---|
make:index-configurator | name - The name of the class |
Creates a new Elasticsearch index configurator. |
make:searchable-model | name - The name of the class |
Creates a new searchable model. |
make:search-rule | name - The name of the class |
Creates a new search rule. |
elastic:create-index | index-configurator - The index configurator class |
Creates an Elasticsearch index. |
elastic:update-index | index-configurator - The index configurator class |
Updates settings and mappings of an Elasticsearch index. |
elastic:drop-index | index-configurator - The index configurator class |
Drops an Elasticsearch index. |
elastic:update-mapping | model - The model class |
Updates a model mapping. |
elastic:migrate | model - The model class, target-index - The index name to migrate |
Migrates model to another index. |
For detailed description and all available options run php artisan help [command]
in the command line.
Search rules
A search rule is a class that describes how a search query will be executed. To create a search rule use the command:
In the file app/MySearchRule.php
you will find a class definition:
You can read more about bool queries here and about highlighting here.
The default search rule returns the following payload:
This means that by default when you call search
method on a model it tries to find the query string in any field.
To determine default search rules for a model just add a property:
You can also set a search rule in a query builder:
To retrieve highlight, use model highlight
attribute:
Available filters
You can use different types of filters:
Method | Example | Description |
---|---|---|
where($field, $value) | where('id', 1) | Checks equality to a simple value. |
where($field, $operator, $value) | where('id', '>=', 1) | Filters records according to a given rule. Available operators are: =, <, >, <=, >=, <>. |
whereIn($field, $value) | where('id', [1, 2, 3]) | Checks if a value is in a set of values. |
whereNotIn($field, $value) | whereNotIn('id', [1, 2, 3]) | Checks if a value isn't in a set of values. |
whereBetween($field, $value) | whereBetween('price', [100, 200]) | Checks if a value is in a range. |
whereNotBetween($field, $value) | whereNotBetween('price', [100, 200]) | Checks if a value isn't in a range. |
whereExists($field) | whereExists('unemployed') | Checks if a value is defined. |
whereNotExists($field) | whereNotExists('unemployed') | Checks if a value isn't defined. |
whereRegexp($field, $value, $flags = 'ALL') | whereRegexp('name.raw', 'A.+') | Filters records according to a given regular expression. Here you can find more about syntax. |
whereGeoDistance($field, $value, $distance) | whereGeoDistance('location', [-70, 40], '1000m') | Filters records according to given point and distance from it. Here you can find more about syntax. |
whereGeoBoundingBox($field, array $value) | whereGeoBoundingBox('location', ['top_left' => [-74.1, 40.73], 'bottom_right' => [-71.12, 40.01]]) | Filters records within given boundings. Here you can find more about syntax. |
whereGeoPolygon($field, array $points) | whereGeoPolygon('location', [[-70, 40],[-80, 30],[-90, 20]]) | Filters records within given polygon. Here you can find more about syntax. |
whereGeoShape($field, array $shape) | whereGeoShape('shape', ['type' => 'circle', 'radius' => '1km', 'coordinates' => [4, 52]]) | Filters records within given shape. Here you can find more about syntax. |
In most cases it's better to use raw fields to filter records, i.e. not analyzed fields.
按距离排序
Zero downtime migration
As you might know, you can't change the type of already created field in Elasticsearch.
The only choice in such case is to create a new index with necessary mapping and import your models into the new index.
A migration can take quite a long time, so to avoid downtime during the process the driver reads from the old index and writes to the new one.
As soon as migration is over it starts reading from the new index and removes the old index.
This is how the artisan elastic:migrate
command works.
Before you run the command, make sure that your index configurator uses the ScoutElastic\Migratable
trait.
If it's not, add the trait and run the artisan elastic:update-index
command using your index configurator class name as an argument:
When you are ready, make changes in the model mapping and run the elastic:migrate
command using the model class as the first argument and desired index name as the second argument:
Note, that if you need just to add new fields in your mapping, use the elastic:update-mapping
command.
Debug
There are two methods that can help you to analyze results of a search query:
Both methods return raw data from ES.
Besides, you can get a query payload that will be sent to ES, by calling the buildPayload
method.
Note, that this method returns a collection of payloads, because of possibility of using multiple search rules in one query.