When you use Laravel Scout for full-text search, you can search on all attributes of a model. But what if you want to search on specific attributes? In this post, I'll show you how to do that.
I'm assuming you are using Meilisearch in as your full-text search engine. When you use a different engine, this trick will probably not work.
First, let's look at how the model we're using is setup. In my use-case, I'm having a Document
class which contains both a searchable field name
(the name of the document) and text
(the actual text contents of the file).
To achieve, this, I've setup the following model:
app/Models/Document.php
```php
$this->id,
'name' => $this->name,
'text' => $this->text,
];
}
}
```
In my Laravel scout configuration, I marked all of these attributes as searchable:
_`config/scout.php`_```php
[
'host' => env('MEILISEARCH_HOST', 'http://localhost:7700'),
'key' => env('MEILISEARCH_KEY', null),
'index-settings' => [
Document::class => [
'filterableAttributes'=> ['id', 'name', 'text'],
'sortableAttributes' => [],
],
],
],
];
```
After configuring the search, don't forget to sync the index settings before you start adding items to the index (as [described here](https://laravel.com/docs/10.x/scout#configuring-filterable-data-for-meilisearch)):
```bash
php artisan scout:sync-index-settings
```
I want to be able to search on both fields, it's simply doing:
```php
get();
```
This will search on all attributes of the model. But what if I want to search on only the `name` attribute? You can do this by specifying the attributes you want to search on:
```php
search($query, $options);
}
)->get();
```
The function you specify in the search function allows you to [customize the search options](https://laravel.com/docs/10.x/scout#customizing-engine-searches) for this query. In this example, we used the option [`attributesToSearchOn`](https://www.meilisearch.com/docs/reference/api/search#customize-attributes-to-search-on-at-search-time) to specify the attributes we want to search on. This will cause the search to only search on the `name` attribute.
You can also use this to search on multiple attributes:
```php
search($query, $options);
}
)->get();
```
Be careful though, attributes passed to `attributesToSearchOn` must also be present in the `searchableAttributes` list.
There are many more options you can pass on to a search query in Meilisearch. The full list [can be found here](https://www.meilisearch.com/docs/reference/api/search#search-parameters).