Laravel Scout Search with FacetFilters?

6.7k views Asked by At

As you know, using where() statement after the search method uses numericFilter. I am trying to filter my search results with string filtering.

How can I use Facet Filter on search statement?

3

There are 3 answers

3
bl4cksta On BEST ANSWER

I am glad to answer my own problem. First of all, it's really hard to find any doc about the Laravel Scout already. If you want to filter your search results with string parameters. Even it's really hard to find an answer too. I checked the whole library line by line.Finally, the result made me proud.

If you want to filter your result with string parameters you need to design callback function to your search() method and inject your FacetFilters on there.Simply, Let's assume you have Posts model that you are using Algolia and you have enum typed category column on it. You can filter your blog post search results with the code below.

$post = Post::search($query, function ($algolia, $query, $options) use ($category){
    $new_options = [];
    if (!is_null($type)) {
        $new_options = ["facetFilters"=>"category_name:".$category];
    }
    return $algolia->search($query, array_merge($options,$new_options));
});
0
Deranged_23 On

An answer here helped me. I want to share my code snippets, maybe it will help someone else. My model:

public function toSearchableArray()
{
    // Define the attributes you want to make searchable in Algolia
    return [
        'title' => $this->title,
        'description' => $this->description,
        'status' => $this->status,
        'address' => $this->address,
    ];
}

public function getScoutSettings()
{
    return [
        'attributesForFaceting' => [
            'filterOnly(status)',
            'filterOnly(address)',
            // Add other attributes for faceting
        ],
    ];
}

My search query:

$query = request('query');
$address = request('address');
$posts = Post::search($query, function ($algolia, $query, $options) use($address){
            $new_options = [
                "facetFilters"=>
                    ["status:1","address:".$address],
            ];
        return $algolia->search($query, array_merge($options,$new_options));
    })->paginate(12);
0
forsvunnet On

According to the algolia documentation you can modify the search parameters like this:

$results = Product::search($q)->with(
    [
        'facets' => ['*'],
        'facetFilters' => [$facetFilters],
    ]
)->paginate(24);

https://www.algolia.com/doc/framework-integration/laravel/searching/server-side-search/