Skip to main content

Search — Scout + Meilisearch

Full-text search across matters, clients, documents, and firm members using Laravel Scout with Meilisearch as the backend.


Searchable Models

ModelSearchable FieldsIndex Name
Mattertitle, case_number, descriptionmatters
Clientdisplay_name, company_name, emailclients
Documenttitle, description, categorydocuments
FirmUserProfiledisplay_name, job_title, practice_titlefirm_user_profiles

Model Configuration

// app/Models/Matter/Matter.php
use Laravel\Scout\Searchable;

class Matter extends Model
{
use Searchable;

public function toSearchableArray(): array
{
return [
'id' => $this->id,
'title' => $this->title,
'case_number' => $this->case_number,
'description' => $this->description,
'law_firm_id' => $this->law_firm_id, // for tenant filtering
'status' => $this->status,
];
}

public function searchableAs(): string
{
return 'matters';
}
}

Meilisearch filters are applied on every search query to enforce firm isolation:

Matter::search($query)
->where('law_firm_id', Filament::getTenant()->id)
->get();

Meilisearch Index Settings

// In a seeder or artisan command
MeiliSearch::index('matters')->updateFilterableAttributes(['law_firm_id', 'status']);
MeiliSearch::index('matters')->updateSortableAttributes(['created_at', 'title']);