Laravel Packages

PostgreSQL Full Text Search for Laravel Scout

Published
PostgreSQL Full Text Search for Laravel Scout image

This package makes it easy to use native PostgreSQL Full Text Search capabilities with Laravel Scout:

// plainto_tsquery()
$posts = App\Post::search('cat rat')
->usingPlainQuery()->get()
 
// phraseto_tsquery()
$posts = App\Post::search('cat rat')
->usingPhraseQuery()->get()
 
// to_tsquery()
$posts = App\Post::search('fat & (cat | rat)')
->usingTsQuery()->get()
 
// websearch_to_tsquery()
// uses web search syntax
$posts = App\Post::search('"sad cat" or "fat rat" -mouse')
->usingWebSearchQuery()->get()
 
// DIY using a callback
use ScoutEngines\Postgres\TsQuery\ToTsQuery;
 
$results = App\Post::search('fat & (cat | rat)', function ($builder, $config) {
return new ToTsQuery($builder->query, $config);
})->get();

And here's an example model:

class Post extends Model
{
use Searchable;
 
// Configurable search data...
// Bring other data (i.e., tags) to the index document
public function toSearchableArray()
{
return [
'title' => $this->title,
'content' => $this->content,
'author' => $this->user->name,
'tags' => $this->tags->pluck('tag')->implode(' '),
];
}
 
public function searchableOptions()
{
return [
// Model search config for index settings, rank, etc.
];
}
}

The way this integration works is that the parsed document model data is stored in the same table in the searchable column with the tsvector type. You can fine-tune how each model works by integrating a searchableOptions() method, which allows you to:

  • Configurable column name (default is searchable)
  • Rank groups can be assigned to fields in the table
  • Rank weights are configurable for each rank group
  • Configurable ranking function to use (ts_rank or ts_rank_cd)
  • Rank normailzation
  • And more...

You can learn more about this package, get full installation instructions, and view the source code on GitHub.

Paul Redmond photo

Staff writer at Laravel News. Full stack web developer and author.

Sponsored

masteringlaravel logo
Laravel Code Review

Get expert guidance in a few days with a Laravel code review

Visit Laravel Code Review

The latest

View all →
WhenMounted and BigInt Props in Inertia.js v3.8 image

WhenMounted and BigInt Props in Inertia.js v3.8

Read article
Postcodes for Laravel: GB Postcode Lookup and Geography Data image

Postcodes for Laravel: GB Postcode Lookup and Geography Data

Read article
Laravel 14 Adds a defaults() Method to Eloquent Models image

Laravel 14 Adds a defaults() Method to Eloquent Models

Read article
Laravel AI SDK and Laravel MCP Security Fixes: Update Now image

Laravel AI SDK and Laravel MCP Security Fixes: Update Now

Read article
Mailbox for Laravel: Preview and Test Rendered Email image

Mailbox for Laravel: Preview and Test Rendered Email

Read article
Count Worker Crashes as Job Exceptions in Laravel 13.34 image

Count Worker Crashes as Job Exceptions in Laravel 13.34

Read article