v4.2.0
This release marks a version bump within the 4.x branch committed to Laravel 10 & 11 compatibility. There are no breaking changes from 4.1.x
This version introduces query-building methods to allow matching across multiple fields: ES docs
The current search builder works in isolation for full-text searching; this upgrade brings those features into the standard query builder that will run like a normal query. Meaning you can:
get(), first(), aggregate(), paginate() etc on full text search results. In time, this will replace the current search methods like: Book::term('Eric')->search();
Methods
searchTerm($term, $fields = ['*'], $options = []) - type: best_fields
searchTermMost($term, $fields = ['*'], $options = []) type: most_fields
searchTermCross($term, $fields = ['*'], $options = []) type: cross_fields
searchPhrase($phrase, $fields = ['*'], $options = []) type: phrase
searchPhrasePrefix($phrase, $fields = ['*'], $options = []) type: phrase_prefix
searchBoolPrefix($phrase, $fields = ['*'], $options = []) type: bool_prefix
Each method has a corresponding OR version, ex orSearchPhrase('Laravel Elasticsearch')
These methods will introduce an Elasticsearch score and will be ordered by score by default.
$fields: By default, all fields will be searched through; you can specify which as well as boost certain fields, ex:
People:searchTerm('John',['name^3','description^2','friends.name'])->get();$options: Allows you to set any options for the multi_match clause to use, ex:
analyzer, boost, operator, minimum_should_match, fuzziness, lenient, prefix_length, max_expansions, fuzzy_rewrite, zero_terms_query.
searchFor($value) is a convenience method that will either use term or phrase depending on the word count of $value
withHighlights($fields = [], $preTag = '<em>', $postTag = '</em>', $globalOptions = [])
- Will highlight the same way as https://elasticsearch.pdphilip.com/full-text-search#highlighting
Option helpers
asFuzzy()
- Will mark the previous clause as fuzzy
setMinShouldMatch(int $value)
- will set the option
{"minimum_should_match": $value}to the previous clause
setBoost(int $value)
- will set the option
{"boost": $value}to the previous clause
Examples
Product::searchTerm('remarkble')->asFuzzy()->withHighlights()->get();
Product::searchPhrasePrefix('coffee bea')->where('is_active',true)->paginate();
Product::searchPhrase('United States')->orSearchPhrase('United Kingdom')->sum('orders');Upgrades
find($id), findOrFail($id) and findOrNew($id) now uses the ES get call directly ie: /my_index/_doc/my_id
- With
findOrNew($id): If the $id was not found, then it will return a new model instance with the $id value as provided - Credit @use-the-fork via #41
Full Changelog: v4.1.1...v4.2.0